android-studio - Android OnTouchEvent()什么时候该 return super.onTouchEvent(event)?
PHP中文网
PHP中文网 2017-04-17 17:47:16
0
2
573

自定义View在构造器初始化时设置了一个OnClickListener的监听器,但是如果在OnTouchEvent() 中返回true就没有办法回调onClick()?


// 一个简单的自定义View,让View跟随手指滑动,同时点击时弹出Toast
public class DragView2 extends View implements View.OnClickListener {
    private static final String TAG = "DragView";

    private float mLastX;
    private float mLastY;

    public DragView2(Context context) {
        this(context, null);
    }

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

    public DragView2(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setBackgroundColor(getResources().getColor(R.color.colorPrimary));
        Log.d(TAG, "DragView2: ");
        setOnClickListener(this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int offsetX = (int) (event.getX() - mLastX);
        int offsetY = (int) (event.getY() - mLastY);
        switch (event.getAction()) {

            case MotionEvent.ACTION_MOVE:
                //  使View本身开始移动
                offsetLeftAndRight(offsetX);
                offsetTopAndBottom(offsetY);
                break;
            case MotionEvent.ACTION_UP:
                mLastX = event.getX();
                mLastY = event.getY();
                break;
        }
        // return true 无法触发点击事件;return false时无法发生滑动 ; 
        // return super.onTouchEvent(event);才能触发这两个事件
        // 为什么?
        return super.onTouchEvent(event);
    }


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

返回true 不是表示此触摸事件已被消化,为何只有 return super.onTouchEvent(event); ,才能同时保留滑动和点击事件?

PHP中文网
PHP中文网

认证高级PHP讲师

répondre à tous(2)
黄舟

OnClickListener.onClick() est rappelé dans la méthode native View.onTouchEvent() Si vous réécrivez cette méthode vous-même, et si vous n'appelez pas super.onTouchEvent(event), bien sûr la méthode onClick() ne sera pas rappelée. >

左手右手慢动作

La méthode onClick est appelée dans la méthode onTouchEvent. Vous ne comprenez peut-être pas la signification de la substitution. N'utilisez-vous pas super pour appeler la méthode onTouchEvent de la classe parent ? onClick ne sera pas exécuté.
De plus, vous ne comprenez peut-être pas le mécanisme de distribution d'événements. Je ne crois pas qu'un programmeur qui ne comprend pas la distribution d'événements puisse personnaliser View. Concernant la diffusion des événements, vous pouvez vous référer aux articles suivants : http://m.blog.csdn.net/articl...

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal