Android:View的滑动

View的滑动

可通过三种方式实现View的滑动:

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

使用scrollTo、scrollBy

复制代码
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);
}
  • scrollBy实际上也是调用了scrollTo方法,它是基于当前位置的相对滑动,而scrollTo则实现了基于所传递参数的绝对滑动

我们需要明白滑动过程中,View内部的两个属性mScrollX和mScrollY的改变规则

  1. 在滑动过程中,mScrollX的值总是等于View左边缘和View内容左边缘在水平方向的距离,而mScrollY的值总是等于View上边缘和View内容上边缘在竖直方向的距离
  2. scrollTo和scrollBy只能改变View内容的位置而不能改变View在布局中的位置
  3. 滑动时:从左向右滑动,mScrollX为负值,反之为正值、从上往下滑动,mScrollY为负值,反之为正值

使用动画

使用动画去实现滑动的效果,主要操作View的translationX和translationY属性,既可以采用传统的View动画,也可以采用属性动画(采用属性动画,需要采用开源库nineoldandroid)

  • View动画实例

    <?xml version="1.0" encoding="utf-8"?>

    <set xmlns:android="http://schemas.android.com/apk/res/android" android: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>

  • 属性动画实例

    ObjectAnimator.ofFloat(targetView,"translationX",0,100).setDuration
    (100).start();

这两种方式实现的动画效果都是将一个View向右进行移动已达到想要的动画效果

注意:View动画时对View的影像做操作,并不能真正改变View的位置参数(包括宽/高);希望执行完动画的状态得以保持,需要将fillAfter属性设为true

改变布局参数

改变布局参数即改变LayoutParams,如想要把一个Button向右平移100px,我们可以将这个Button的LayoutParams里的marginLeft参数的值增加100px

复制代码
//重新设置一个View的LayoutParams

MarginLayoutParams params = (MarginLayoutParams)mButton1.getLayoutParams();
params.width += 100;
params.leftMargin += 100;
mButton1.requestLayout();

//或者mButton1.setLayoutParams(params)

上述滑动方式的对比

  • scrollTo/scrollBy:操作简单,适合对View内容的滑动
  • 动画:操作简单,适合用于没有交互的View的实现复杂的动画效果
  • 改变布局参数:操作稍微复杂,使用于有交互的View
相关推荐
2501_916008891 小时前
深入解析iOS应用启动性能优化策略与实践
android·ios·性能优化·小程序·uni-app·cocoa·iphone
美狐美颜SDK开放平台3 小时前
短视频/直播双场景美颜SDK开发方案:接入、功能、架构详解
android·ios·美颜sdk·第三方美颜sdk·视频美颜sdk
untE EADO3 小时前
在 MySQL 中使用 `REPLACE` 函数
android·数据库·mysql
iblade3 小时前
Android CLI And Skills 3x faster
android
阿巴斯甜5 小时前
SharedUnPeekLiveData和UnPeekBus的区别:
android
阿巴斯甜5 小时前
UnPeek-LiveData的使用:
android
我就是马云飞5 小时前
我废了!大厂10年的我面了20家公司,面试官让我回去等通知!
android·前端·程序员
limuyang26 小时前
在 Android 上用上原生的 xxHash,性能直接拉满
android
Fate_I_C7 小时前
ViewModel 的生命周期与数据保持
android·kotlin
凛_Lin~~7 小时前
安卓实现textview跑马灯效果
android·java