Android View事件体系

velocityTracker.computeCurrentVelocity(1000);

int xVelocity = (int) velocityTracker.getXVelocity();

int yVelocity = (int) velocityTracker.getYVelocity();

最后,当不需要使用它的时候,需要调用clear方法来重置并回收内存:

velocityTracker.clear();

velocityTracker.recycle();

  • GestureDetector: 手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。

GestureDetector mGestureDetector = new GestureDetector(this);

//解决长按屏幕后无法拖动的现象

mGestureDetector.setIsLongpressEnabled(false);

//接着,接管目标View的onTouchEvent方法,在待监听View的onTouchEvent方法中添

加如下实现

boolean consume = mGestureDetector.onTouchEvent(event);

return consume;

做完了上面两步,我们就可以有选择地实现OnGestureListener和OnDoubleTapListener

中的方法了.

这里有一个建议供读者参考:如果只是监听滑动相关的,建议自己

在onTouchEvent中实现,如果要监听双击这种行为的话,那么就使用GestureDetector。

  • Scroller: 使用它可以轻松实现弹性滑动.

如何使用Scroller呢?它的典型

代码是固定的,如下所示

Scroller scroller = new Scroller(mContext);

// 缓慢滚动到指定位置

private void smoothScrollTo(int destX,int destY) {

int scrollX = getScrollX();

int delta = destX -scrollX;

// 1000ms内滑向destX,效果就是慢慢滑动

mScroller.startScroll(scrollX,0,delta,0,1000);

invalidate();

}

@Override

public void computeScroll() {

if (mScroller.computeScrollOffset()) {

scrollTo(mScroller.getCurrX(),mScroller.getCurrY());

postInvalidate();

}

}

2.View的滑动

  • 通过三种方式可以实现View的滑动

  • 通过View本身提供的scrollTo/scrollBy方法来实现滑动

  • 第二种是通过动画给View施加平移效果来实现滑动

  • 第三种是通过改变View的LayoutParams使得View重新布局从而实现滑动

2.1 使用scrollTo/scrollBy
  • scrollTo和scrollBy只能改变View内容的位置而不能改变View在布局中的位置
2.2 使用动画

主要是操作View的translationX和translationY属性.

//View动画

val loadAnimation = AnimationUtils.loadAnimation(applicationContext, R.anim.animation_scroll)

btn_animation_scroll.startAnimation(loadAnimation)

//属性动画

btn_animation_scroll.animate().translationX(200f).translationY(200f).start()

2.3 LayoutParams

val layoutParams = btn_layout_params.layoutParams as? FrameLayout.LayoutParams

layoutParams?.leftMargin = layoutParams?.leftMargin?.plus(100)

//或者btn_layout_params.setLayoutParams(params)

btn_layout_params.requestLayout()

2.4 View滑动总结
  • scrollTo/scrollBy:操作简单,适合对View内容的滑动;

  • 动画:操作简单,主要适用于没有交互的View和实现复杂的动画效果;

  • 改变布局参数:操作稍微复杂,适用于有交互的View。

3. View的弹性滑动

3.1 使用Scroller

原理: 调用startScroll()方法,其实里面并没有进行滑动,而是因为紧接着调用的invalidate(),导致View重绘.在View的draw方法里面又会去调用computeScroll方法.computeScroll是需要自己去实现的,computeScroll会去向Scroller获取当前的scrollX和scrollY(Scroller内部是根据时间去计算当前的scrollX和scrollY的值),然后又调用scrollTo,又invalidate(),又要重绘,如此反复.实现了弹性滑动.

View不断重绘,不断通过时间流逝来计算新的滑动位置,小幅度的滑动,最终形成了弹性滑动.

3.2 通过动画
  • 动画天生就自带弹性的属性,哈哈,自然没啥问题

  • 说点利用动画来实现一些动画不能实现的效果->动画可以不作用于任何View上,而是通过它在具体的时间内完成了整个动画过程,我们可以获取这个值,从而干一些操作.比如通过ValueAnimator在1000ms内从0-100,然后我们可以根据这个来画一个进度条,在1000ms内到达100%.

模仿Scroller来实现View的弹性滑动

final int startX = 0;

final int deltaX = 100;

ValueAnimator animator = ValueAnimator.ofInt(0,1).setDuration(1000);

animator.addUpdateListener(new AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animator) {

float fraction = animator.getAnimatedFraction();

mButton1.scrollTo(startX + (int) (deltaX * fraction),0);

}

});

animator.start();

3.3 Handler.postDelayed

不断发生延时消息,不断scrollTo.发送消息无法精确地定时,系统的消息调度是需要时间的,并且所需时间不定.

3.4 Thread#sleep

4.事件分发

主要是3个方法: dispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent()

  • 从Activity的dispatchTouchEvent开始,然后传到PhoneWindow的superDispatchTouchEvent(),再传入DecorView的superDispatchTouchEvent(),即ViewGroup的dispatchTouchEvent.

  • 在ViewGroup的dispatchTouchEvent()中,先调用onInterceptTouchEvent(),判断是否需要拦截事件.默认是不拦截的,继续向子View传递事件,找到被点击的响应子View控件,调用该View的dispatchTouchEvent.至此,完成了从ViewGroup向子View事件传递的过程,子View也可能是ViewGroup,但是过程是一样的,类似的递归下去. 当ViewGroup拦截了事件时,自己处理事件,调用自身的onTouch()->onTouchEvent()->performClick()->onClick()

  • 当事件来到View这里,调用dispatchTouchEvent,调用View.onTouch(),如果这个方法返回true,那么事件已经被消费了,不用再继续往下传递了.如果返回false,那么消费事件,调用onTouchEvent().调用performClick(),调用onClick()

三者关系伪代码

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

img-H214jW1B-1714937384404)]

[外链图片转存中…(img-FT5ehPHt-1714937384404)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值