View的滑动
实现的3种方式
- 通过动画给 View 本身提供的 scrollTo/scrollBy 方法来实现滑动
- 通过动画给 View 施加平移效果来实现滑动
- 通过改变 View 的 LayoutParams 使得 View 重新布局从而实现滑动
通过 scrollTo/scrollBy
-
scrollTo 实现了基于所传递参数的绝对滑动
-
scrollBy 实现了基当前位置的相对滑动
-
在源码中, scrollBy 实际上也是调用了scrlloTy
public void scrollTo(int x, int y){
~~~~~
}
public void scrollBy(int x, int y){
scrlloTo(mScrollX + x, mScrollY + y);
}
复制代码
scrollTo 和 scrollBy 只能改变 View 内容的位置而不能改变 View 在布局中的位置.
滑动过程中
-
mScrollX 总是等于 View 左边缘和 View 内容左边缘在水平方向的距离
-
mScrollY 总是等于 View 上边缘和 View 内容上边缘在竖直方向的距离
-
View 边缘指 View 的位置,由四个顶点组成,而 View 内容边缘是值 View 中内容额边缘
-
mScorllX 和 mScorllY 的单位为像素
-
当 View 左边缘在 View 内容左边缘的右边时, mScrollX 为正值,反之为负值(如果从左往右划, mScrollX 为负值,反之为正值)
-
当 View 上边缘在 View 内容上边缘的下边时, mScrollY 为正值,反之为负值(如果从上往下划, mScrollY 为负值,反之为正值)
使用动画
方法
- 采用传统的 View 动画
<?xml= version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
anroid:fillAfter="true"
android:zAdjustment="normal"
<translate
android:duration="100"
android:fromXDelta="0"
android:fromYDelta="0"
android:interpolator="@android:anim/linear_interpolator"
android:toXDelta="100"
android:toYDelta="100"/>
</set>
在 100ms 内将一个 View 从原始位置向右下角移动 100 个像素
复制代码
- 采用属性动画(Android3.0 以下无法使用, 需要使用开源动画库 nineoldanroids )
ObjectAnimator.ofFloat(targetView, "translationX", 0, 100).setDuration(100).start();
复制代码
缺点
View 动画是对 View 的影像做操作, 它并不能真正改变 View 的位置参数, 包括宽/高,如果希望动画后的状态得以保留还必须将 fillAfter 的属性设置为 true , 否则动画完成后其动画效果会消失
而 View 动画不能改变 View 的位置会带来一个问题, 比如通过动画将一个 Button 向右移动 100px, 并且这个 View 设置有点击事件, 然后就会发现, 单击新位置无法触发 onClick , 而单击原始位置仍然可以触发 onClick 事件
Android 3.0 开始可以使用属性动画解决上面的问题
改变布局参数
改变布局参数,即改变 LayoutParams
比如将一个 button 向右平移 100px, 只需将这个 Button 的 LayoutParams 里的 marginLeft 参数增加 100px 即可
或者在 Button 的左边放置一个空的 View ,默认宽度为0. 当我们需要向右移动 Button 时,只需重新设置这个空 View 的宽度即可, 当 View 的宽度变大时, Button 就自动被挤向右边, 实现了平移的效果.
MarginLayoutParams params = (MarginLayoutParams)mButton1.getLayoutParams();
params.width += 100;
params.leftMargin +=100;
mButton1.requestLayout();
//或者mButton1.setLayoutParams(params)
复制代码
各种滑动方式的对比
scrollTo/scrollBy | 动画 | 改变布局方式 |
---|---|---|
适用场景 | 操作简单, 适合对 View 内容的滑动 | 操作简单, 主要适用于没有交互的 View 内容的滑动 |
特性及优缺点 | 系统提供的原生方法, 专门用于View的滑动, 只能滑动 View 的内容, 不能滑动 View 本身 | Android 3.0以上没有明显缺点, 但如果是在 3.0 以下无论是使用 View 动画还是使用使用属性动画, 均不能改变 View 本身的属性, 在实际使用中, 如果动画元素不需要响应用户的交互,那么使用动画来做滑动比较合适 |