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

layout

public class DragView extends View{ private int lastX; private int lastY; public DragView(Context context, AttributeSet attrs) { super(context, attrs); } public boolean onTouchEvent(MotionEvent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; //调用layout方法来重新放置它的位置 layout(getLeft()+offX, getTop()+offY, getRight()+offX , getBottom()+offY); break; } return true; } }

LayoutParams

public boolean onTouchEvent(MotionEvent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; ViewGroup.MarginLayoutParams mlp = (MarginLayoutParams) getLayoutParams(); mlp.leftMargin = getLeft()+offX; mlp.topMargin = getTop()+offY; setLayoutParams(mlp); break; } return true; }

scrollTo() scrollBy()

sceollTo(x,y)传入的应该是移动的终点坐标

scrollBy(dx,dy)传入的是移动的增量。

通过scrollBy传入的值应该是你需要的那个增量的相反数!

public boolean onTouchEvent(MotionEvent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; ((View) getParent()).scrollBy(-offX,- offY); break; } return true; }

Scroller

步骤一:

​ 初始化Scroller对象,即mScroller = new Scroller(context)

步骤二:

​ 重写computeScroll()方法,实现模拟滑动。可以复制下面的末模板代码:

public void computeScroll() { super.computeScroll(); if(mScroller.computeScrollOffset()){ ((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); } invalidate();//必须要调用 }

步骤三:

开启模拟过程,在合适的地方(一般都在move中)startScroll方法。它有两个重载方法如下:

startScroll(int startX,int startY, int dx,int dy,int duration)

startScroll(int startX,int startY,int dx,int dy)

需要说明的是:

  1. computeScrollOffset方法用来判断是否完成了整个滑动,返回为true,则说明没有完成,否则则完成滑动。
  2. getCurrY()以及getCurrX()获得的是当前的滑动坐标。
  3. 最后必须要用invalidate方法来刷新。因为computeScroll方法不会自动调用,是在draw方法中被调用的。所以必须使用invalidate刷新,就会调用draw方法,自然就会调用computeScroll方法了。这样子就会实现循环调用。
  4. 在startScroll中,偏移量跟使用scrollBy方法中的偏移量用法是一样的,即也必须填写你实际想要移动距离的相反数。也就是你实际想让它偏移一个正值,这里就填写它相应的负值,如果想偏移一个负值,这里就填写相应的正值!
public class DragView extends View{ private int lastX; private int lastY; private Scroller mScroller; public DragView(Context context, AttributeSet attrs) { super(context, attrs); mScroller = new Scroller(context); } public boolean onTouchEvent(MotionEvent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; View viewGroup = (View) getParent(); ((View) getParent()).scrollBy(-offX,- offY); break; case MotionEvent.ACTION_UP: View viewGroup = (View) getParent(); //开启滑动,让其回到原点 mScroller.startScroll(viewGroup.getScrollX(), viewGroup.getScrollY(), -viewGroup.getScrollX() ,-viewGroup.getScrollY()); break; } return true; } public void computeScroll() { super.computeScroll(); if(mScroller.computeScrollOffset()) { ((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); } invalidate();//必须要调用 } }

offsetLeftAndRight() offsetTopAndBottom()

其实这两个方法分别是对左右移动和上下移动的封装,传入的就是偏移量。

public boolean onTouchEvent(MotionEvent event) { //获取到手指处的横坐标和纵坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: lastX = x; lastY = y; break; case MotionEvent.ACTION_MOVE: //计算移动的距离 int offX = x - lastX; int offY = y - lastY; offsetLeftAndRight(offX); offsetTopAndBottom(offY); break; } return true; }

详细:《Android -- Scroller》http://www.cnblogs.com/yydcdut/p/4472340.html

ViewDragHelper

ViewDragHelper可以看这篇文章:《Android -- ViewDragHelper》http://www.cnblogs.com/yydcdut/p/4945052.html

我是天王盖地虎的分割线

参考:http://www.cnblogs.com/fuly550871915/p/4985053.html

Android View移动的六种方法相关推荐

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

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

  2. Android View的坐标获取方法

    Android View的坐标获取方法 Android系统中提供了很多方法来获取view的坐标值,相对距离等,但是方法多在使用上就容易产生混淆,这里总结下自己学到的知识,分享给有需要的人. 如图所示: ...

  3. android.view.WindowLeaked的解决方法

    Android.view.WindowLeaked一般会发生在Activity中Dialog的显示. android的dialog创建的时候会传入一个参数this,就是当前的activity,dial ...

  4. android view销毁回调,Android View 常用的回调方法

    onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int, ...

  5. Android View体系(十)自定义组合控件

    相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...

  6. Android View体系(三)属性动画

    上一篇文章讲了View滑动的六种方法,其中一种是使用动画,这篇文章我们来讲一讲动画的其中一种:属性动画. 1.android视图动画和属性动画 视图动画我们都了解,它提供了AlphaAnimation ...

  7. Android View体系(五)从源码解析View的事件分发机制

    Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...

  8. 关于android.view.WindowLeaked(窗体泄露)的解决方案

    虽然是小问题一个,但也困扰了我一段时间,现在记下来,给自己做个备忘,也可以给其他人一个参考 Java代码   view plaincopy to clipboardprint? 01-08 01:49 ...

  9. android 虚方法,尝试在空对象引用上调用虚方法’android.view.View android.view.View.getRootView()’...

    我收到这个错误, "Attempt to invoke virtual method 'android.view.View android.view.View.getRootView()' ...

最新文章

  1. html5日期转long
  2. stm32--对固件库的认识2
  3. 基于ZF网络的Faster RCNN网络结构详解(非常详细版)
  4. 02.elasticsearch-meta-field元字段
  5. java版 二叉树 所有递归和非递归遍历算法
  6. DenyHosts清除黑名单IP地址方法
  7. 过滤器做权限校验以及遇到的坑
  8. 【Kafka】01 生产者
  9. C++复合类型-指针变量
  10. visio2010下载地址中文版本32位中文版本64位和激活密钥方法分享哦
  11. 高斯函数与高斯核函数
  12. 618的优惠券去哪了?
  13. windows 7计算机用户名和密码忘了,教你电脑密码忘了怎么办
  14. Apache PdfBox 2.0.X 版本解析PDF文档(文字和图片)
  15. android edittext 手机号码,Android Edittext 手机号码格式输入设置
  16. 小程序 - 接入支付宝预授权支付 笔记
  17. 解决安装文件时2502、2503错误
  18. Orkut 试用报告
  19. 读书笔记:《七周七数据库》
  20. 列表中的导航菜单的制作

热门文章

  1. SaltStack二次开发api
  2. .$nextTick 延迟回调
  3. Android事件分发浅析
  4. python terminal_在PyCharm的 Terminal(终端)切换Python版本的方法
  5. java的有意思的_发现一个有意思的项目banana
  6. Object工具类 ObjectUtils.java
  7. HttpClient 入门与正确使用姿势
  8. JS, CSS 文件压缩与反压缩工具
  9. 单片机上电总是立即执行按键程序
  10. web编程 模块1 html,Web编程基础第1章HTML基础.ppt