2012-02-09 109 views
1

我想为此自定义视图添加一个按钮。 这种观点是通过将按钮添加到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)会更好吗? ?

回答

2

您只能将视图添加到ViewGroup。因此需要扩展一个视图组,如LinearLayout,RelativeLayout或ViewGroup。然后你将能够添加按钮。

+0

我真的需要扩展其中一个布局类吗?我可以只是实例化它们中的任何一个并在里面添加这个视图+一个按钮? – 2012-02-09 05:29:03

+0

我通过实例化LinearLayout并在里面添加按钮来弄清楚自己。多谢,伙计! – 2012-02-09 06:26:45

相关问题