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 にするか、ビューにまったく関係なく、抽象的なコンテナーにする必要があります。
たとえば、以下の方法でクリックすると問題なく動作します (ただし、bmp を描画するには、2 番目のビューまたは BallView を変更する必要があります): 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 に答える