四:View的滑动
View的三种滑动:
第一种是通过View本身提供的scrollTo/scrollBy方法来实现滑动;第二种是通过动画给View施加平移效果来实现滑动;第三种是通过改变View的LayoutParams使得View重新布局从而实现滑动。
1.使用scrollTo/scrollBy
从源码中我们可以知道,scrollBy实际上是调用了scrollTo方法,它实现了基于当前位置的相对滑动,而scrollTo所传递的参数是绝对滑动。
在滑动的过程中View内部两个属性mScrollX,和mScrollY的改变规则:如果从左向右滑的话那么mScrollX为负值,反之为正值;如果从上往下滑的话mScrollY为负值,反之为正值。
*scrollTo/scrollBy只能改变View内容的位置而不能改变View在布局中的位置。
2.使用动画(略)补间动画或属性动画可以实现
3.改变布局参数(略)使用LayoutParams实现
五,弹性滑动
实现弹性滑动的方法很多,但都有一个共同思想:将一次的滑动分成若干次小的滑动,并在一个时间段内完成。
1.使用scroller实现:(写法固定)
{
Scroller mScroller = 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();//进行View重绘
}
//通过invalidate()回调;
Public void computeScroll(){
If(mScroller.conputeScrollOffset()){
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();
}
}
}
这里的滑动是指View的内容滑动,而非view本身的位置改变。
代码实现原理:就是startScroll方法下面的invalidate方法,虽然有点不可思议,但确实是这样的。Invalidate方法会导致View重绘,在view的draw方法中又会去调用computeScroll方法,computeScroll方法在View中是一个空实现,因此需要我们自己去实现。正是因为这个computeScroll方法,View才能实现弹性滑动;
2.通过动画
我们可以利用动画的特性来实现一些动画不能实现的效果,还拿scrollTo来说,我们也想模仿Scroller来实现View的弹性滑动,那么利用动画的特性:
{
Final int startX=0;
Final int deltaX=100;
ValueAnimator animator = ValueAnimator.ofInt(0,1).setDuration(1000);
animator.addUpdateListener(new AnimatorUpdateListener(){
Public void onAnimationUpdate(ValueAnimator animator){
Float fraction = animator.getAnimatedFraction();
mButton.ScrollTo(startX+(int)(deltaX*fraction),0);
}
});
Animator.start();
}
上述代码,我们的动画的本质上没有作用于任何对象,它只是在1000ms内完成了整个动画过程。利用这个特性,我们就可以在动画的每一帧到来时获取动画完成的比例,然后再根据这个比例计算出当前View所要滑动的距离。
注意*:这里的滑动针对的是View的内容而非View本身。
**:可知采用这种方法除了能够完成弹性滑动以外,还可以实现其他动画效果,我们完全可以在onAnimationUpdate方法中加上我们想要的其他操作。
3.使用延时策略
核心思想:通过发送一系列延时消息从而达到一种渐进式的效果,具体来说可以使用Handler或View的PostDelayed方法,也可以使用线程的Sleep方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)