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
(个人理解,如果有问题和建议可以评论下)