2

所以基本上我在画布上绘制了一些图像视图,但是当我尝试设置 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);
}

}

4

1 回答 1

1

基本上答案是:您的视图没有接收到触摸事件,因为它不在视图层次结构中,所以也不会调用单击回调。实际上,视图应该在视图层次结构中(换句话说,添加到某些上层视图,最后添加到窗口)才能参与用户交互。
所以,如果你想实现覆盖你的视图的东西,那么它应该是 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>
于 2013-03-16T09:58:01.663 回答