2024年最新Android 事件分发机制(1),oppoAndroid面试

最后

给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了

image

image

image

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

第二个条件是判断当前点击的空间是否为enable,但由于基本View都是enable的,所以这个条件基本返回true;

第三个条件表示我们调用setOnTouchListener时必须覆盖onTouch()的返回值。

可见onTouch()方法的优先级高于onTouchEvent()。

  • onTouchEvent()

可以看到只要View的CLICKABLE和LONG_CLICKABLE有一个为true,那么onTouchEvent()就会返回true消耗这个事件。我们通常用setOnClickListener和setOnLongClickListener来设置被点击和长按。

接着看下performClick()方法:

可以看到,如果MOnClickListener不为空,那么它的onClick()方法就会调用。

  • onInterceptTouchEvent()

view绘制流程和原理:

窗口和view和activity的区别:https://www.jianshu.com/p/28d396a0f05f

GestureDetector:在onTouchEvent(MotionEvent event) 中回调scaleGestureDetector.onTouchEvent(event),判断滑动还是缩放区分手指就好

SurfaceView:

demo3:使用的ViewPager,并设置PagerAdapter。

demo5:

ScaleGestureDetector:缩放

mGesture = new ScaleGestureDetector(mContext, new ScaleGestureDetector.OnScaleGestureListener() {

//随着手势操作,回调的方法,

@Override

public boolean onScale(ScaleGestureDetector detector) {

float previousSpan = detector.getPreviousSpan();//缩放发生前的两点距离

float currentSpan = detector.getCurrentSpan();//缩放发生时的两点距离

if (previousSpan < currentSpan)//放大

{

mZoomScale = mZoomScale + (currentSpan - previousSpan) / previousSpan;

} else {

mZoomScale = mZoomScale - (previousSpan - currentSpan) / previousSpan;

}

//确保放大最多为2倍,最少不能小于原图

if (mZoomScale > 2) {

mZoomScale = 2;

} else if (mZoomScale < 1) {

mZoomScale = 1;

}

setScaleX(mZoomScale);

setScaleY(mZoomScale);

//这里调用的是本自定义View的方法,是对本自定义view进行的缩放

/*在这里调用getChildView(index)的进行缩放,虽然控件显示大小改变了,

但是在ViewDragHelper的回调方法中获得的View child的getWidth()和getHeigit()是原来的大小,不会发生改变*/

return true;

}

@Override

public boolean onScaleBegin(ScaleGestureDetector detector) {

return true;

}

@Override

public void onScaleEnd(ScaleGestureDetector detector) {

}

});

ViewDragHelper控制子view的移动:

mViewDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() {

@Override

public boolean tryCaptureView(View child, int pointerId) {

//这里的return true表示自view可以滑动,false表示不处理滑动

return true;

}

/这里是控制子view左右滑动的回调,child为本自定义view的子控件,left表示意图从手指操作子view从左边界滑动的距离,大于0表示向右移动,小于0表示向左移动,是从手指的移动测出的理论值。方法的返回值表示实际上控件移动的距离,可以用返回值控制边界/

@Override

public int clampViewPositionHorizontal(View child, int left, int dx) {

//放大后控件的宽度-主布局的宽度 因为View chlid的控件使用的是match_parent,所以直接用父布局的宽取值

if (left < (getWidth() - getWidth() * mZoomScale) / 2) {

return (int) ((getWidth() - getWidth() * mZoomScale) / 2);

}

if (left > ((mZoomScale * getWidth() - getWidth()) / 2)) {

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 14
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 事件分发机制是指在用户与Android设备进行交互时,Android系统如何接收并分发这些事件的过程。事件分发机制包括三个阶段:分发、拦截和处理。 1. 分发阶段:事件Android设备的底层硬件驱动程序开始,通过InputEvent分发给View层。在View层中,事件分为两类:MotionEvent和KeyEvent。MotionEvent表示触摸事件,包括按下、移动、抬起等操作;KeyEvent表示按键事件,包括按下和抬起。 2. 拦截阶段:在事件分发到View层后,会从最上层的View开始进行事件分发,直到有View对事件进行拦截。如果有View对事件进行了拦截,则事件不会继续向下分发,而是由该View进行处理。View是否拦截事件的判断由onInterceptTouchEvent方法完成,如果该方法返回true则表示拦截事件。 3. 处理阶段:如果事件没有被拦截,则会被传递到最底层的View进行处理。在View中,事件处理由onTouchEvent方法完成。如果该方法返回true,则表示事件已经被处理,不再需要继续向下分发;如果返回false,则会继续向上分发直到有View对事件进行拦截。 Android事件分发机制的流程如下: ![image.png](attachment:image.png) 需要注意的是,事件分发机制是一个逆向分发的过程,即从底层向上分发,而不是从顶层向下分发。这是因为底层的View需要先处理事件,如果底层的View不拦截事件事件才能向上分发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值