btw:这篇博客的内容其实算是《Android开发艺术探索》的一篇读书笔记,在书本的知识上加了一点自己的理解,并用自己的话描述出来。《Android开发艺术探索》是一本不错的书,适合看完了入门书籍之后想要继续提高的读者。

亚马逊链接:

https://www.amazon.cn/Android%E5%BC%80%E5%8F%91%E8%89%BA%E6%9C%AF%E6%8E%A2%E7%B4%A2-%E4%BB%BB%E7%8E%89%E5%88%9A/dp/B014HV1X3K/ref=sr_1_1?ie=UTF8&qid=1467258674&sr=8-1&keywords=Android%E5%BC%80%E5%8F%91%E6%8E%A2%E7%B4%A2

要改变一个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的移动的方法总结的更多相关文章

  1. Android View体系(二)实现View滑动的六种方法

    1.View的滑动简介 View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到View的滑动的处理.其实不管是那种滑动的方式基本思想都是类似的:当触摸事件传到View时,系统 ...

  2. MyEclipse Server view报错解决方法

    MyEclipse Server view报错解决方法 方法/步骤     启动MyEclipse,弹出一个框,报错. ---------------------------------------- ...

  3. web view调h5的方法死活调不到

    (WebViewJavascriptBridge注册方法都能调用,只有callhandlename时无论如何也没响应)这个问题真是纠缠我好久了 webview评论区刷新问题终于找到原因了 ,我试着把咨 ...

  4. Android -- View移动的六种方法

    layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView ...

  5. 如何在低api中使用View的属性设置方法如setAlpha等

    ViewPagerTransforms 是一个自定义了各种翻转效果的开源库,其中的各种PageTransformer使用了view的很多属性设置方法如DepthPageTransformer中:? p ...

  6. 该View转换成Bitmap方法

    方法一: /** * 该View绘制到Bitmap上 * @param view 须要绘制的View * @param width 该View的宽度 * @param height 该View的高度 ...

  7. 得到view坐标的各种方法

    这篇文章讲的方法全是再控件可以获取焦点的情况下执行的,如果在oncreat()里面执行,那么得到的都是0 1.getLocationInWindow 这个方法得到的是view相对于当前Activity ...

  8. View的setLayerType() , setDrawingCacheEnabled() 方法用法

    一.Android开发:用getDrawingCache方法获取ImageView中的图像需要注意的问题http://www.linuxidc.com/Linux/2011-09/43131.htm ...

  9. Laravel 控制器 Controller 传值到 视图 View 的几种方法总结

    单个值的传递   with public function index() { $test = "测试"; return view('test.index')->with(' ...

随机推荐

  1. Oracle Partition By 的使用

    1.概述 Parttion by 关键字是Oracle中分析性函数的一部分,它和聚合函数不同的地方在于它能够返回一个分组中的多条记录,儿聚合函数一般只有一条反映统计值的结果. 2.使用方式 场景:查询 ...

  2. href="javascript:function()" 和onclick的区别

    href='javascript:function()'和onclick能起到同样的效果,一般来说,如果要调用脚本还是在onclick事件里面写代码,而不推荐在href='javascript:fun ...

  3. java ide 导出可运行jar包

    常常会用到写个jar搬到其他地方运行的情况,这里做个笔记记录下如何利用eclipse或者idea导出jar. 导出jar包最好的方式个人认为是把依赖的包都打包进目标jar,这样一个jar可以很happ ...

  4. 关闭编辑easyui datagrid table

    var rows = dg.datagrid('getRows');    for (var i = 0; i < rows.length; i++) {        dg.datagrid( ...

  5. c++多线程の数据竞争和互斥对象

    看两个代码: void function() { ;i>;i--) { cout<<"from sub thread"+i<<endl; } } vo ...

  6. 启动tomcat时,报错:IOException while loading persisted sessions: java.io.EOFException解决方法

    报错原因:加载持久化session错误,tomcat加载时读取的文件是是*.ser,session序列化文件,文件的位置是tomcat\work\Catalina\localhost,找到sessio ...

  7. mac上eclipse用gdb调试(转)

    mac上eclipse用gdb调试 With its new OS release, Apple has discontinued the use of GDB in OS X. Since 2005 ...

  8. spark使用02

    1.rdd的初始化 1.1 读取文件来初始化rdd(通过sparkContext的textFile方法) 1.1.1 读取本地文件 SparkConf conf = new SparkConf().s ...

  9. DateEdit控件的使用

    按照年月日时分秒显示时间 1. 设置Mask.EditMask和DisplayFormat,EditFormat属性,设置为一致:'yyyy-MM-dd HH:mm';  //按照想要的显示格式设置此 ...

  10. PS切图篇

    一.PS界面设置 1.新建(ctrl+n) 初始化尺寸参数 预设:自定 宽度:1920px 高度:自设(如:2000px) 分辨率:72像素/英寸 颜色:RGB/8位 背景内容:透明 存储为预设 2. ...