Android开发艺术探索(连载)之View的事件体系(二)View的滑动

2023-05-16

四:View的滑动

View的三种滑动:

第一种是通过View本身提供的scrollTo/scrollBy方法来实现滑动;第二种是通过动画给View施加平移效果来实现滑动;第三种是通过改变ViewLayoutParams使得View重新布局从而实现滑动。

1.使用scrollTo/scrollBy

从源码中我们可以知道,scrollBy实际上是调用了scrollTo方法,它实现了基于当前位置的相对滑动,而scrollTo所传递的参数是绝对滑动。

在滑动的过程中View内部两个属性mScrollX,mScrollY的改变规则:如果从左向右滑的话那么mScrollX为负值,反之为正值;如果从上往下滑的话mScrollY为负值,反之为正值。

*scrollTo/scrollBy只能改变View内容的位置而不能改变View在布局中的位置。

 

2.使用动画(略)补间动画或属性动画可以实现

3.改变布局参数(略)使用LayoutParams实现

 

 

 

五,弹性滑动

实现弹性滑动的方法很多,但都有一个共同思想:将一次的滑动分成若干次小的滑动,并在一个时间段内完成。

1.使用scroller实现:(写法固定)

{

Scroller mScroller = new scroller(mContext);

 

//缓慢滚到指定位置

Private void smoothScrollTo(int destX,int destY){

Int scrollX = getScrollX();

Int delta = destX - scrollX;

//1000ms 内滑向destX,效果就是慢慢滑动

mScroller.startScroll(scrollX,0,delta,0,1000);

Invalidate();//进行View重绘

}

 

//通过invalidate()回调;

Public void computeScroll(){

If(mScroller.conputeScrollOffset()){

scrollTo(mScroller.getCurrX(),mScroller.getCurrY());

postInvalidate();

}

}

}

 

这里的滑动是指View的内容滑动,而非view本身的位置改变。

代码实现原理:就是startScroll方法下面的invalidate方法,虽然有点不可思议,但确实是这样的。Invalidate方法会导致View重绘,在viewdraw方法中又会去调用computeScroll方法,computeScroll方法在View中是一个空实现,因此需要我们自己去实现。正是因为这个computeScroll方法,View才能实现弹性滑动;

2.通过动画

我们可以利用动画的特性来实现一些动画不能实现的效果,还拿scrollTo来说,我们也想模仿Scroller来实现View的弹性滑动,那么利用动画的特性:

{

Final int startX=0;

Final int deltaX=100;

ValueAnimator animator = ValueAnimator.ofInt(0,1).setDuration(1000);

animator.addUpdateListener(new AnimatorUpdateListener(){

Public void onAnimationUpdate(ValueAnimator animator){

Float fraction = animator.getAnimatedFraction();

mButton.ScrollTo(startX+(int)(deltaX*fraction),0);

}

});

Animator.start();

}

 

上述代码,我们的动画的本质上没有作用于任何对象,它只是在1000ms内完成了整个动画过程。利用这个特性,我们就可以在动画的每一帧到来时获取动画完成的比例,然后再根据这个比例计算出当前View所要滑动的距离。

注意*:这里的滑动针对的是View的内容而非View本身。

**:可知采用这种方法除了能够完成弹性滑动以外,还可以实现其他动画效果,我们完全可以在onAnimationUpdate方法中加上我们想要的其他操作。

 

 3.使用延时策略

核心思想:通过发送一系列延时消息从而达到一种渐进式的效果,具体来说可以使用HandlerViewPostDelayed方法,也可以使用线程的Sleep方法。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android开发艺术探索(连载)之View的事件体系(二)View的滑动 的相关文章

随机推荐

  • mysql的视图、存储过程、游标、事务、引擎、索引的认识和使用

    视图 一 视图概念 xff1a 视图是虚拟表 xff0c 并不存在真正的表 xff0c 可以重用sql语句 xff0c 利用实际存在的一个或几个表链接查询数据 xff0c 只展示部分数据 xff0c 可以保护数据库中数据 只有部分表的权限
  • win10下mysql5忘记root用户密码如何修改密码并登录

    步骤 xff1a 1 关闭mysql服务 xff1a net stop mysql 2 进入mysql安装目录 xff1a 如 3 此时可以免密登录 xff1a 另外开启cmd命令窗口 xff1a 一定要记住刷新权限 xff0c 否则可能拒
  • 虚拟机中三种网卡模式详细介绍

    虚拟机中三种网卡模式 vmware为我们提供了三种网络工作模式 xff0c 它们分别是 xff1a Bridged xff08 桥接模式 xff09 NAT xff08 网络地址转换模式 xff09 Host Only xff08 仅主机模
  • centos7 xfce轻量桌面环境和vnc安装

    一 centos7安装xfce轻量桌面环境 Linux的桌面环境gnome kde xfce lxde 等等使用比较https www cnblogs com chenmingjun p 8506995 html 1 安装额外yum源 yu
  • R语言学习笔记——空间自相关:全局Moran’I/局部Moran’I /Geary’c/Moran散点图

    data ChinaRD2 span class token operator lt span readRDS span class token punctuation span span class token string 34 gad
  • FIFO深度计算问题

    FIFO深度计算公式 xff1a fifo depth 61 burst length burst length X Y r clk w clk burst length xff1a 突发数据个数 X Y xff1a 读时钟周期里 xff0
  • 【游戏开发】游戏开发书籍汇总

    1 游戏设计的艺术 2 游戏设计的100个原理 3 我在美国学游戏设计 4 游戏新手村 xff1a 从零开始做游戏 5 Directx游戏开发终极指南 6 Windows游戏编程大师技巧 7 快乐之道 xff1a 游戏设计的黄金法则 人类的
  • Java~String类型空字符串和Null的区别以及判断方法

    一 区别 null表示的是一个对象的值 xff0c 而不是一个字符串 如声明一个对象的引用 xff0c String a 61 null 表示的是一个空字符串 xff0c 也就是说它的长度为0 如声明一个字符串String s 61 Str
  • 解读官方Android MediaPlayer API(1)

    public class MediaPlayerextends ObjectMediaPlayer class 能够用来使用来控制vudio video xff08 音频或视频 xff09 文件和流文件的播放 举个例子可以在 a targe
  • ACM 几何基础(1)

    点 point 定义 xff1a struct point double x y 线 line 定义 xff1a Struct line Point s e 精度差 Const double eps 61 1e 8 Int sgn doub
  • ACM 几何基础(2)

    判断两条线段是否相交 xff1a 矢量 如果一条线段的端点是有次序之分的话 xff0c 那么这种线段就称为 有向线段 xff0c 如果有向线段 p1p2 的起点 p1 在坐标的原点 xff0c 则可以把它称为矢量 p2 矢量的加减 设二维矢
  • ACM 几何基础(3)

    几何基础 xff08 3 xff09 求线段交点 xff1a 前面已经讲了如何判断两条线段是否相交 xff0c 现在我们来学下如何求线段的交点坐标 首先先了解下 xff1a 定比分点公式 公式介绍 数学中常用的重要公式之一 xff01 在
  • ACM 几何基础(4)

    几何基础 xff08 4 xff09 点到线段最短距离 xff1a 主要学下矢量的方法求解 xff1a 点到线段最短距离的运算与点到直线的最短距离的运算二者之间存在一定的差别 xff0c 即求点到线段最短距离时需要考虑参考点在沿线段方向的投
  • ACM 几何基础(5)

    几何基础 xff08 5 xff09 凸包 xff1a 在学凸包之前 xff0c 最好把叉积弄熟 xff01 定义 xff1a 对一个简单多边形来说 xff0c 如果给定其边界上或内部的任意两个点 xff0c 连接这两个点的线段上的所有点都
  • 【奇技淫巧】薅公司服务器羊毛,IntelliJ IDEA的远程开发

    前言 作为一个程序员 xff0c 在平时工作的时候 xff0c 你觉得电脑的内存多大才够用 xff0c 8G 16G 32G 其实内存对于程序员来说 xff0c 只能说是多多益善 xff0c 像我平时电脑可能一周重启一次 xff0c 开的东
  • ACM 几何基础(6)

    几何基础 xff08 6 xff09 求多边形面积 xff1a 要想计算多边形的面积我们可以转化为求多个三角形的面积之和得到 在解析几何里 xff0c ABC的面积可以通过如下方法求得 xff1a 点坐标 61 gt 边长 61 gt 海伦
  • 解读官方Android MediaPlayer API(2)

    有效和无效状态 xff1a 方法名有效状态无效状态注释getCurrentPosition Idle Initialized Prepared Started Paused Stopped PlaybackCompleted Error 成
  • 解读官方Android MediaPlayer API(3)

    权限 One may need to declare a corresponding WAKE LOCK permission lt uses permission gt element 嵌套类摘要 static interface str
  • Android开发艺术探索(连载)之View 的事件体系(一)view的基本知识

    一 xff0c View的位置参数关系 xff1a 1 view 的基础概念 xff08 略 xff09 xff1b 2 View中的 top bottom left right 的表示内容 xff1a 所以 view的宽高 xff1a W
  • Android开发艺术探索(连载)之View的事件体系(二)View的滑动

    四 xff1a View的滑动 View的三种滑动 xff1a 第一种是通过 View本身提供的 scrollTo scrollBy 方法来实现滑动 xff1b 第二种是通过动画给 View 施加平移效果来实现滑动 xff1b 第三种是通过