android - 多个 OnTouchListener

标签 android android-view ontouchlistener

我制作了一个自定义 View ,它具有 OnTouchEvent(MotionEvent event) 方法。这使得 View 在按下时改变颜色。

我还为我的 Activity 实现了一个 OnTouchListener,然后通过 view.setOnTouchListener(this); 向它注册 View 这带来了一个问题,这意味着只有 Activity 的 OnTouchListener 有效。

有解决办法吗?

这是我在尝试评论中给出的链接后的代码。抱歉!:

我的自定义 View :

public class DotView extends View implements OnTouchListener {

    int RADIUS = 30;
    int prevRADIUS;

    private Paint paint = new Paint();

    float mTranslateX;
    float mTranslateY;

    int dotX, dotY, color;

    private Activity context = null;

    public void ReservedCanvas(Activity context) {
        super(context); 
        this.context = context;

        this.paint = new Paint();

        setFocusable(true);
        setFocusableInTouchMode(true);

        this.setOnTouchListener(this);

        paint.setAntiAlias(true);
    }

    public DotView(Context context, AttributeSet attrs) {
        super(context, attrs);

        paint.setAntiAlias(true);
        paint.setStrokeWidth(6f);
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setColor(Color.BLACK);

    }

    public void setColor(int color) {
        paint.setColor(color);
        invalidate();
    }

    public int getColor() {
        return paint.getColor();
    }

    public void setRadius(int radius) {
        RADIUS = radius;
        invalidate();
    }

    public int getRadius() {
        return RADIUS;
    }

    public void onDraw(Canvas canvas) {

        super.onDraw(canvas);
        canvas.save();
        canvas.translate(mTranslateX, mTranslateY);
        canvas.drawCircle(0, 0, RADIUS, paint);
        canvas.restore();
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        final int dia = RADIUS * 4; 
        int w = resolveSize(dia, widthMeasureSpec);
        int h = resolveSize(dia, heightMeasureSpec);
        setMeasuredDimension(w, h);
        float radius = Math.min(w, h) / 2F;
        mTranslateX = radius;
        mTranslateY = radius;
    }


    private void setOnTouchFeedback(Boolean bool) {
        // TODO Check this works

        if (bool == true) {

        int rad = getRadius();
        prevRADIUS = rad;
        float touchedRad = (float) (rad * 1.4);
        int rounded = Math.round(touchedRad);
        setRadius(rounded);
        }


    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction() & MotionEvent.ACTION_MASK;

        switch (action) {
        case MotionEvent.ACTION_DOWN: {
            this.pointerPressed(event);
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            this.pointerDragged(event);
            break;
        }
        case MotionEvent.ACTION_UP: {
            this.pointerReleased();
            break;
        }
        }

        return true;
    }

    protected void pointerPressed(MotionEvent event) {
        // you can save touch point here!

        setOnTouchFeedback(true);
    }

    protected void pointerDragged(MotionEvent event) {
        // for get x ==> eveevent.getX()
        // for get y ==> eveevent.getY()

        this.repaint();
    }

    protected void pointerReleased() {
    }

    public void repaint() {
        this.invalidate();
    }
}

最佳答案

来自 onTouchListener 的文档 - http://developer.android.com/reference/android/view/View.OnTouchListener.html我认为 Listener 需要在显示 toast 后返回 false,以便调用 View 的 onTouchMethod。

你试过吗?

关于android - 多个 OnTouchListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19476240/

相关文章:

Android View vs SurfaceView vs GLSurfaceView for 2D drawing app with Zoomable User Interface

android - 如何从另一个应用程序向应用程序添加 View

android - android View 转换动画列表?

Android 代码在两个或多个不同的自定义 View 上应用相同的双击触摸监听器

android - tabview 中的 webview 出现异常

java - android:ime 渲染问题

android - 哪里可以找到安卓崩溃历史

android - 使用触摸监听器围绕其中心旋转 android 布局 View

java - 添加触摸事件监听器到android Canvas

javascript - -webkit-溢出-滚动 : auto; not working on touch devices