view的滑动讲解
来源:互联网 发布:数据库开发工具有哪些 编辑:程序博客网 时间:2024/06/05 01:56
在Android应用中,view的滑动几乎是标配;比如上拉加载,下拉刷新,slidingmenu它们都需要滑动,从另一个方面来说,因为手机屏幕较小,想要显示更多的内容,就需要使用滑动来隐藏或者展示一些内容,基于上边两点我们可以知道滑动在Android开发中具有很重要的作用。掌握滑动的方法是实现绚丽自定义控件的基础。常见的滑动就这么三种,下面我们来一一分析。
1.使用scrollTo和scrollBy
为了实现view的滑动,系统提供了两个方法,就是scrollTo和scrollBy,我们来看看两个方法的实现:
/** * Set the scrolled position of your view. This will cause a call to * {@link #onScrollChanged(int, int, int, int)} and the view will be * invalidated. * @param x the x position to scroll to * @param y the y position to scroll to */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(); } }}
/** * Move the scrolled position of your view. This will cause a call to * {@link #onScrollChanged(int, int, int, int)} and the view will be * invalidated. * @param x the amount of pixels to scroll by horizontally * @param y the amount of pixels to scroll by vertically */public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y);}从源码可以看出scrollBy也调用了scrollTo方法实现的,前者实现了view基于当前位置的相对滑动,后者实现了view基于所传递参数的绝对滑动。用他们来实现view的滑动并不难,但是我们要明白滑动过程中mscrollx和mscrolly的改变规则。这两个属性分别通过getscrollx()和getscrolly()获得,mscrollx的值总等于view左边缘和view内容左边缘在水平方向上的距离。而mscrolly总等于view上边缘和view内容上边缘之间的竖直距离。view边缘是指view的四个顶点组成,view内容边缘是指view的内容的边缘,scrollTo和scrollBy只能改变vie内容的位置,而不能改变view在布局中的位置,mscrollx和mscrolly的单位为像素,只有view的左边缘在view内容左边缘的右边时Mscrollx为正,否则为负,当view上边缘在view内容上边缘的下边时,mscrolly为正,反之为负。也就是说从左往右划mscrollx为负值,反之为正,从上往下划mscrolly为负值,反之为正。以下图带表滑动过程
使用动画
使用动画我们能将一个view进行平移,而平移就是一种滑动,使用动画来移动view,主要操作view的translationx和translationy属性,既可以采用传统的动画,也可以采用属性动画。如果采用属性动画,为了兼容3.0以下的版本,需要采用开元动画库nineoldandroids(http://nineoldandroids.com/).采用view动画的代码如下所示:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true" android:zAdjustment="normal" > <!-- 把view在100毫秒内从原始位置向右下角移动100个像素 --> <translate android:duration="100" android:fromXDelta="0" android:fromYDelta="0" android:interpolator="@android:anim/linear_interpolator" android:toXDelta="100" android:toYDelta="100" /></set>如果采用属性动画,那就更简单了,以下是把view在100毫秒内从原位置向右移动100像素。
ObjectAnimator.ofFloat(target, "translationx", 0, 100).setDuration(100).start();
使用动画来做view的滑动需要注意一点,他移动的是view的影像,它并不能真正改变view的未知参数。包括宽高,并且如果需要改变动画后状态能够保存,那么我们必须把fillafter设置为true,否则动画完成后,其动画效果消失。使用属性动画并不存在上述问题,但是Android3.0以下无法使用属性动画,这个时候我们可以使用动画兼容库nineoldandroids来实现属性动画,尽管如此,Android3.0以下的手机实现属性动画也是通过Android的view动画。
上边提到的view动画不能真正改变view的位置,这会带来一个严重的问题,因为当移动之后,你单击并不能触发onclick事件,而单击原始位置仍然可以触发原来的事件,对于这种问题,我们可以先在欲到达的位置设置一个新控件,和移动的目标控件一模一样,当目标控件移动到位置时,影藏目标控件,显示新控件就好了。
改变布局参数
第三种方法就是改变布局参数,如向右移100px,我们只要设置layoutparams的margainleft设置为100px就好了;
总结之后如下所示:
scrollTo、scrollBy使用简单,适合对view的内容的滑动。
动画:使用简单,主要用于没有交互的view和复杂动画效果;
布局参数:操作复杂,适用于有交互的view
- view的滑动讲解
- View的滑动
- View 的滑动
- view 的滑动冲突
- View的滑动冲突
- View的滑动冲突
- View的滑动
- View的滑动冲突
- 滑动效果的View
- 12.View的滑动
- View的滑动冲突
- View 的滑动冲突
- View的滑动冲突
- View的滑动
- View 滑动的实现
- View的滑动
- Android View的滑动
- View的滑动
- android应用方法数超出
- Java 实现Comparable接口踩坑记录
- Android 蓝牙技术 带你实现终端间数据传输
- 子页面eventMap管理事件绑定不起作用
- 图片横向滚动-兼容IE8和Chrome浏览器
- view的滑动讲解
- 1.4 起步 - 命令行
- Java进阶-----详解匿名内部类
- 语音播报TTS
- 机房收费系统---用户手册
- 动态设置(viewGroup)布局的位置、大小
- android6.0(M) 验证权限工具类+ContextCompat.checkSelfPermission(context, permission)
- word切换字母大小写,互换,的快捷键 shift+f3
- dex2jar源码解析----smail转dex