各位看官们大家好,上一回中咱们说的例子是"监听网络状态",本章回介绍的例子是" 事件拦截之内部拦截"。闲话休提,言归正转,让我们一起Talk Android吧!
概念介绍
我们在前面章回中介绍了View中的事件分发机制,不过没有介绍具体的示例,本章回将介绍具体的拦截方法,常用的拦截方法有两种:内部拦截和外部拦截。
程序中的画面都是由组件和布局组成的,组件又可以细分为View
和ViewGroup
。View通常位于ViewGroup中,如果在View中拦截事件就叫作内部拦截,如果在ViewGroup中拦截事件就叫作外部拦截。本章回中先介绍内部拦截方法。
整体思路
在View中重写拦截事件的方法,并且不去调用父View的同类方法。常用的事件方法为onTouchEvent
()方法,我们可以在该方法中依据某种条件对事件进行拦截,拦截的方法就是返回true,并且不去调用父View的同类方法。这么做就是告诉父View,我已经对用户的事件做出处理,你不需要再重复处理了。
示例代码
介绍完整体思路后,我们通过文字结合代码的方式来给大家做演示:
public class EventView extends androidx.appcompat.widget.AppCompatTextView {
private static final String TAG = "EventView";
//构造方法只列出一个,其它的省略不写
public EventView(@NonNull Context context) {
super(context);
}
//内部拦截法:返回true同时不去调用父类相同的方法
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean result = false;
if(event.getRawY() > 1364 && event.getRawY() <1868) {
result = true;
return result;
}
Log.d(TAG, "onTouchEvent: x = "+event.getRawX()+" y= "+event.getRawY());
super.onTouchEvent(event);
return result;
}
}
在上面的代码中我们自定义了一个TextView的子类,在该类中通过判断Touch事件是否处于某个区间中,如果事件处于该区间那么直接返回true,并且不去调用父类的相同方法;如果事件不处于该区间那么调用父类的相同方法去处理,同时返回false。代码中我们把区间直接写成了数字,它表示屏幕上的某个坐标值,大家可以自行修改数值来限制不同的区间。不过在实际项目中不建议这么操作。
经验总结
内部拦截的优点是实现方便,缺点就是只能拦截位于view自身所在区域的事件,如果想拦截view自身区域以外事件,就需要使用外部拦截,我们在下一章回中介绍。
看官们,关于"事件拦截之内部拦截"的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!