前言

由于最近在写一个涉及移动方面的自定义View,在做移动的时候用到了类似offsetTopAndBottom 、setTranslationY、scrollTo、scrollBy等方法,对于他们的使用,有一些不太清晰的地方。比如,view的getX/Y、getSrollX/Y、getTranslationX/Y、getLeft/top/right/bottom、点击事件触发区域等等 是否会受到影响改变,由哪些所影响。

因为View的属性有点多,所以,很多时候你不知道哪些属性受哪些方法影响,并且多种方法联合使用的时候,效果又是如何,影响又是如何。

正题

于是我就开始测试,实践来检验结果。

目前为止大致有这几种方法可以移动view:
1、setTranslationX/Y
2、scrollTo/scrollBy
3、offsetTopAndBottom/offsetLeftAndRight
4、平移动画
5、设置margin

主要是验证一些属性:
1、getX()、getY()
2、getScrollX() 、getScrollY()
3、getTranslationX() 、getTranslationY()
4、getLeft()、 getTop()、 getRight()、 getBottom()(坐标位置是否改变)
5、点击事件触发区域是否改变
6、是否会影响同层级的其他view的位置
7、超过父View是否绘制

现在主要把他们用一张表列出来:

 
稍微整理一下他们各自特点:
setTranslationX/Y
  • getX getY 会变
  • getTranslationXY会变
  • 点击事件的位置也变了但是不会超过父布局
  • 会超过边界到同级View的区域去(被覆盖或者覆盖别人)
  • 这个方法的底层实现主要是通过metrix矩阵变换来的,坐标位置没有改变(跟offset不同,它是通过坐标位置改变)
scrollTo/scrollBy
  • getScrollXY 会变
  • 点击事件还是在原位置 (跟动画类似)
  • 但是内容区域变了(如果超出自己的区域 就显示不出来)
  • 它只是内容区域的移动,本身view是不移动的
  • scrollBy的x y 是相对移动的值
  • scrollTo的x y 是绝对移动的值
offsetTopAndBottom/offsetLeftAndRight
  • 上下左右坐标会变 (主要是通过坐标位置的改变产生移动效果)
  • getXY会变
  • 点击事件的位置也变了
  • 会超过边界到别人的区域去(被覆盖或者覆盖别人)
  • 它的offY是相对移动的值
平移动画
  • 点击事件还是在原位置
  • 如果setFillAfter位置保留 但是其他任何坐标位置没有改变 再次点击从原位置重新开始移动
设置margin
  • 如果父View为wrap的话,设置margin可以移动,但是可能会对同级view造成影响(比如在linear中或者relative中有关联关系)

下面是验证过程:(前方高能,多图预警!!!!!最重要的东西都罗列在前面了,没时间不用往下看了)

 

默认情况log
setTranslationXY:

 

 

指定了父布局

不能超过父布局,会显示不出来

会超过边界到同层view的区域去(被覆盖或者覆盖别人)
  • getX getY 会变
  • getTranslationXY会变
  • 点击事件的位置也变了但是不会超过父布局
  • 会超过边界到同层view的区域去(被覆盖或者覆盖别人--取决于先后顺序)
scrollBy:

 

 
offsetTopAndBottom offsetLeftAndRight:

 

 
动画+setFillAfter(true):

 

 
margin:

 

 

组合


比如先多点几次 offset ,然后再margin会立马回到(原位置+margin)后的状态

 

 

说明:margin的平移效果是以view在父View中的位置和margin值决定的,是父View通过计算margin值之后,重新给你排的位置,实现的移动。当我们设置margin之后,会触发requestLayout,所以父VIew又重新给它排了位置。


如果,我先offset几次,然后再点击动画,动画会在原来的基础上,继续平移。

说明:动画不是根据位置来移动的,可能是根据一个metrix的矩阵变换来实现平移的(请指正)

如果,先scrollBy,然后再动画、offset和其他移动方法,

 

 

说明:其他的平移方法,都是对于view本身在做移动,而不像scrollBy只是对其内容进行平移

总结

好了,差多就这些了,其他更多复杂的组合使用,只要你能逐一弄清楚他们各自起作用的属性和对象,你就能大致摸索出来。
剩下的大家可以去demo看看,然后自己试一试。

作者:Jafir
链接:http://www.jianshu.com/p/a4072dd6816b
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

android view的多种移动方式(测试集合)的更多相关文章

  1. android滑动删除的多种实现方式(一)

    个人习惯,先上图 同事是个妹子(这点很重要),写滑动删除动能的时候用到了SwipeLayout,然后悲催的是,滑动时间被拦截了,解决方法先不提,在(一)中先讲解SwipeLayout下载listvie ...

  2. Android开发中怎样调用系统Email发送邮件(多种调用方式)

    在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...

  3. Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护

    Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护 数据加密又称password学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文.而解密则是通过解密 ...

  4. 简单说说Android自定义view学习推荐的方式

    这几天比较受关注,挺开心的,嘿嘿. 这里给大家总结一下学习自定义view的一些技巧.  以后写自定义view可能不会写博客了,但是可以开源的我会把源码丢到github上我的地址:https://git ...

  5. 有趣的动画视图集合:Android View Animations

    Android View Animations这个项目收集了各种有趣的动画效果. 所有效果: Attension Flash, Pulse, RubberBand, Shake, Swing, Wob ...

  6. C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

    在前面一系列文章中,我们可以看到微信自定义菜单的重要性,可以说微信公众号账号中,菜单是用户的第一印象,我们要规划好这些菜单的内容,布局等信息.根据微信菜单的定义,我们可以看到,一般菜单主要分为两种,一 ...

  7. Android 数据存储五种方式

    1.概述 Android提供了5种方式来让用户保存持久化应用程序数据.根据自己的需求来做选择,比如数据是否是应用程序私有的,是否能被其他程序访问,需要多少数据存储空间等,分别是: ① 使用Shared ...

  8. [转]Android View.onMeasure方法的理解

    转自:http://blog.sina.com.cn/s/blog_61fbf8d10100zzoy.html Android View.onMeasure方法的理解 View在屏幕上显示出来要先经过 ...

  9. 简单研究Android View绘制二 LayoutParams

    2015-07-28 17:23:20 本篇是关于LayoutParams相关 ViewGroup.LayoutParams文档解释如下: LayoutParams are used by views ...

随机推荐

  1. anaconda的spyder打不开

    因为最近一段时间没有用Spyder,今天使用时,发现Spyder又又打不开了. 之前遇到Spyder打不开的情况时,是根据这里的教程:删除.matplotlib和.spyder两个文件,但这次删除这两 ...

  2. Treasure Exploration POJ - 2594(最小边覆盖)

    因为是路  所以 如果 1——3  2——3    3——4   3——5 则 1——4  1——5  2——4   2——5 都是是合法的 又因为机器人是可以相遇的  所以 我们把所有的点 分别放在 ...

  3. 洛谷P3380 【模板】二逼平衡树(树套树,树状数组,线段树)

    洛谷题目传送门 emm...题目名写了个平衡树,但是这道题的理论复杂度最优解应该还是树状数组套值域线段树吧. 就像dynamic ranking那样(蒟蒻的Sol,放一个link骗访问量233) 所有 ...

  4. 洛谷 P2765 魔术球问题 解题报告

    P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面 ...

  5. 【bzoj2001】 Hnoi2010—City 城市建设

    http://www.lydsy.com/JudgeOnline/problem.php?id=2001 (题目链接) 题意 给出一张无向图,$m$组操作,每次修改一条边的权值,对于每次操作输出修改之 ...

  6. apigateway-kong(四)负载均衡理论及实现

    负载均衡(Load balancing)是一种计算机网络技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最佳化资源使用.最大化吞吐率.最小化响应时间.同时 ...

  7. Centos 搭建 http服务器

    1,安装 yum install httpd 2,查看是否安装成功 netstat [root@localhost ~]# netstat -anp | grep 80      tcp 0 0 :: ...

  8. sqoop的安装与配置

    最近需要将MySQL的数据导出到HDFS,所以搜到了sqoop2.跟sqoop1相比,sqoop2的好处是直接使用程序连接到集群上的sqoop,远程操作.流程是需要先创建link也可以理解成要操作的对 ...

  9. Java基础-比较运算符Compare Operators

    Java基础-比较运算符Compare Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.关系运算符 关系运算符包括: 1>.大于(>) 2> ...

  10. nova-api源码分析(APP的创建)

    目录结构如下: 上面介绍了nova-api发布所用到的一些lib库,有了上面的基础知识,再来分析nova-api的发布流程,就比较轻松了.nova-api可以提供多种api服务:ec2, osapi_ ...