Android studio事件处理机制
一.基于监听机制的事件处理机制
- 监听的三要素:
Event Source 事件源
Event 事件
Event Listener 事件监听器
2.实现监听事件的方法
通过内部类实现
通过匿名内部类实现
通过事件源所在类实现
3.监听事件实现的方法
(1)用内部类来实现
bt.setOnClickListener(new Ok());
}
class Ok implements View.OnClickListener{
@Override
public void onClick(View v) {
}
(2)用匿名内部类来实现
主体类 implements View.onClickListener{
重写监听方法
public void onClick(View v) {
}
}
(4)通过外部类实现
主类
事件源.setOnclickListener(new 外部类名(this.当前Activity)
外部类 implements View.OnClickListener{
Private Activity mActivity;
public 外部类名(Activity activity){
this.mactivity=activity;
}
public void onClick(View v) {}}
(5)通过布局来间接实现
<Button
android:OnClick=”要实现的方法名(show)”;
></Button>
//然后在Activity里 写一个与布局中OnClick一样名字的方法
当按下按钮时会执行该方法
public void show(View v){
//当按下按钮时会实现该方法
}
注意:给同一事件源添加多个同种类型的监听器,系统只会实现最后添加的事件监听器
我理解,有可能是将之前先注册的事件监听,被后面的覆盖了。
二.基于回调事件的处理机制
- 回调机制与监听机制的区别
测试回调机制与监听机制的区别:
创建一个Activity :
public class DataMoveActivity extends AppCompatActivity {
Button bt;
MyButton btt;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_move_data);
bt=(Mybutton)findViewById(R.id.huidiao);
btt.setOnTouchListener(new View.OnTouchListener(){ //
@Override
public boolean onTouch(View v, MotionEvent event) {
Switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.d(“监听机制”,“onTouch”);
break;
}
return false;
}
}
);
}
@Override
//在Activity重写该方法用于测试
public boolean onTouchEvent(MotionEvent event) { //
Switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
Log.d(“Activity”,“--onTouchEvent--”);
break;
}
return false;
}
}
}
创建一Mybutton 继承AppcompatButton
自己创建一个按钮回调机制
public class MyButton extends AppCompatButton {
public MyButton(Context mcontext){
super(mcontext);
}
@Override
public boolean onTouchEvent(MotionEvent event) { //重写Touch,里面有多种处理参数
switch (event.getAction()){//监听按钮所做事的参数,返回到这里
case MotionEvent.ACTION_DOWN: //按下按钮时所要做的事
log.d(“Mybutton”,”--onTouch---”);
}
return false; //表示该事件处理了,但是继续向外传播
//当返回值为true ,表示该事件处理了,该事件到此为止处理完了
}
}
当按下按钮发现监听机制会优先出现在日志中
说明监听机制会优先注册
- 基于回调的事件传播
关于return false/true;
return false; //表示该事件处理了,还是继续向外传播
当retuen true;//表示该事件处理了,该事件就到此结束
若后面还出现onTouch()重写方法,将不会在运行
比如:回到上面代码
1.在Mybutton类的onTouch 设置返回true
在Activity 重写的onTouch方没日志
监听机制的的重写onTouch有日志
2.对监听机制的onTouch 设置return true
MyButton类中重写onTouchEvent没有日志
说明监听机制优先于回调机制
MotionEvent 手势事件参数
ACTION_DOWN 手指按下的操作
ACTION_MOVE 手指滑动
ACTION_UP 手指离开屏幕的动作
还等等参数