Android--MotionEvent:触屏事件

MotionEvent:触屏事件
int ACTION_DOWN=0:代表down
int ACTION_MOVE=2:代表move
int ACTION_UP=1:代表up
getAction():得到事件类型值
getX():得到事件发生的x轴坐标(相对于当前视图)
getRawX():得到事件发生的x轴坐标(相对于屏幕左顶点)

Activity
    boolean dispatchTouchEvent(MotionEvent event):分发事件

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

MainActivity:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyImageVIew imageVIew = (MyImageVIew) findViewById(R.id.iv_main);

        imageVIew.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Log.e("TAG","ImageView activity 分发"+event.getAction());
                return false;
            }
        });
    }
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        Log.i("TAG","activity 分发"+ev.getAction());
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.i("TAG","activity 监听"+event.getAction());
        return super.onTouchEvent(event);
    }
}

main布局:

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.example.myapplication.MyImageVIew
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:src="@android:color/background_dark"
            android:id="@+id/iv_main"/>
    </LinearLayout>

ImageView类:

import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageView;

import androidx.annotation.Nullable;

@SuppressLint("AppCompatCustomView")
public class MyImageVIew extends ImageView {

    public MyImageVIew(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        Log.e("TAG","MyImageVIew");
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        Log.e("TAG","ImageView分发"+event.getAction());
        return super.dispatchTouchEvent(event);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        Log.e("TAG","ImageView监听"+event.getAction());
        return super.onTouchEvent(event);
    }
}

个人总结:
我们有时想监听ImageView或者其他View对象的各种状态吧(我也不知道说得对不对)
我们就要有定义一个类去继承这个view,注意:是继承。之后我们将这个类的全类名,放到对应的视图里面。
继承的类,我们需要重写的方法在上面代码可见。其中 AttributeSet attrs代表的是在对应布局文件中的其它属性,比如:width,height这些。

之后的监听,我们需要理解—分发事件,—消费,—处理。三个名词
也就是说:
当我们触摸屏幕时,首先最先接收到的是activity,之后它就分发事件(dispatchTouchEvent)给自己的子View,子View又分发给自己的子View…直到没了子VIew。
之后就是,监听,个人理解的监听就是消费。如果消费得起,就交给子View消费。如果不行就传给自己得上层,直到最后,如果各个都消费不起,就交给activity消费。

具体一点得话就是:当我们触摸ImageVIew时,如果它返回得是false就代表消费不起,就传给activity消费。如果放回true,就代表可以消费。就由ImageView消费。
如果一个View连点击(down 0 )都消费不起,那么移动和离开屏幕的操作也不会请求这个View

(个人理解,如果有问题和建议可以评论下)

发布了117 篇原创文章 · 获赞 1 · 访问量 7056

猜你喜欢

转载自blog.csdn.net/qq_43616001/article/details/104420372