仿淘宝商品详情页面下拉黏滞效果

1:

VelocityTracker--顾名思义即速度跟踪,在android中主要应用于touch event,VelocityTracker通过跟踪一连串事件实时计算出

当前的速度,这样的用法在android系统空间中随处可见,比如Gestures中的Fling, Scrolling等

//获取一个VelocityTracker对象, 用完后记得回收//回收后代表你不需要使用了,系统将此对象在此分配到其他请求者static public VelocityTracker obtain();public void recycle(); //计算当前速度, 其中units是单位表示, 1代表px/毫秒, 1000代表px/秒, ..//maxVelocity此次计算速度你想要的最大值public void computeCurrentVelocity(int units, float maxVelocity);//经过一次computeCurrentVelocity后你就可以用以下几个方法获取此次计算的值//id是touch event触摸点的ID, 来为多点触控标识,有这个标识在计算时可以忽略//其他触点干扰,当然干扰肯定是有的public float getXVelocity();public float getYVelocity();public float getXVelocity(int id);public float getYVelocity(int id);2:

ViewConfiguration–该类中需要定义的是系统的一些常量,方面我们的使用,尽量和系统的保持一致,我们不用自己重复的定义这个常量,况且自己定义的不一定合适。代码如下:

/** * 包含了方法和标准的常量用来设置UI的超时、大小和距离 */public class ViewConfiguration {// 设定水平滚动条的宽度和垂直滚动条的高度,单位是像素pxprivate static final int SCROLL_BAR_SIZE = 10;//定义滚动条逐渐消失的时间,单位是毫秒private static final int SCROLL_BAR_FADE_DURATION = 250;// 默认的滚动条多少秒之后消失,单位是毫秒private static final int SCROLL_BAR_DEFAULT_DELAY = 300;// 定义边缘地方褪色的长度private static final int FADING_EDGE_LENGTH = 12;//定义子控件按下状态的持续事件private static final int PRESSED_STATE_DURATION = 125;//定义一个按下状态转变成长按状态的转变时间private static final int LONG_PRESS_TIMEOUT = 500;//定义用户在按住适当按钮,弹出全局的对话框的持续时间private static final int GLOBAL_ACTIONS_KEY_TIMEOUT = 500;//定义一个touch事件中是点击事件还是一个滑动事件所需的时间,如果用户在这个时间之内滑动,那么就认为是一个点击事件private static final int TAP_TIMEOUT = 115;/*** Defines the duration in milliseconds we will wait to see if a touch event* is a jump tap. If the user does not complete the jump tap within this interval, it is* considered to be a tap.*///定义一个touch事件时候是一个点击事件。如果用户在这个时间内没有完成这个点击,那么就认为是一个点击事件private static final int JUMP_TAP_TIMEOUT = 500;//定义双击事件的间隔时间private static final int DOUBLE_TAP_TIMEOUT = 300;//定义一个缩放控制反馈到用户界面的时间private static final int ZOOM_CONTROLS_TIMEOUT = 3000;/*** Inset in pixels to look for touchable content when the user touches the edge of the screen*/private static final int EDGE_SLOP = 12;/*** Distance a touch can wander before we think the user is scrolling in pixels*/private static final int TOUCH_SLOP = 16;/*** Distance a touch can wander before we think the user is attempting a paged scroll* (in dips)*/private static final int PAGING_TOUCH_SLOP = TOUCH_SLOP * 2;/*** Distance between the first touch and second touch to still be considered a double tap*/private static final int DOUBLE_TAP_SLOP = 100;/*** Distance a touch needs to be outside of a window's bounds for it to* count as outside for purposes of dismissing the window.*/private static final int WINDOW_TOUCH_SLOP = 16;//用来初始化fling的最小速度,单位是每秒多少像素private static final int MINIMUM_FLING_VELOCITY = 50;//用来初始化fling的最大速度,单位是每秒多少像素private static final int MAXIMUM_FLING_VELOCITY = 4000;//视图绘图缓存的最大尺寸,以字节表示。在ARGB888格式下,这个尺寸应至少等于屏幕的大小@Deprecatedprivate static final int MAXIMUM_DRAWING_CACHE_SIZE = 320 * 480 * 4; // HVGA screen, ARGB8888//flings和scrolls摩擦力度大小的系数private static float SCROLL_FRICTION = 0.015f;/*** Max distance to over scroll for edge effects*/private static final int OVERSCROLL_DISTANCE = 0;/*** Max distance to over fling for edge effects*/private static final int OVERFLING_DISTANCE = 4;}3:

Scroller--Android里Scroller类是为了实现View平滑滚动的一个Helper类。通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(context)。设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。 相关API介绍如下:

mScroller.getCurrX() //获取mScroller当前水平滚动的位置mScroller.getCurrY() //获取mScroller当前竖直滚动的位置mScroller.getFinalX() //获取mScroller最终停止的水平位置mScroller.getFinalY() //获取mScroller最终停止的竖直位置mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置//滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250msmScroller.startScroll(int startX, int startY, int dx, int dy, int duration)mScroller.computeScrollOffset() //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。下面上一段简单的代码,代码中读者可能会发现,其实最后调用的方法全是scrollTo方法。import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.widget.LinearLayout;import android.widget.Scroller;public class CustomView extends LinearLayout {private static final String TAG = "Scroller";private Scroller mScroller;public CustomView(Context context, AttributeSet attrs) {super(context, attrs);mScroller = new Scroller(context);}//调用此方法滚动到目标位置public void smoothScrollTo(int fx, int fy) {int dx = fx – mScroller.getFinalX();int dy = fy – mScroller.getFinalY();smoothScrollBy(dx, dy);}//调用此方法设置滚动的相对偏移public void smoothScrollBy(int dx, int dy) {//设置mScroller的滚动偏移量mScroller.startScroll(mScroller.getFinalX(), mScroller.getFinalY(), dx, dy);invalidate();//这里必须调用invalidate()才能保证computeScroll()会被调用,否则不一定会刷新界面,,看不到滚动效果}@Overridepublic void computeScroll() {//先判断mScroller滚动是否完成if (mScroller.computeScrollOffset()) {//这里调用View的scrollTo()完成实际的滚动scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//必须调用该方法,否则不一定能看到滚动效果postInvalidate();}super.computeScroll();}}

人生最大的错误是不断担心会犯错

仿淘宝商品详情页面下拉黏滞效果

相关文章:

你感兴趣的文章:

标签云: