Android -- View移动的六种方法
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)
需要说明的是:
- computeScrollOffset方法用来判断是否完成了整个滑动,返回为true,则说明没有完成,否则则完成滑动。
- getCurrY()以及getCurrX()获得的是当前的滑动坐标。
- 最后必须要用invalidate方法来刷新。因为computeScroll方法不会自动调用,是在draw方法中被调用的。所以必须使用invalidate刷新,就会调用draw方法,自然就会调用computeScroll方法了。这样子就会实现循环调用。
- 在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移动的六种方法相关推荐
- Android View移动的六种方法
如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. layout public class DragView ex ...
- Android View的坐标获取方法
Android View的坐标获取方法 Android系统中提供了很多方法来获取view的坐标值,相对距离等,但是方法多在使用上就容易产生混淆,这里总结下自己学到的知识,分享给有需要的人. 如图所示: ...
- android.view.WindowLeaked的解决方法
Android.view.WindowLeaked一般会发生在Activity中Dialog的显示. android的dialog创建的时候会传入一个参数this,就是当前的activity,dial ...
- android view销毁回调,Android View 常用的回调方法
onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(boolean, int, int, ...
- Android View体系(十)自定义组合控件
相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源 ...
- Android View体系(三)属性动画
上一篇文章讲了View滑动的六种方法,其中一种是使用动画,这篇文章我们来讲一讲动画的其中一种:属性动画. 1.android视图动画和属性动画 视图动画我们都了解,它提供了AlphaAnimation ...
- Android View体系(五)从源码解析View的事件分发机制
Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...
- 关于android.view.WindowLeaked(窗体泄露)的解决方案
虽然是小问题一个,但也困扰了我一段时间,现在记下来,给自己做个备忘,也可以给其他人一个参考 Java代码 view plaincopy to clipboardprint? 01-08 01:49 ...
- android 虚方法,尝试在空对象引用上调用虚方法’android.view.View android.view.View.getRootView()’...
我收到这个错误, "Attempt to invoke virtual method 'android.view.View android.view.View.getRootView()' ...
最新文章
- 易语言操作mysql数据库
- [BZOJ5312]冒险(势能线段树)
- Java和Lagom的CQRS
- 第九期: 阿里巴巴程序员常用的15款开发者工具
- 零基础入门深度学习(5) - 循环神经网络
- 最新快手面试题(含总结):设计模式+红黑树+Java锁+Redis等
- Java I/O系统之OutputStream
- 微信公众号,微信授权进不去
- 【matlab】拉普拉斯变换与反变换
- Python实现音频文件格式转化
- arduiono电子音乐代码_使用Word2003的EQ域代码制作音乐简谱
- MSP430初学three
- 微生物组-扩增子16S分析和可视化(2022.10)
- web统计:UV、IP、PV、VV
- STL之vector中push_back的时间复杂度分析
- 怎么实现一个计算一年中有多少周?
- 计算机怎么没有word文档,word没了怎么回事 为什么电脑没有了word
- 最菜的我打卡的第二天
- MN梦奈宝塔主机系统V1.5版本发布
- 鱼类接连被查出问题 专家提出安全“吃鱼意见”