当前位置:首页 > 民俗文化

velocitytracker 让控件如此丝滑Scroller和VelocityTracker的API讲解与实战——Android高级UI

今天的免费课程:“安卓通用控件和布局”

课程大纲

课程今天才免费,24小时后恢复原价

如果想直接学习课程,扫码学习

一、前言

在自定义控件中,难免会遇到滑动场景。但是Canvas提供的scrollTo和scrollBy方法只能达到移动的效果。为了实现真正的滑动,我们需要两个基本的工具,Scroller和VelocityTracker,我们今天分享这两个工具。照例先去实战图,然后分享。

惯性滑动直方图

但是(敲黑板!!值得注意的是,屏幕外的栏目其实对用户是不可见的,我们不需要花这部分资源去画。我们可以通过下面的代码来判断列是否在可见区域,可见区域的范围是屏幕的宽度左右扩展一列间隔mBarInterval。这样做的原因是,当所描述的文本或小红点正好在屏幕的左边框或右边框上时,就不会出现未绘制的情况。

/**

*是否在可视范围内

*

* @paramx

* @returntrue:在可见范围内;真:不在可见的假

*/

privatebooleanisivisiblearea(float x){

float dx = x-Getscrollx;

return-mBarInterval & lt;= dx &。& ampdx <。= mViewWidth+mBarInterval;

至此,图像绘制问题解决,代码没有粘贴出去,童鞋可以进入门户,按照思路走了。

还有一个问题,就是如何让图片随手指移动,需要重写onTouchEvent方法,计算手指的水平移动距离,然后通过scrollBy方法移动内容。

值得一提的是,scrollTo和scrollBy方法都是针对移动内容或画布的。

至于如何让小红点移动,使用ValueAnimator从零增加到一,从而不断逼近目标坐标。

3.惯性怎么滑

上一节结束后,我们已经知道如何绘制这个简单但常见的柱形图,但美中不足的是没有抛尾效果。因此,我们需要借用VelocityTracker来获取手指当前的滑动速度,但这里需要注意的是,最大和最小速度应该是有限制的。因为速度太快太慢,会导致交互效果不佳。获取如下代码

mmaximumVelocity = ViewConfiguration . get(context)。getScaledMaximumFlingVelocity

mmimumvelocity = view configuration . get(context)。getScaledMinimumFlingVelocity

然后按照我们在VelocityTracker总结中的套路,得到手指离开屏幕时的水平速度。下面是只保留VelocityTracker相关代码

/**

*控制屏幕不跨越边界

*

* @param事件

* @返回

*/

@覆盖

public boolean OnTouchEvent(MotionEvent事件){

//省略无关的代码...

if(mVelocityTracker == null) {

mvelocity tracker = velocity tracker . get;

}

mVelocityTracker.addMovement(事件);

if(MotionEvent。ACTION_DOWN == event.getAction) {

//省略无关的代码...

} elseif(MotionEvent。ACTION_MOVE == event.getAction) {

//省略无关的代码...

} elseif(MotionEvent。ACTION_UP == event.getAction) {

//计算当前速度,1000表示每秒像素等。

mvelocity tracker . computecurentvelocity(1000,mmaxiumvelocity);

//获取横向速度

intvelocity x =(int)mvelocity tracker . getxvelocity;

//速度应大于滑动前的最小速度

if(Math.abs(velocityX)>;mmimumvelocity){

//省略无关的代码...

}

if(mVelocityTracker!= null) {

mVelocityTracker.recycle

mVelocityTracker = null

}

}

returnsuper.onTouchEvent(事件);

}

在获得水平速度后,我们需要执行真正的投掷效果。用一个线程连续移动画布,达到滚动的效果(RecycleView中的滚动也是通过线程实现的,感兴趣的同学可以输入RecycleView的源代码来查看。线程类的名字是ViewFlinger)。

/**

*滚丝

*/

private class flinggrunnableimplementsrunnable {

privateScroller mScroller

privateintmInitX

privateintmMinX

privateintmMaxX

privateintmVelocityX

FlingRunnable(上下文上下文){

this . mscroller = NewsCroller(context,null,false);

}

void start(IntintX,

intvelocityX,

intminX,

intmaxX) {

this.mInitX = initX

this . mvelocity x = velocity x;

this.mMinX = minX

this.mMaxX = maxX

//先停止最后一个滚动

if(!mScroller.isFinished) {

mScroller.abortAnimation

}

//开始放纵

mScroller.fling(initX,0,velocityX,

0,0,maxX,0,0);

post(this);

}

@覆盖

publicvoidrun{

//如果完成了,就不会再进行了

if(!mscroller . computescroloffset){

返回;

}

//计算偏移量

intcurrX = mScroller.getCurrX

int diffx = Minitx-CurX;

//用于记录是否超出边界。如果超出边界,即使滚动没有完成,也不会进行回调。

booleanisEnd = false

if(DifX!= 0) {

//超出右边界,进行修正

if(GetscrollX+DifX > 1;= mCanvasWidth - mViewWidth) {

diffX =(int)(mCanvasWidth-mViewWidth-getScrollX);

isEnd = true

}

//超出左边界,改正

if(GetscrollX & lt;= 0) {

diffX =-getScrollX;

isEnd = true

}

if(!mScroller.isFinished) {

scrollBy(DifX,0);

}

mInitX = currX

}

if(!isEnd) {

post(this);

}

}

/**

*停止

*/

空隙停止{

if(!mScroller.isFinished) {

mScroller.abortAnimation

}

}

}

最后使用这个线程,使用的地方主要有两点:一个手指按下时(即MotionEvent。动作向下)和手指抬起时(即运动事件)。ACTION_UP),删除无关代码,剩下的代码如下。

public boolean OnTouchEvent(MotionEvent事件){

//省略无关的代码...

if(MotionEvent。ACTION_DOWN == event.getAction) {

//省略无关的代码...

mFling.stop

} elseif(MotionEvent。ACTION_MOVE == event.getAction) {

//省略无关的代码...

} elseif(MotionEvent。ACTION_UP == event.getAction) {

//省略无关的代码...

//速度应大于滑动前的最小速度

if(Math.abs(velocityX)>;mmimumvelocity){

intinitX = getScrollX

int maxx =(int)(mCanvasWidth-mViewWidth);

if(MaxX & gt;0) {

mFling.start(initX,velocityX,initX,maxX);

}

}

//省略无关的代码...

}

returnsuper.onTouchEvent(事件);

}

当我们移动事件时。action _ down,我们需要停止滚动,以便在手指接触的地方立即停止。

当我们移动事件时。action _ up,我们需要计算fling方法所需的最小值和最大值。根据我们在线程中的计算方法,我们的最小值和初始值是getScrollX,最大值是mCanvasWidth-mViewWidth。

课程设计的逻辑

常用Android控件的使用属于Android开发的基础知识,也是每个开始Android开发的学生必备的技能。

谁适合学习?

具备基本的Java/Android知识想要快速上手,走上Android开发之路的实习者

怎么学?

极客学院将每天推出一门有限的免费课程,只需两步就能轻松开始学习:

注册极客学院账号,开启学习之旅

1.《velocitytracker 让控件如此丝滑Scroller和VelocityTracker的API讲解与实战——Android高级UI》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《velocitytracker 让控件如此丝滑Scroller和VelocityTracker的API讲解与实战——Android高级UI》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guoji/1102473.html

上一篇

以家人之名贺子秋官配是谁 和小橙子秦美央结局在一起了吗

下一篇

贵州大山深处连续多日传出诡异怪声 场面神奇引万人围观

喻言被男子搂背怎么回事 喻言5.5事件始末

  • 喻言被男子搂背怎么回事 喻言5.5事件始末
  • 喻言被男子搂背怎么回事 喻言5.5事件始末
  • 喻言被男子搂背怎么回事 喻言5.5事件始末

张颜齐否认抄袭草东 具体事件详情始末曝光

  • 张颜齐否认抄袭草东 具体事件详情始末曝光
  • 张颜齐否认抄袭草东 具体事件详情始末曝光
  • 张颜齐否认抄袭草东 具体事件详情始末曝光

银行回应新员工不喝酒被打耳光 回顾整场事件详情始末

  • 银行回应新员工不喝酒被打耳光 回顾整场事件详情始末
  • 银行回应新员工不喝酒被打耳光 回顾整场事件详情始末
  • 银行回应新员工不喝酒被打耳光 回顾整场事件详情始末
山东校长11岁儿子顶替他人入公职 具体事件详情曝光

山东校长11岁儿子顶替他人入公职 具体事件详情曝光

从关县陈春秀被冒领上大学,到东昌府区王丽丽被冒领上中专,大家对以权谋私、弄虚作假的现象表示绝不姑息。模仿可能会改变一个人甚至一个家庭的命运。对换人事件的严惩,体现了山东刮骨治病的决心,也将是一场重拾民心的战斗。7月2日,#...

男生踹伤猥亵女生男子被刑拘 具体事件回顾

  • 男生踹伤猥亵女生男子被刑拘 具体事件回顾
  • 男生踹伤猥亵女生男子被刑拘 具体事件回顾
  • 男生踹伤猥亵女生男子被刑拘 具体事件回顾

山东回应查处242起高考冒名顶替事件 这些违法行为大都发生在2006年

  • 山东回应查处242起高考冒名顶替事件 这些违法行为大都发生在2006年
  • 山东回应查处242起高考冒名顶替事件 这些违法行为大都发生在2006年
  • 山东回应查处242起高考冒名顶替事件 这些违法行为大都发生在2006年
校长之子伪造档案入公职 校长之子11岁起领国家工资事件始末

校长之子伪造档案入公职 校长之子11岁起领国家工资事件始末

今天山东菏泽某校长之子被控伪造档案冒充自己上班,11岁开始领取国家工资。据新京报@紧急电话报道,牡丹区应急管理部门回应称,冒名顶替的邱志浩因谋职不当被“撤职”。此外,他的父亲被免去校长职务,并受到党的纪律处分。自称是党的张...

H&M抵制的是棉花? H&M们抵制的是棉花?幕后真相令国人彻底醒悟

H&M抵制的是棉花? H&M们抵制的是棉花?幕后真相令国人彻底醒悟

近来,西方势力对于中国新疆的造谣抹黑越来越甚,美英欧加对中国发起制裁,各家西方企业也积极配合。24日,瑞典服装品牌H&M半年前发表在官网上的一份声明在微博上广泛传播。这份声明称中国新疆维吾尔自治区存在少数民族“强迫劳动”和“宗教歧视”,随后耐克、阿迪达斯等中国人民熟悉的外国品牌也被曝出同样存在相关问题,可谓一石激起千层浪,引发众怒。我们对西方国家在政治领域抹黑中国已然习以为常,但我们不能忍的是,这...