实现View的移动的方法总结
btw:这篇博客的内容其实算是《Android开发艺术探索》的一篇读书笔记,在书本的知识上加了一点自己的理解,并用自己的话描述出来。《Android开发艺术探索》是一本不错的书,适合看完了入门书籍之后想要继续提高的读者。
亚马逊链接:
要改变一个View的位置,也就是实现View的移动,目前知道的方法有setLayoutParams(),scrollTo()和scrollBy(),layout(),offsetLeftAndRight()和offsetTopAndBottom(),位移动画和属性动画,在这里做一个总结:
setLayoutParams()
MarginLayoutParams params = (MarginLayoutParams)view.getLayoutParams();params.leftMargin += 100; view.setLayoutParams(params);
通过改变布局参数来达到移动的效果,但前提是View所在的ViewGroup支持margin属性。并不是所有的ViewGroup都支持margin属性,比如AbsoluteLayout。
scrollTo()和scrollBy()
ViewGroup group = (ViewGroup) view.getParent(); group.scrollTo(-100, -100); // 移动到(100, 100) group.scrollBy(-100, -100); // 在当前位置基础上向右、向下移动100px
scrollTo()是移动到指定位置,scrollBy()是在当前位置的基础上进行移动。
使用scrollTo(int x, int y)和scrollBy(int x, int y)方法进行移动时,若x是正数则向左移动,是负数则向右移动,同理,若y是正数则向上移动,是负数则向下移动。
scrollTo()和scrollBy并不是作用在View自己身上的,而是移动它的子View,所以如果要使用scrollTo()和scrollBy()方法来移动View,需要让View的父View来调用scrollTo()或scrollBy()方法。
ViewGroup调用scrollTo()或scrollBy()方法,移动的是它所有的子View。
layout()
int left = view.getLeft(); int top = view.getTop(); int right = view.getRight(); int bottom = view.getBottom(); int offset = 100; view.layout(left + offset, top + offset, right + offset, bottom + offset);
layout(int left, int top, int right, int bottom)的四个参数left、top、right、bottom的含义:
- left: View的左边到父ViewGroup的左边的距离
- top: View的顶边到父ViewGroup的顶边的距离
- right: View的右边到父ViewGroup的左边的距离
- bottom: View的底边到父ViewGroup的顶边的距离
offsetLeftAndRight()和offsetTopAndBottom()
view.offsetLeftAndRight(100); // 向右移动100px view.offsetTopAndBottom(100); // 向下移动100px
offsetLeftAndRight(int offset)中的offset为正数时是向右移动,为负数时是向左移动,offsetTopAndBottom()以此类推,这和scrollTo()、scrollBy()的情况相反。
setLeft(), setRight(), setTop(), setBottom()
public void moveTo(int x, int y) {
setLeft(x);
setRight(x + getMeasuredWidth());
setTop(y);
setBottom(y + getMeasuredHeight());
}
调用View的方法setLeft()可以改变View相对于父ViewGroup的left值,调用setRight(x + getMeasuredWidth())设置View相对于父ViewGroup的right值,这样可以保持View的width不会改变,同理设置setTop(y)和setBottom(y + getMeasuredHeight()),这样就对View的四个坐标都进行了设置,因此实现了View的移动。
TranslateAnimation
Animation anim = new TranslateAnimation(0, 100, 0, 100); anim.setFillAfter(true); // 动画结束后是否保持在动画结束时的状态 anim.setDuration(1500); // 动画持续时间 view.startAnimation(anim);
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)中四个参数的含义:
- fromXDelta:动画开始时View相对于父ViewGroup的X坐标
- toXDelta:动画结束时View相对于父ViewGroup的X坐标
- fromYDelta:动画开始时View相对于父ViewGroup的Y坐标
- toYDelta:动画结束时View相对于父ViewGroup的Y坐标
需要注意的是,TranslateAnimation所造成的View的移动是一种假象,实际上View的位置并没有发生改变。从下面的动图中可以看到,在位移动画结束以后,再点击Button并没有反应,而点击Button之前的位置却能再次触发位移动画。

ObjectAnimator
ObjectAnimator transX = ObjectAnimator.ofFloat(view, "translationX", 0f, 100f); ObjectAnimator transY = ObjectAnimator.ofFloat(view, "translationY", 0f, 100f); AnimatorSet set = new AnimatorSet(); set.setDuration(1500); set.playTogether(transX, transY); set.start();
- ObjectAnimator.ofFloat(Object target, String propertyName, float... values)三个参数的含义是:
- target: 进行属性动画的Object,这里是view
- propertyName: 进行属性动画的类型字符串,"translationX"表示要进行的是X轴的平移, "translationY"表示要进行的是Y轴的平移,其他的还有"scaleX","scaleY","rotation"等等。
- values: 可变参数,参数只有一个时,从当前状态变化到这个参数的状态,有多个参数时,从第一个参数的状态逐个变化到下一个参数的状态。
如果要单独进行某个属性动画,可以:
ObjectAnimator.ofFloat(view, "translationX", 0f, 100f).setDuration(1500).start();
和位移动画不同的是,属性动画进行的移动会真正影响到View的位置。

以上就是关于View的移动的几种方法。如果还有其他的方法,会及时补充。
实现View的移动的方法总结的更多相关文章
- Android View体系(二)实现View滑动的六种方法
1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统 ...
- MyEclipse Server view报错解决方法
MyEclipse Server view报错解决方法 方法/步骤 启动MyEclipse,弹出一个框,报错. ---------------------------------------- ...
- web view调h5的方法死活调不到
(WebViewJavascriptBridge注册方法都能调用,只有callhandlename时无论如何也没响应)这个问题真是纠缠我好久了 webview评论区刷新问题终于找到原因了 ,我试着把咨 ...
- Android -- View移动的六种方法
layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView ...
- 如何在低api中使用View的属性设置方法如setAlpha等
ViewPagerTransforms 是一个自定义了各种翻转效果的开源库,其中的各种PageTransformer使用了view的很多属性设置方法如DepthPageTransformer中:? p ...
- 该View转换成Bitmap方法
方法一: /** * 该View绘制到Bitmap上 * @param view 须要绘制的View * @param width 该View的宽度 * @param height 该View的高度 ...
- 得到view坐标的各种方法
这篇文章讲的方法全是再控件可以获取焦点的情况下执行的,如果在oncreat()里面执行,那么得到的都是0 1.getLocationInWindow 这个方法得到的是view相对于当前Activity ...
- View的setLayerType() , setDrawingCacheEnabled() 方法用法
一.Android开发:用getDrawingCache方法获取ImageView中的图像需要注意的问题http://www.linuxidc.com/Linux/2011-09/43131.htm ...
- Laravel 控制器 Controller 传值到 视图 View 的几种方法总结
单个值的传递 with public function index() { $test = "测试"; return view('test.index')->with(' ...
随机推荐
- Interpolation particles In Katana
I write the sphere radius interpolation for katana plugin that can transfer attributes,render attrib ...
- (转)漫谈SOA(面向服务架构)
http://blog.csdn.net/luohuacanyue/article/details/12521699 面向服务架构的思想在整个软件的架构中已经不是什么新鲜的东西.我简单的认为服务化是模 ...
- 山东省第七届ACM省赛------Reversed Words
Reversed Words Time Limit: 2000MS Memory limit: 131072K 题目描述 Some aliens are learning English. They ...
- 测试机安装fd-server问题记录
今天在239测试机上安装了fd-server来代替apache,汇总下遇到的问题和解决方法. 1. 安装git时使用yum安装,命令 yum install git 2. 启动fd-server之前要 ...
- wsdl学习
本文来自 :迹忆 原文地址:http://www.onmpw.com/tm/xwzj/network_47.html 在刚开始学习Webservice的时候,发现里面涉及到的知识点还真不少,每一点单拿 ...
- jdbc连接mysql
package june25jdbcTest; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Res ...
- JAVA模拟HTTP post请求上传文件
在开发中,我们使用的比较多的HTTP请求方式基本上就是GET.POST.其中GET用于从服务器获取数据,POST主要用于向服务器提交一些表单数据,例如文件上传等.而我们在使用HTTP请求时中遇到的比较 ...
- HDFS shell
bin/hdfs -help bin/hdfs dfs -mkdir -p /yfq/test/ bin/hdfs dfs -put /etc/profile /yfq/test/profile 上传 ...
- Win7下Doxygen配置与使用
1. 下载与安装 1.1 下载 Doxygen官方安装程序及其手册下载地址,目前使用版本为1.8.8. 安装程序:http://www.stack.nl/~dimitri/doxygen/downl ...
- 移动端web开发基础概念
最近在了解移动端web开发的相关知识,有些概念总是模糊不清,这次花费了一些时间整体的梳理了一遍. 分辨率 分辨率可以从显示分辨率与图像分辨率两个方向来分类.显示分辨率(屏幕分辨率)是屏幕图像的精密度, ...