在 Android 中向自定义视图添加按钮
我想为此自定义视图添加一个按钮。 该视图是通过
setContentView(mDrawView);
我尝试使用
mDrawView.addView(mButton);
显示的,但我的视图没有实现 addView() 函数。 有什么办法可以添加按钮吗?这是我的绘图视图,
package com.android.connect4;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class DrawView extends View implements OnTouchListener {
private static final int BOX_SIZE = 35;
private Paint mPaint;
private int mRow;
private int mCol;
private int mHeight;
private GameModel mGameModel;
public DrawView(Context context, int vHeight, int vWidth, GameModel vGameModel) {
super(context);
// TODO Auto-generated constructor stub
setFocusable(true);
setFocusableInTouchMode(true);
mPaint = new Paint();
mGameModel = vGameModel;
mPaint.setAntiAlias(true);
mHeight = vHeight;
mRow = GameModel.ROWS;
mCol = GameModel.COLUMNS;
init();
setOnTouchListener(this);
mGameModel.attach(this);
}
private void init() {
// TODO Auto-generated method stub
mGameModel.UserFunction('I');
}
@Override
public void onDraw(Canvas canvas) {
for(int vCount = mRow-1; vCount>=0; vCount--)
for(int hCount = 0; hCount<mCol; hCount++) {
switch(mGameModel.getCellState(vCount, hCount)) {
case GameModel.RED:
mPaint.setColor(Color.RED);
canvas.drawCircle(hCount*BOX_SIZE+BOX_SIZE/2, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+BOX_SIZE/2, BOX_SIZE/2-5, mPaint);
break;
case GameModel.BLUE:
mPaint.setColor(Color.BLUE);
canvas.drawRect(hCount*BOX_SIZE+5, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+5, hCount*BOX_SIZE+BOX_SIZE-5, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+BOX_SIZE-5, mPaint);
break;
case GameModel.EMPTY_CELL:
mPaint.setColor(Color.WHITE);
canvas.drawRect(hCount*BOX_SIZE+5, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+5, hCount*BOX_SIZE+BOX_SIZE-5, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+BOX_SIZE-5, mPaint);
default:
break;
}
}
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(20);
String vShow = "";
switch(mGameModel.getWinner()) {
case GameModel.RED:
vShow = "Red Wins!";
break;
case GameModel.BLUE:
vShow = "Blue Wins!";
break;
default:
switch(mGameModel.getCurrentPlayer()) {
case GameModel.RED:
vShow = "Current Player is Red";
break;
case GameModel.BLUE:
vShow = "Current Player is Blue";
break;
default:
break;
}
}
canvas.drawText(vShow, BOX_SIZE/2, (mRow+1)*BOX_SIZE, mPaint);
}
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public DrawView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public boolean onTouch(View arg0, MotionEvent arg1) {
if(arg1.getActionMasked() == MotionEvent.ACTION_DOWN) {
char vChar = (char) ((arg1.getRawX()/BOX_SIZE)+65);
mGameModel.UserFunction(vChar);
Log.i("DrawView", (int)arg1.getRawX()/BOX_SIZE+","+(int)(mHeight-arg1.getRawY())/BOX_SIZE);
// Log.i("DrawView Char", Character.toString((char) (arg1.getRawX()/BOX_SIZE+65)));
}
return true;
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
// TODO Auto-generated method stub
}
}
}
我也不知道如何将此视图附加到 xml。使用 XML 代替 setContentView(mDrawView); 更好吗? ?
I want to add a button for this custom view.
This view is displayed via
setContentView(mDrawView);
I tried using
mDrawView.addView(mButton);
but my view does not implement the addView() function.
Is there any way to add the button? here is my drawview
package com.android.connect4;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class DrawView extends View implements OnTouchListener {
private static final int BOX_SIZE = 35;
private Paint mPaint;
private int mRow;
private int mCol;
private int mHeight;
private GameModel mGameModel;
public DrawView(Context context, int vHeight, int vWidth, GameModel vGameModel) {
super(context);
// TODO Auto-generated constructor stub
setFocusable(true);
setFocusableInTouchMode(true);
mPaint = new Paint();
mGameModel = vGameModel;
mPaint.setAntiAlias(true);
mHeight = vHeight;
mRow = GameModel.ROWS;
mCol = GameModel.COLUMNS;
init();
setOnTouchListener(this);
mGameModel.attach(this);
}
private void init() {
// TODO Auto-generated method stub
mGameModel.UserFunction('I');
}
@Override
public void onDraw(Canvas canvas) {
for(int vCount = mRow-1; vCount>=0; vCount--)
for(int hCount = 0; hCount<mCol; hCount++) {
switch(mGameModel.getCellState(vCount, hCount)) {
case GameModel.RED:
mPaint.setColor(Color.RED);
canvas.drawCircle(hCount*BOX_SIZE+BOX_SIZE/2, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+BOX_SIZE/2, BOX_SIZE/2-5, mPaint);
break;
case GameModel.BLUE:
mPaint.setColor(Color.BLUE);
canvas.drawRect(hCount*BOX_SIZE+5, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+5, hCount*BOX_SIZE+BOX_SIZE-5, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+BOX_SIZE-5, mPaint);
break;
case GameModel.EMPTY_CELL:
mPaint.setColor(Color.WHITE);
canvas.drawRect(hCount*BOX_SIZE+5, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+5, hCount*BOX_SIZE+BOX_SIZE-5, mHeight-3*BOX_SIZE-vCount*BOX_SIZE+BOX_SIZE-5, mPaint);
default:
break;
}
}
mPaint.setColor(Color.WHITE);
mPaint.setTextSize(20);
String vShow = "";
switch(mGameModel.getWinner()) {
case GameModel.RED:
vShow = "Red Wins!";
break;
case GameModel.BLUE:
vShow = "Blue Wins!";
break;
default:
switch(mGameModel.getCurrentPlayer()) {
case GameModel.RED:
vShow = "Current Player is Red";
break;
case GameModel.BLUE:
vShow = "Current Player is Blue";
break;
default:
break;
}
}
canvas.drawText(vShow, BOX_SIZE/2, (mRow+1)*BOX_SIZE, mPaint);
}
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public DrawView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public boolean onTouch(View arg0, MotionEvent arg1) {
if(arg1.getActionMasked() == MotionEvent.ACTION_DOWN) {
char vChar = (char) ((arg1.getRawX()/BOX_SIZE)+65);
mGameModel.UserFunction(vChar);
Log.i("DrawView", (int)arg1.getRawX()/BOX_SIZE+","+(int)(mHeight-arg1.getRawY())/BOX_SIZE);
// Log.i("DrawView Char", Character.toString((char) (arg1.getRawX()/BOX_SIZE+65)));
}
return true;
}
@Override
protected void onLayout(boolean arg0, int arg1, int arg2, int arg3, int arg4) {
// TODO Auto-generated method stub
}
}
}
I don't know how to attach this view to an xml either. Is it better to use XML instead of setContentView(mDrawView); ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您只能将视图添加到 ViewGroup。因此需要扩展一个视图组,如 LinearLayout、RelativeLayout 或 ViewGroup。然后您就可以向其添加按钮。
You can only add views to ViewGroup. So will need to extend a view group like LinearLayout,RelativeLayout or ViewGroup. Then you will be able to add buttons to it.