2012-02-09 147 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

相關問題