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动画实例



  • 属性动画实例

    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
相关推荐
BoomHe10 小时前
Android Framework 文件应用移植到 AndroidStudio
android
传奇开心果编程11 小时前
【Jetpack Compose基础语法学与练】第8课 rememberSaveable,页面旋转/系统重建保留状态
android·学习·ui·kotlin·android jetpack
>Andre<12 小时前
UFS5.0标准中文全译·卷一:范围、术语与架构
android·linux·嵌入式硬件
事圆则缓13 小时前
Java 8 Lambda、Stream、Optional 与 Android 边界:从回调语法到运行时兼容
android·java
mmsx13 小时前
Android 地图十万要素不卡顿:空间网格 + 渐进式加载的移动端实践
android·大数据·opengl
Godikov14 小时前
Android 工业终端保活实战:前台服务 + 开机自启 + 更新自启的三重保障
android
字节暗面14 小时前
SO加固强度怎么量化?腾讯ACE与FairGuard静态分析实测
android·逆向
传奇开心果编程16 小时前
【Jetpack Compose基础语法学与练】第7课 if条件渲染 + 列表基础(LazyColumn)
学习·ui·kotlin·android jetpack
ai2work16 小时前
ch12 系统能力接入:TTS、剪贴板、分享、文件选择器
kotlin
终端安全笔记16 小时前
描述文件、企业证书、MDM 不是三个名字,是三层
android·ios·智能手机