View的事件体系---V3.3 弹性滑动

2024-05-12 11:08

本文主要是介绍View的事件体系---V3.3 弹性滑动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 在上一节中,讲述了View滑动的三种方式,如果直接使用呢,会显得比较生硬,用户体验不太好,下面简单描述一下实现View的渐进式滑动。实现方式挺多,大致原理都是一样的,将一次大的滑动划分成若干次小的滑动,并在一个时间段内完成,下面简单介绍三种:

a. Scroller

b. Handler#postDelayed

c. Thread#Sleep

二. 使用Scroller

a. 简述一下这个的实现原理和代码

<span style="font-family:KaiTi_GB2312;">private void smoothScrollTo(int destX, int destY) {int scrollX = getScrollX();int scrollY = getScrollY();mScroller.startScroll(scrollX, scrollY, destX, destY);invalidate();}@Overridepublic void computeScroll() {if (mScroller.computeScrollOffset()) {scrollTo(mScroller.getCurrX(), mScroller.getCurrY());postInvalidate();}}</span>

上面是Scroller的典型的使用方法,当我们构造一个Scroller对象并调用它的startScroll方法时,Scroller内容其实什么也没做,只是保存了我们传递的几个参数,源码如下:

<span style="font-family:KaiTi_GB2312;">/*** Start scrolling by providing a starting point, the distance to travel,* and the duration of the scroll.* * @param startX Starting horizontal scroll offset in pixels. Positive*        numbers will scroll the content to the left.* @param startY Starting vertical scroll offset in pixels. Positive numbers*        will scroll the content up.* @param dx Horizontal distance to travel. Positive numbers will scroll the*        content to the left.* @param dy Vertical distance to travel. Positive numbers will scroll the*        content up.* @param duration Duration of the scroll in milliseconds.*/public void startScroll(int startX, int startY, int dx, int dy, int duration) {mMode = SCROLL_MODE;mFinished = false;mDuration = duration;mStartTime = AnimationUtils.currentAnimationTimeMillis();mStartX = startX;mStartY = startY;mFinalX = startX + dx;mFinalY = startY + dy;mDeltaX = dx;mDeltaY = dy;mDurationReciprocal = 1.0f / (float) mDuration;}</span>

startX startY表示滑动的起点,dx dy表示滑动的距离,duration表示的滑动的时间。startScroll之后的invalidate方法会导致view重绘,在View的onDraw方法中又会调用computeScroll方法,此方法内部调用ScrollTo方法进行滑动,同时又调用postInvalidate方法通知到View进行重绘,反复如此,完成View的弹性滑动,ps:此时完成的是View内容的滑动而非view本身的滑动。

三. 通过动画

a. 动画本身就是一种渐进的过程,通过他实现的滑动自然具有滑动效果。

b. 示例代码如下:将parent对象,在1S内右移100个像素。

<span style="font-family:KaiTi_GB2312;">ObjectAnimator.ofInt(parent, "translationX", 0, 100).setDuration(1000).start();</span>

c. 下面利用ValueAnimator结合Scroller来实现View的滑动,代码如下:

<span style="font-family:KaiTi_GB2312;">public void onAnimScroll(View view) {final int startX = 0;final int delaX = 100;ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 1).setDuration(100);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {int animatedFraction = (int) animation.getAnimatedFraction();parent.scrollTo(startX + (int) (animatedFraction * delaX), 0);}});valueAnimator.start();}</span>

四. 使用延时策略

a. 核心思想是通过发送一系列延时消息达到一种渐进式的效果,比如Handler或View的postDelayed方法,或者使用线程的sleep方法。

b. 对于postDelay方法来说,通过发送延时消息,在消息中进行View的滑动处理。

c. 对于sleep,通过while循环中不断地滑动View和sleep,就可以实现滑动效果。

d. 下面使用handler来实现View的弹性滑动,代码如下:

<span style="font-family:KaiTi_GB2312;">private static final int MESSAGE_SCROLL_TO = 3;private static final int FRAME_COUNT = 33;private static final int DELAYED_TIME = 30;private int mCount;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case MESSAGE_SCROLL_TO:mCount++;if (mCount <= FRAME_COUNT) {float fraction = mCount / (float) FRAME_COUNT;int scrollX = (int) (fraction * 100);parent.scrollTo(scrollX, 0);mHandler.sendEmptyMessageDelayed(MESSAGE_SCROLL_TO, DELAYED_TIME);}break;}}};public void onHandleScroll(View view) {mHandler.sendEmptyMessageDelayed(MESSAGE_SCROLL_TO, DELAYED_TIME);}</span>


这篇关于View的事件体系---V3.3 弹性滑动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982453

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

基于Redis有序集合实现滑动窗口限流的步骤

《基于Redis有序集合实现滑动窗口限流的步骤》滑动窗口算法是一种基于时间窗口的限流算法,通过动态地滑动窗口,可以动态调整限流的速率,Redis有序集合可以用来实现滑动窗口限流,本文介绍基于Redis... 滑动窗口算法是一种基于时间窗口的限流算法,它将时间划分为若干个固定大小的窗口,每个窗口内记录了该时间

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

BT天堂网站挂马事件后续:“大灰狼”远控木马分析及幕后真凶调查

9月初安全团队披露bt天堂网站挂马事件,该网站被利用IE神洞CVE-2014-6332挂马,如果用户没有打补丁或开启安全软件防护,电脑会自动下载执行大灰狼远控木马程序。 鉴于bt天堂电影下载网站访问量巨大,此次挂马事件受害者甚众,安全团队专门针对该木马进行严密监控,并对其幕后真凶进行了深入调查。 一、“大灰狼”的伪装 以下是10月30日一天内大灰狼远控的木马样本截图,可以看到该木马变种数量不