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. Terra Vista 6.2

    最近在做虚拟仿真相关工作,想把GIS中的一些想法用虚拟显示技术实现,在保证准确性的同时,提高展现效果. 前不久在朋友圈获得了一个强大的三维地形构建软件Terra Vista 6.2,据说这个软件是加拿 ...

  2. Linux下面配置文件~/.bash_profile

    ~/.的意义是什么? ~ 代表你的/home/用户名目录 假设你的用户名是x,那么~/就是/home/x/ . 是代表此目录本身,但是一般可以不写 所以cd ~/. 和cd ~ 和cd ~/效果是一样 ...

  3. HttpClient 版本变化 转载

    转载地址:http://my.oschina.net/u/577453/blog/173724 最近用到了HttpClient写爬虫,可能我有新版本强迫症,老是喜欢用新版本的东西(虽说新版本不一定好用 ...

  4. App前后台判断

    http://blog.csdn.net/vpractical/article/details/51034360 需求是计算app在后台的时间,当返回前台时,根据时间差来做相应的操作. 思路是让app ...

  5. [linux系统]--spawn 用法

    spawn与except组合可达到远程登录设备执行命令的作用 下面是登录设备的一段代码 #!/usr/bin/expect -f user=root host=1.1.1.1 password=roo ...

  6. 关键字nullable,nonnull,null_resettable,_Null_unspecified详解

    相信在开发过程中,很多小伙伴们儿都会见到nullable,nonnull,null_resettable,_Null_unspecified这几个关键字,但是并不知道它们是什么意思,下面我就给大家一一 ...

  7. js函数的传参是按值传对递

    根据js高级程序设计第三版编写,对于函数的参数只能按值传递是这样解释的: ECMAScript 中所有函数的参数都是按值传递的.也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另 ...

  8. android appwigt

    package com.example.test1; import android.os.Bundle; import android.app.Activity; import android.con ...

  9. msys2安装

    最近在研究编译linux下的软件到windows环境中. 发现了一个比cygwin更好玩的东西,那就是msys2 其实之前也在试玩mingw和mingw64,2016-08-12,当时的最新版本,mi ...

  10. JavaScript学习笔记(一):介绍JavaScript的一些简单知识

    JavaScript是世界上最流行的编程语言.这门语言可用于HTML和web,更可广泛用于服务器.PC.笔记本电脑和智能手机等设备.---------------------------------- ...