今天的免费课程:“安卓通用控件和布局”
课程大纲
课程今天才免费,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