layout()

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

  1. public class DragView extends View{
  2. private int lastX;
  3. private int lastY;
  4. public DragView(Context context, AttributeSet attrs) {
  5. super(context, attrs);
  6. }
  7. public boolean onTouchEvent(MotionEvent event) {
  8. //获取到手指处的横坐标和纵坐标
  9. int x = (int) event.getX();
  10. int y = (int) event.getY();
  11. switch(event.getAction()){
  12. case MotionEvent.ACTION_DOWN:
  13. lastX = x;
  14. lastY = y;
  15. break;
  16. case MotionEvent.ACTION_MOVE:
  17. //计算移动的距离
  18. int offX = x - lastX;
  19. int offY = y - lastY;
  20. //调用layout方法来重新放置它的位置
  21. layout(getLeft()+offX, getTop()+offY,
  22. getRight()+offX , getBottom()+offY);
  23. break;
  24. }
  25. return true;
  26. }
  27. }

offsetLeftAndRight() offsetTopAndBottom()

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

  1. public boolean onTouchEvent(MotionEvent event) {
  2. //获取到手指处的横坐标和纵坐标
  3. int x = (int) event.getX();
  4. int y = (int) event.getY();
  5. switch(event.getAction()){
  6. case MotionEvent.ACTION_DOWN:
  7. lastX = x;
  8. lastY = y;
  9. break;
  10. case MotionEvent.ACTION_MOVE:
  11. //计算移动的距离
  12. int offX = x - lastX;
  13. int offY = y - lastY;
  14. offsetLeftAndRight(offX);
  15. offsetTopAndBottom(offY);
  16. break;
  17. }
  18. return true;
  19. }

LayoutParams

  1. public boolean onTouchEvent(MotionEvent event) {
  2. //获取到手指处的横坐标和纵坐标
  3. int x = (int) event.getX();
  4. int y = (int) event.getY();
  5. switch(event.getAction()){
  6. case MotionEvent.ACTION_DOWN:
  7. lastX = x;
  8. lastY = y;
  9. break;
  10. case MotionEvent.ACTION_MOVE:
  11. //计算移动的距离
  12. int offX = x - lastX;
  13. int offY = y - lastY;
  14. ViewGroup.MarginLayoutParams mlp =
  15. (MarginLayoutParams) getLayoutParams();
  16. mlp.leftMargin = getLeft()+offX;
  17. mlp.topMargin = getTop()+offY;
  18. setLayoutParams(mlp);
  19. break;
  20. }
  21. return true;
  22. }

scrollTo() scrollBy()

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

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

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

  1. public boolean onTouchEvent(MotionEvent event) {
  2. //获取到手指处的横坐标和纵坐标
  3. int x = (int) event.getX();
  4. int y = (int) event.getY();
  5. switch(event.getAction()){
  6. case MotionEvent.ACTION_DOWN:
  7. lastX = x;
  8. lastY = y;
  9. break;
  10. case MotionEvent.ACTION_MOVE:
  11. //计算移动的距离
  12. int offX = x - lastX;
  13. int offY = y - lastY;
  14. ((View) getParent()).scrollBy(-offX,- offY);
  15. break;
  16. }
  17. return true;
  18. }

Scroller

步骤一:

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

步骤二:

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

  1. public void computeScroll() {
  2. super.computeScroll();
  3. if(mScroller.computeScrollOffset()){
  4. ((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
  5. }
  6. invalidate();//必须要调用
  7. }

步骤三:

开启模拟过程,在合适的地方(一般都在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方法中的偏移量用法是一样的,即也必须填写你实际想要移动距离的相反数。也就是你实际想让它偏移一个正值,这里就填写它相应的负值,如果想偏移一个负值,这里就填写相应的正值!
  1. public class DragView extends View{
  2. private int lastX;
  3. private int lastY;
  4. private Scroller mScroller;
  5. public DragView(Context context, AttributeSet attrs) {
  6. super(context, attrs);
  7. mScroller = new Scroller(context);
  8. }
  9. public boolean onTouchEvent(MotionEvent event) {
  10. //获取到手指处的横坐标和纵坐标
  11. int x = (int) event.getX();
  12. int y = (int) event.getY();
  13. switch(event.getAction()){
  14. case MotionEvent.ACTION_DOWN:
  15. lastX = x;
  16. lastY = y;
  17. break;
  18. case MotionEvent.ACTION_MOVE:
  19. //计算移动的距离
  20. int offX = x - lastX;
  21. int offY = y - lastY;
  22. View viewGroup = (View) getParent();
  23. ((View) getParent()).scrollBy(-offX,- offY);
  24. break;
  25. case MotionEvent.ACTION_UP:
  26. View viewGroup = (View) getParent();
  27. //开启滑动,让其回到原点
  28. mScroller.startScroll(viewGroup.getScrollX(),
  29. viewGroup.getScrollY(),
  30. -viewGroup.getScrollX() ,-viewGroup.getScrollY());
  31. break;
  32. }
  33. return true;
  34. }
  35. public void computeScroll() {
  36. super.computeScroll();
  37. if(mScroller.computeScrollOffset()) {
  38. ((View)getParent()).scrollTo(mScroller.getCurrX(),
  39. mScroller.getCurrY());
  40. }
  41. invalidate();//必须要调用
  42. }
  43. }

详细:《Android -- Scrollerhttp://www.cnblogs.com/yydcdut/p/4472340.html

ViewDragHelper

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

我是天王盖地虎的分割线

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

Android -- View移动的六种方法的更多相关文章

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

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

  2. android中实现view可以滑动的六种方法续篇(二)

    承接上一篇,上一篇中讲解了实现滑动的第五种方法,如果你还没读过,可点击下面链接: http://www.cnblogs.com/fuly550871915/p/4985482.html 这篇文章现在来 ...

  3. Android View体系(四)从源码解析Scroller

    在Android View体系(二)实现View滑动的六种方法这篇文章中我们讲到了用Scroller来实现View的滑动,所以这篇文章我们就不介绍Scroller是如何使用的了,本篇就从源码来分析下S ...

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

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

  5. Android View体系(八)从源代码解析View的layout和draw流程

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

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

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

  7. Android View体系(九)自定义View

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

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

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

  9. android中实现view可以滑动的六种方法

    在android开发中,经常会遇到一个view需要它能够支持滑动的需求.今天就来总结实现其滑动的六种方法.其实每一种方法的 思路都是一样的,即:监听手势触摸的坐标来实现view坐标的变化,从而实现vi ...

随机推荐

  1. MySql链接字符串 各种程序连接大合集(包括asp.net,c#,等等)

    一.MySQL Connector/ODBC 2.50 (MyODBC 2.50)连接方式 1.本地数据库连接Driver={MySQL};Server=localhost;Option=16834; ...

  2. 开启Tomcat 源码调试

    开启Tomcat 源码调试 因为工作的原因,需要了解Tomcat整个架构是如何设计的,正如要使用Spring MVC进行Web开发,需要了解Spring是如何设计的一样,有哪些主要的类,分别是用于干什 ...

  3. 【转】MySQL 高可用架构在业务层面的分析研究

    原文地址 http://database.51cto.com/art/201507/483463_all.htm 前言: 相对于传统行业的相对服务时间9x9x6或者9x12x5,因为互联网电子商务以及 ...

  4. Linux IPC udp/ip socket 编程

    模型 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include < ...

  5. C语言基本类型之long long int

    大家都知道int在linux系统下默认是占4个字节,数值表示范围是:-2147483648~2147483647.即使是无符号unsigned int类型表示范围:0-4294967295,大约42亿 ...

  6. 腾讯TOS

    腾讯TOS 手机操作系统 3月3日开启内测[日期:2015-02-11]     来源:Linux社区  作者:Linux     [字体:大 中 小] 腾讯TOS 操作系统 3月3日开启内测 2月1 ...

  7. no CONFIG_BQL

    [PATCH] net: make CONFIG_BQL actually end user configurable Without the defining string or help text ...

  8. CentOS 6.3下配置软RAID(Software RAID)

    一.RAID 简介 RAID 是英文Redundant Array of Independent Disks 的缩写,翻译成中文意思是“独立磁盘冗余阵列”,有时也简称磁盘阵列(Disk Array). ...

  9. <mvc:default-servlet-handler/>导致SimpleUrlHandlerMapping失效

    整理springmvc的demo的时候遇到一件奇葩事情,本来就是想简单演示一下SimpleUrlHandlerMapping的用法就完活.结果写好demo怎么都无法进行映射,就好像根本就没有创建Sim ...

  10. C# WebService URL重写

    背景 有时候我们会有这样的需求,将 WebService URL 中的 asmx 后缀去掉:或者我们要模拟普通 Web 的 URL,接口名称直接拼接在 URL 中.这些情况我们都要用到URL重写. 关 ...