View的滑动

View的滑动

实现的3种方式

  1. 通过动画给 View 本身提供的 scrollTo/scrollBy 方法来实现滑动
  2. 通过动画给 View 施加平移效果来实现滑动
  3. 通过改变 View 的 LayoutParams 使得 View 重新布局从而实现滑动

通过 scrollTo/scrollBy

  1. scrollTo 实现了基于所传递参数的绝对滑动

  2. scrollBy 实现了基当前位置的相对滑动

  3. 在源码中, 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 在布局中的位置.


滑动过程中
  1. mScrollX 总是等于 View 左边缘和 View 内容左边缘在水平方向的距离

  2. mScrollY 总是等于 View 上边缘和 View 内容上边缘在竖直方向的距离

  3. View 边缘指 View 的位置,由四个顶点组成,而 View 内容边缘是值 View 中内容额边缘

  4. mScorllX 和 mScorllY 的单位为像素

  5. 当 View 左边缘在 View 内容左边缘的右边时, mScrollX 为正值,反之为负值(如果从左往右划, mScrollX 为负值,反之为正值)

  6. 当 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 本身的属性, 在实际使用中, 如果动画元素不需要响应用户的交互,那么使用动画来做滑动比较合适
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享