在画布上绘制的视图上设置onClickListener

时间:2013-03-16 08:26:11

标签: android canvas android-imageview onclicklistener

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

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);
}

}

1 个答案:

答案 0 :(得分: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>