如何使用自定义视图在活动中绘制画布?

时间:2012-01-11 01:19:25

标签: android

如何构建此方案?

我想构建一个游戏,其中游戏板是由自定义视图控制但在ScrollView中的画布。游戏板可能比屏幕大得多,我想缩放,滚动游戏。但是,我希望游戏板外的UI的所有优点都包括Buttons,TextViews,ImageViews等。

这是我想象的应该工作的大纲代码。我错误地认为我可以同时使用它们 我自己的onDraw和期望按钮和其他小部件由Android管理?我必须实施 我所有的UI?只是试图处理一个Button(见下文)让我失望这里是XML,我希望我的自定义视图被其他UI元素包围。

我已经查看了很多其他示例和教程,但还没有看到自定义视图放置了包含UI元素的活动。

我的主要活动

// Activity 
public class gameStartActivity extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.game); 
    } 
} 

我的自定义视图

// gameView.java 
public class gameView extends View { 
  public gameView(Context context) { 
    super(context); 
    setFocusable(true); //necessary for getting the touch events 
   InitBoardView(); 
 } 
private void InitBoardView(){ 
    Button myButton = (Button)findViewById(R.id.editname); 
-----> fails at this point as myButton is null 
    myButton.setOnClickListener(doSomething); 
} 
@Override 
protected void onDraw(Canvas canvas) { 
  super.onDraw(canvas); 
 canvas.drawBitmap(face, getPaddingLeft(), getPaddingTop(),paint); 
} 
@Override 
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec) 
{ 
  super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
  final int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
  final int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
  setMeasuredDimension(xSize, ySize); 
} 

game.xml

 <ScrollView 
        android:layout_width="240dp" 
       android:layout_height="600dp" 
    <com.android.example.game.gameView 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"/> 
  </ScrollView> 
  <TextView 
     android:id="@+id/sometext 
     android:layout_width="120dp" 
     android:layout_height= "wrap_content" 
     android:layout_weight="1" 
     android:visibility="gone"/> 
  <Button 
     android:id="@+id/editname" 
     android:text="DoIt" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content"> 
 </Button> 

1 个答案:

答案 0 :(得分:0)

findViewById()仅在以下情况下才能在自定义视图中使用: - 从ViewGroup(或ViewGroup的另一个子类)扩展 - Button是自定义视图的子项

更好的方法是在Activity中找到按钮并在其中设置其监听器。您还可以在自定义视图中使用setButton(按钮视图)方法,并让活动执行以下操作:

((MyCustomView) findViewById(R.id.myCustomView)).setButton((Button) findViewById(R.id.myButton));