Android移动View的几种方式
2015-11-19 23:54
531 查看
概述
View位置的变化和触控操作都涉及到MotionEvent类,
MotionEvent中封装了一些与触摸相关的东西,比如触摸事件
Action,触摸坐标等。移动
View无疑就是改变其位置,通常有以下几种方式。
onTouchEvent
在View类中,我们知道有一个
layout方法是给
View定位的 ,结合
onTouchEvent方法 ,我们可以很好的实现一个
View的移动.
int lastX, lastY; @Override public boolean onTouchEvent(MotionEvent event) { int rawX = (int) event.getRawX(); int rawY = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = rawX; lastY = rawY; break; case MotionEvent.ACTION_MOVE: int offsetX = rawX - lastX; int offsetY = rawY - lastY; layout(getLeft()+offsetX, getTop()+offsetY, getRight()+offsetX, getBottom()+offsetY); lastX = rawX; lastY = rawY; break; } return true; }
这里面使用了绝对坐标,使用绝对坐标的时候,需要在每次
ACTION_MOVE后重新设置初始坐标.
offsetLeftAndRight()
使用offsetLeftAndRight();offsetTopAndBottom();方法,通过设置偏移量来滑动View
int lastX, lastY; @Override public boolean onTouchEvent(MotionEvent event) { int rawX = (int) event.getRawX(); int rawY = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = rawX; lastY = rawY; break; case MotionEvent.ACTION_MOVE: int offsetX = rawX - lastX; int offsetY = rawY - lastY; //layout(getLeft()+offsetX, // getTop()+offsetY, // getRight()+offsetX, // getBottom()+offsetY); offsetLeftAndRight(offsetX); offsetTopAndBottom(offsetY); lastX = rawX; lastY = rawY; break; } return true; }
LayoutParams
LayoutParams,使用
LayoutParams滑动
View,通过改变布局参数来达到滑动
View的目的.
int lastX, lastY; @Override public boolean onTouchEvent(MotionEvent event) { int rawX = (int) event.getRawX(); int rawY = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = rawX; lastY = rawY; break; case MotionEvent.ACTION_MOVE: int offsetX = rawX - lastX; int offsetY = rawY - lastY; // layout(getLeft()+offsetX, // getTop()+offsetY, // getRight()+offsetX, // getBottom()+offsetY); // offsetLeftAndRight(offsetX); // offsetTopAndBottom(offsetY); ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams(); layoutParams.leftMargin = getLeft() + offsetX ; layoutParams.topMargin = getTop() +offsetY; setLayoutParams(layoutParams); lastX = rawX; lastY = rawY; break; } return true; }
ScrollTo() ScrollBy()
使用ScrollTo() 和ScrollBy()方法来改变
View的位置.
int lastX, lastY; @Override public boolean onTouchEvent(MotionEvent event) { int rawX = (int) event.getRawX(); int rawY = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = rawX; lastY = rawY; break; case MotionEvent.ACTION_MOVE: int offsetX = rawX - lastX; int offsetY = rawY - lastY; // layout(getLeft()+offsetX, // getTop()+offsetY, // getRight()+offsetX, // getBottom()+offsetY); // offsetLeftAndRight(offsetX); // offsetTopAndBottom(offsetY); // ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams(); // layoutParams.leftMargin = getLeft() + offsetX ; // layoutParams.topMargin = getTop() +offsetY; // setLayoutParams(layoutParams); ((View) getParent()).scrollBy( -offsetX, -offsetY); lastX = rawX; lastY = rawY; break; } return true; }
这里需要注意的是
1.首先我们的
ScrollTo() and ScrollBy()方法移动的是View的Content
2.我们移动的是画布,因此需要设置相反的值,才能让
View跟随手指移动.
Scroller
使用Scroller类来移动
View,与
ScrollBy()方法关系紧密,
ScrollBy()移动是瞬时完成,
Scroller类在
ACTION_MOVE中对偏移量进行划分,达到平滑效果.我们需要三个步骤
mScroller = new Scroller(context);
@Override public void computeScroll() { super.computeScroll(); if (mScroller.computeScrollOffset()) { ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); invalidate(); } }
case MotionEvent.ACTION_UP: ViewGroup viewGroup = (ViewGroup) getParent(); mScroller.startScroll(viewGroup.getScrollX(),viewGroup.getScrollY(),-viewGroup.getScrollX(),-viewGroup.getScrollY()); invalidate(); break;
Property Animation
通过 属性动画对View位置对改变
int w = text.getWidth(); int screenW = UiUtil.getScreenWidth(); int transX = screenW - w; ObjectAnimator transAnim = ObjectAnimator.ofFloat(text, "translationX", 0, transX);
ViewDragHelper
使用v4包中的ViewDragHelper能很好的实现
View的滑动和事件分发,典型谷歌官方的
Drawerlayout
实例:ViewDragHelper实现QQ侧滑效果DragLayout[github]
相关文章推荐
- Android-Android解析JSON
- android107 指针入门
- Android 一个强大实用的版本升级demo(thread+service+Notification)
- Android照片墙应用实现,再多的图片也不怕崩溃
- phonegap android 开发环境搭建
- Android bitmap图片处理
- view viewGroup
- Android-Volley源码分析
- 关于 Android Volley框架缓存
- Android Studio更换眼睛保护背景色
- Activity切换动画无效(android:windowIsTranslucent)影响(android:windowAnimationStyle)
- android从系统相册中选择一张图片
- android 自定义组合控件
- Android Studio | 一个优雅的安卓开发环境
- (android:windowIsTranslucent)影响(android:windowAnimationStyle)Activity切换动画无效
- Android图片选择器
- 史上最详细的Android Studio快捷键
- Android adb push安装和直接安装软件的区别
- AndroidStudio鼠标放到代码上自动显示代码的信息
- cannot resolve symbol 'simple_list_item_1'