Android开发——View滑动的三种实现方式

来源:互联网 发布:淘宝达人公域权限开通 编辑:程序博客网 时间:2024/06/06 18:28

0. 前言  

Android开发中,我们常常需要View滑动实现一些绚丽的效果来优化用户体验。一般View的滑动可以用三种方式实现。

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373


1.   ScrollTo/ScrollBy

View提供了ScrollTo/ScrollBy专门用于View滑动,从下面源码可以看出,后者是使用前者来实现的

 public void scrollTo(int x, int y) {//滑动目标点坐标        if (mScrollX != x || mScrollY != y) {            int oldX = mScrollX;          int oldY = mScrollY;           mScrollX = x;            mScrollY = y;           invalidateParentCaches();            onScrollChanged(mScrollX, mScrollY, oldX, oldY);            if (!awakenScrollBars()) {                 postInvalidateOnAnimation();             }        }    }   public void scrollBy(int x, int y){    scrollTo(mScrollX + x, mScrollY + y);}

这里需要注意的是,View的两个属性mScrollXmScrollY,分别可通过getScrollXgetScrollX方法获得。

mScrollX总是等于View左边缘和View内容左边缘在x轴方向的距离,同理理解mScrollY。

我们在一个按钮上写上字,点击按钮后执行button.scrollTo(0,0)的逻辑,会发现按钮上的字位置不变,打印getScrollX/Y均为0。这就是所谓的内容和View边缘重合,即一开始的情况,如果执行的是button.scrollTo(100,100)按钮位置肯定不变,即不影响点击事件,但是字跑到左上方去了,这个字的位置肯定是比原来字的位置向上向左都移动了100个像素,View内容的左上角和View本身的左上角相比向上向左都偏移了100个像素。这时候打印getScrollX/Y均为100这和我们平时知道的屏幕坐标系是相反的


总结:

(1)简单方便,不会影响元素单击事件

(2)scrollTo()和scrollBy()移动的只是View的内容,并不能移动View本身,背景当然也是不移动的。如果是移动ViewGroup,移动的是所有的子View。

 

2.    动画

动画可以实现非常复杂的动画效果,当然也可以实现View滑动的效果,原理是改变translationXtranslationY的值。使用属性动画实例如下,View动画的例子略:

//使用属性动画,将View在1秒内向右平移50个像素ObjectAnimator.ofFloat(mView, ""translationX", 0 , 50).setDuration(1000).start();

需要注意的是,View动画有一个显著的缺点,那就是只对View的影像做操作,不会真正改变View的位置参数,因此可能对滑动后的新位置Button的点击事件失去响应。在系统眼里,这个Button没有发生任何改变。

但是Android3.0以后属性动画解决了这个问题,3.0以下的可以通过设置两个按钮,并在恰当的时刻通过view.setVisibility间接解决该问题。

在动画的进行过程中,我们还可以设置监听器监听动画完成每一帧时,动画完成的比例。这样我们就可以完成更多的业务逻辑。

animator.addUpdateListener(new AnimatorUpdateListener(){    //动画完成一帧即回调    @override    public void onAnimationUpdate(ValueAnimator animator){    //获取动画完成比例    float faction = animator.getAnimatedFraction();    //完成其他效果  }});

3.    改变布局参数

改变布局参数的方式,使用起来比较麻烦,因为需要具体情况具体实现。但是它是一种非常灵活的方法。具体理解起来也不难,原理就是改变控件的LayoutParams

使用举例:

//将按钮右移100像素的例子MarginLayoutParams params = (MarginLayoutParams)mButton.getLayoutParams();params.leftMargin += 100;mButton.setLayoutParams(params);


至此对于如何实现View滑动的三种方式整理完毕

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52473373


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗狗对主人低吼怎么办 吹雪之松锦徒长怎么办 武装突袭被禁了怎么办 眼球小血管破了怎么办 眼睛白眼球破了怎么办 打拳击手腕伤了怎么办 上眼皮进东西了怎么办 眼睛进了异物怎么办妙招 眼睛毛血管破了怎么办 怪物猎人x钱不够怎么办 小米2开不了机怎么办 3ds更新系统不动怎么办 u盘中病毒了怎么办 aj5白银前面皱了怎么办 狗吃了巧克力该怎么办 孩子零食吃多了怎么办 上学时月经侧漏怎么办 漏电被电的脚肿怎么办 走路有尿溢出来怎么办 篮球气嘴漏气了怎么办 暗线插座盒坏了怎么办 焊过电焊眼睛疼怎么办 烧电焊后眼睛痛怎么办? 焊完电焊眼睛疼怎么办 烧电焊后眼睛痛怎么办 用电焊后眼睛痛怎么办 看电焊后眼睛痛怎么办 眼睛焊电焊很痛怎么办 电焊没带眼睛痛怎么办 有东西进眼睛了怎么办 眼睛有东西磨眼怎么办 怀孕了眼睛肿疼怎么办 眼睛疼又红血丝怎么办 用眼过度眼睛疼怎么办 眼睛玩手机视力下降怎么办 看手机眼睛疼该怎么办 眼睛眨一下就痛怎么办 着火了怎么办教案详案 汽车尾灯磕破了怎么办 后尾灯灯罩裂了怎么办 七氟丙烷喷伤了怎么办