Android中View滑动实现方式

滑动作为Android中最基础的特效之一,使用场景非常广泛。实现的方式也有多种,理解各种滑动的实现方式。清楚在开发中根据自己的实际需求,选择合理的实现方案。这篇文章从:scrollTo()/scrollBy()内容滑动|动画方式滑动|修改布局参数,三种方式来做简要的分析。

一丶scrollerTo()&&scrollBy()内容滑动

这两个方法都是View自带的滑动方法,即每个控件都可以通过调用这两个方法实现滑动。scrollBy()方法的实现本质也是调用scrollTo()方法,不同之处在于。scrollyTo()方法参数是确定滑动位置的终点,即要滑动到哪儿去,绝对坐标。而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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

从源码中可以得知scrollTo()方法会先判断起点和终点的位置是否不相同,符合滑动的条件,保存和更新起点坐标,不难理解滑动后终点就成了新的起点。这样就造成了此次滑动完成后,再调用次方法,如果参数终点坐标和起点坐标相同,滑动就不会生效。而scrollBy()方法中直接调用scrollTo方法,将起点坐标位置和滑动的距离相加,确定终点位置,这样终点坐标永远都不会和起点坐标重复,滑动一直有效。举个栗子:

scrollTo()效果 
btn_scroll.scrollTo(100,0)

怎么按钮没动,字怎么动了?没错,scrollTo()方法是对View的内容进行滑动,调用Button的scrollTo()方法滑动的是他的字,TextView也是这样,当然Button本质也是基于TextView。当自定义View时,滑动的就是里面的圆丶矩形丶view…… 当Button跑了100像素时,再点击执行scrollTo(100,0)时就没有任何反应了,这就是相对起点的绝对坐标。

scrollBy()效果: 
btn_scroll.scrollBy(100,0);

一直执行scrollBy(100,0)都是生效的,这就是相对当前位置的相对坐标。结论:scrollTo()和scrollBy()这两种方法是对View的内容进行滑动,并没有改变View真正的布局位置。

二丶动画方式实现滑动

动画方式主要有两种补间动画和属性动画,这两种方式也没有实际改变view布局位置,需要值得注意的是补间动画执行结束后效果会瞬间回到原来的位置,是对影像进行操作,将fillAfter属性改为true就不会有这种效果,属性动画则没有这一特性。举个栗子:

/*补间动画*/
TranslateAnimation animation = new TranslateAnimation(0,300,0,0);
animation.setDuration(2000);
animation.setFillAfter(true);
btn_scroll.startAnimation(animation);

/*属性动画*/
ObjectAnimator animator = ObjectAnimator.ofFloat(btn_scroll,"translationX",0,300);
animator.setDuration(2000).start();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

实现效果: 

而补间动画还会有一个问题,当Button滑动完成之后,再点击Button没有任何响应,而点击Button之前的位置仍可以触发onClick()事件,属性动画没有这一特性。

三丶修改布局参数

前面讲到的两种方式都提到并没有真正改变布局参数,这回终于说到改变布局参数而实现。。这种方式是直接改变View在父view中的布局位置,比如要实现上图Button右滑300像素,则将View左边到父View左边的距离Left,View右边到父View左边的距离Right增加300px(对视图坐标系不太清楚的可以参考这篇文章:坐标系),即可实现,举个栗子:

btn_scroll.layout(btn_scroll.getLeft()+300,btn_scroll.getTop(),btn_scroll.getRight()+300,btn_scroll.getBottom());
  • 1

效果和上图动画实现大致相同,不同在于动画可以规定在多长时间内完成滑动,而修改布局参数和scrollTo()/scrollBy()方法都是在瞬间完成的!修改布局参数的实现方式有多种,但是原理都是一样的就不一 一说明了。

各种方式比较

这里就直接摘录引用《Android开发艺术探索》中的,大佬总结的比较到位。

先看scrollTo/scrollBy这种方式.它是View提供的原生方法,其作用是专门用于View的滑动,它可以比较简单的实现滑动效果,并且不影响内部元素的单击事件.但是它的缺点也是很显然的,它只能滑动View的内容,不能滑动View本身。

再看动画,通过动画来实现View的滑动,这要分情况.如果是Android3.0以上并采用属性动画,那么采用这种方式没有明显的缺点;如果说是使用View动画或者在Android3.0以下使用属性动画,均不能改变View本身的属性.在实际使用中,如果动画元素不需要响应用户的交互,那么使用动画来做滑动是比较适合的,否则就不太适合.但是动画有一个明显的优点,那就是一些复杂的效果必须通过动画才能实现.。

最后看一下改变布局的这种方式,它除了使用起来麻烦点之外,也没有明显的缺点,它的主要使用对象是一些具有交互性的View,因为这些View需要和用户交互,直接通过动画实现会有问题.所以这个时候我们需要使用直接改变布局参数的方法去实现。

scrollTo/scrollBy:操作简单,适合对View内容的滑动。

动画:操作简单,主要使用于没有交互的View和实现复杂的动画效果。

改变布局参数:操作稍微复杂,适用于有交互的View。

阅读全文

时间: 2024-12-08 21:01:18

Android中View滑动实现方式的相关文章

Android中View绘制流程以及invalidate()等相关方法分析

前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴望了解 Android 框架层的网友,推荐这本书,希望你们能够在Android开发里学到更多的知识 . 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简单概况为 根据之前设置的状态,判断是否需要重新计算视图大小(measure).是否重新需要安置视图的位置(layout).以及是否需要重绘 (d

Android 中LocalBroadcastManager的使用方式

Android中BroadcastReceiver主要用途有 发送通知,更新UI或者数据,应用程序间相互通信,监听系统状态(比如开机,网络等) Android中BroadcasetReceiver的注册方式 manifest清单文件中的全局注册 按照生命周期,在Service或者Activity中使用代码注册 manifest的注册方式  <receiver android:name="com.sample.test.MyBroadcastReciever">       

源码解析Android中View的measure量算过程

Android中的Veiw从内存中到呈现在UI界面上需要依次经历三个阶段:量算 -> 布局 -> 绘图,关于View的量算.布局.绘图的总体机制可参见博文< Android中View的布局及绘图机制>.量算是布局和绘图的基础,所以量算是很重要的一个环节.本文将从源码角度解析View的量算过程,这其中会涉及某些关键类以及关键方法. 对View进行量算的目的是让View的父控件知道View想要多大的尺寸. 量算过程概述 如果要进行量算的View是ViewGroup类型,那么ViewGr

(转)Android 中LocalBroadcastManager的使用方式

发表于2个月前(2014-11-03 22:05)   阅读(37) | 评论(0) 0人收藏此文章, 我要收藏 赞0 1月10日 #长沙# OSC 源创会第32期开始报名 摘要 android中广播的作用非常大,对程序的运行起着非常重要的作用 LocalBroadcastManager Android中BroadcastReceiver主要用途有 发送通知,更新UI或者数据,应用程序间相互通信,监听系统状态(比如开机,网络等) Android中BroadcasetReceiver的注册方式 m

Android中View绘制流程以及invalidate()等相关方法分析(转载的文章,出处在正文已表明)

转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴望了解 Android 框架层的网友,推荐这本书,希望你们能够在Android开发里学到更多的知识 . 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简单概况为 根据之前设置的状态,判断是否需要重新计算视图大小(mea

Android笔记——Android中数据的存储方式(二)

我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效率.如果学过JavaWeb的朋友,首先可能想到的是数据库.当然了数据库是一个方案,那么是否还有其他的解决方案呢?今天我们在讲下Android笔记——Android中数据的存储方式(一) 提到的除了SharedPreferences和Files(文本文件)以外的其他几种数据储存方式:xml文件.SQL

Android 中View的绘制机制源代码分析 三

到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编辑器.这里之所以使用"下定决心"这个词.是由于毕竟Html编辑器使用好几年了.非常多习惯都已经养成了,要改变多年的习惯确实不易.相信这也是还有非常多人坚持使用Html编辑器的原因. 这也反应了一个现象.当人对某一事物非常熟悉时,一旦出现了新的事物想代替老的事物时,人们都有一种抵触的情绪,做

Android 中View的绘制机制源码分析 三

到目前为止,measure过程已经讲解完了,今天开始我们就来学习layout过程,不过在学习layout过程之前,大家有没有发现我换了编辑器,哈哈,终于下定决心从Html编辑器切换为markdown编辑器,这里之所以使用"下定决心"这个词,是因为毕竟Html编辑器使用好几年了,很多习惯都已经养成了,要改变多年的习惯确实不易,相信这也是还有很多人坚持使用Html编辑器的原因.这也反应了一个现象,当人对某一事物非常熟悉时,一旦出现了新的事物想取代老的事物时,人们都有一种抵触的情绪,做技术的

Android中View和ViewGroup介绍

1. 概念Android中的View与我们以前理解的“视图”不同.在Android中,View比视图具有更广的含义,它包含了用户交互和显示,更像Windows操作系统中的window. ViewGroup是View的子类,所以它也具有View的特性,但它主要用来充当View的容器,将其中的View视作自己的孩子,对它的子View进行管理,当然它的孩子也可以是ViewGroup类型. ViewGroup(树根)和它的孩子们(View和ViewGroup)以树形结构形成了一个层次结构,View类有接