layout()

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

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;}
}

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;}

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();//必须要调用}
}

详细:《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/yydcdut/p/5042662.html,如需转载请自行联系原作者

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

  1. Android View移动的六种方法

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

  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. 易语言操作mysql数据库
  2. [BZOJ5312]冒险(势能线段树)
  3. Java和Lagom的CQRS
  4. 第九期: 阿里巴巴程序员常用的15款开发者工具
  5. 零基础入门深度学习(5) - 循环神经网络
  6. 最新快手面试题(含总结):设计模式+红黑树+Java锁+Redis等
  7. Java I/O系统之OutputStream
  8. 微信公众号,微信授权进不去
  9. 【matlab】拉普拉斯变换与反变换
  10. Python实现音频文件格式转化
  11. arduiono电子音乐代码_使用Word2003的EQ域代码制作音乐简谱
  12. MSP430初学three
  13. 微生物组-扩增子16S分析和可视化(2022.10)
  14. web统计:UV、IP、PV、VV
  15. STL之vector中push_back的时间复杂度分析
  16. 怎么实现一个计算一年中有多少周?
  17. 计算机怎么没有word文档,word没了怎么回事 为什么电脑没有了word
  18. 最菜的我打卡的第二天
  19. MN梦奈宝塔主机系统V1.5版本发布
  20. 鱼类接连被查出问题 专家提出安全“吃鱼意见”

热门文章

  1. ​产品经理如何学机器学习——一篇以产品为中心的机器学习概论
  2. Spring Boot 实现通用 Auth 认证的 4 种方式
  3. 盘点 HashMap 源码中的那些优雅的设计!
  4. Elasticsearch索引生命周期管理方案
  5. 必须了解的MySQL三大日志:binlog、redo log和undo log
  6. 爱了!Intellij IDEA 自带的 Vim 插件真心不错
  7. 你真的会写二分检索吗?
  8. API 网关从入门到放弃
  9. 从绩点 1.8 逆袭的复旦博士,华为天才少年!
  10. 超参数调优河伯、组合优化器CompBO,华为诺亚开源贝叶斯优化库