2013-03-16 72 views
1

所以基本上我的画布上绘制了一些图像视图,但是当我尝试设置onclick监听器并尝试处理事件时,它不起作用。在画布上绘制的视图上设置onClickListener

public class DrawView extends View implements OnClickListener{ 
    Paint paint = new Paint(); 
    RectF rf = new RectF(30, 30, 80, 80); 
    BallView ball = new BallView(getContext()); 
    Bitmap bmp = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.ic_launcher); 

    public DrawView(Context context) { 
     super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     ball.setOnClickListener(this); 
     ball.draw(canvas); 
     canvas.drawBitmap(bmp, 110, 10, paint); 

    } 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     Toast.makeText(getContext(), "Mock", Toast.LENGTH_SHORT).show(); 

    } 

} 

BallView.java

public class BallView extends ImageView { 
Paint b = new Paint(); 
public BallView(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

public void onDraw(Canvas c){ 
    b.setColor(Color.BLUE); 
    c.drawCircle(50, 50, 40, b); 
} 

}

+0

*它不工作* - 而到底发生了什么?什么是'BallView'?如果它扩展View,请在'DrawView'的构造函数中移动* ball *和* bmp *的初始化。 – Luksprog 2013-03-16 08:44:57

+0

是否可点击?你有没有为它调用过setClickable(true)? – sandrstar 2013-03-16 08:48:02

+0

@Luksprog按照你的说法做了,但没有工作 – 2013-03-16 08:51:21

回答

1

基本上答案是:你的观点是不接收触摸事件,因为它不是在视图中的层次结构,所以点击回调也不会被调用。实际上,视图应该在View层次结构中(换句话说,添加到一些上层视图,最后添加到窗口)以便参与用户交互。
所以,如果你想实现覆盖你的视图的东西,那么它应该是ViewGroup或者根本不应该关联视图,并且是一些抽象容器。
例如用下面点击的工作方式没有任何问题(但您将需要第二查看或修改BallView画BMP): drawView函数:

public class DrawView extends FrameLayout implements View.OnClickListener { 
    BallView ball = new BallView(getContext()); 

    public DrawView(Context context) { 
     this(context, null, 0); 
    } 

    public DrawView(final Context context, final AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public DrawView(final Context context, final AttributeSet attrs, final int defStyle) { 
     super(context, attrs, defStyle); 
     addView(ball); 
     ball.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     Toast.makeText(getContext(), "Mock", Toast.LENGTH_SHORT).show(); 
    } 
} 

BallView类保持不变。
布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 
    <com.ruinalst.performance.tests.views.DrawView 
      android:id="@+id/oscillator" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_centerInParent="true" /> 
</RelativeLayout> 
+0

这是真的,但我想使用画布而不是布局的主要原因是我的游戏有动画和动作,可以轻松地在画布上重新绘制。虽然我是初学者,但如果我在这里错了,请纠正我。但是,谢谢@sandrstar的意见。 – 2013-03-16 10:11:35

+1

然后我会建议检查Pro Android游戏书(尝试在谷歌上搜索'Pro Android Games pdf') - 它包含一些在画布上绘制的基本示例。关于触摸处理,最好在您自己的功能中检查触摸坐标,并且不要在ClickListeners上进行中继(不过,我对游戏开发不是很有经验)。 – sandrstar 2013-03-16 10:20:03

+0

谢谢,我会检查它 – 2013-03-16 10:36:34