自定义View的移动
方法1:
通过修改View对象的left,top, right, bottom四个属性来修改坐标。
layout(getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY);
方法2:
offsetLeftAndRight((int) offsetX);
offsetTopAndBottom((int) offsetY);
方法3:
LinearLayout.LayoutParams layoutParams =
(LinearLayout.LayoutParams) getLayoutParams();
ViewGroup.MarginLayoutParams layoutParams =
(ViewGroup.MarginLayoutParams) getLayoutParams();
layoutParams.leftMargin= (int) (getLeft()+offsetX);
layoutParams.topMargin= (int) (getTop()+offsetY);
setLayoutParams(layoutParams);
方法4:
((View)getParent()).scrollBy(-offsetX,-offsetY);
方法5:
使用Scroller类,可以平滑移动。
1、初始化Scroller
mScroller = new Scroller(context);
2、重写computeScroller()方法
draw()方法调用该方法,该方法手动调用invalidate(),刷新。
直到滑动完成,mScroller.computeScrollOffset()返回false。
@Override
public void computeScroll() {
super.computeScroll();
//滑动完成时,mScroller.computeScrollOffset()返回false
if (mScroller.computeScrollOffset()) {
((View) getParent()).scrollTo(
mScroller.getCurrX(),//返回mScroller现在该移动的位置
mScroller.getCurrY());
//手动刷新
invalidate();
}
}
3、启动scroller
手指离开屏幕时,开始启动滑动过程
startScroll(int startX, int startY, int dx, int dy)
startScroll(int startX, int startY, int dx, int dy, int duration)
参数:起始位置X,起始位置Y,水平偏移,垂直偏移,滑动时间
case MotionEvent.ACTION_UP:
View viewGroup = ((View) getParent());
mScroller.startScroll(
viewGroup.getScrollX(),//获取整个过程水平方向移动距离
viewGroup.getScrollY(),//获取整个过程垂直方向移动距离
-viewGroup.getScrollX(),//让view移动到开始的位置
-viewGroup.getScrollY());
invalidate();//刷新,用来启动draw()方法
break;
方法6:
使用ViewDragHelper类来实现滑动。
1.初始化ViewDragHelper
在ViewGround内部,使用工厂进行初始化。
mViewDragHelper=ViewDragHelper.create(this,callback);
参数:监听的View,回调Callback
2.拦截事件
事件传递给ViewGroundHelper进行处理
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return mViewDragHelper.shouldInterceptTouchEvent(ev);//拦截事件
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
mViewDragHelper.processTouchEvent(ev);
return true;//返回true,不用上级处理。
}
3.重写computeScroll()方法
@Override
public void computeScroll() {
if(mViewDragHelper.continueSettling(true)){
ViewCompat.postInvalidateOnAnimation(this);
}
}
4.处理回调Callback
private ViewDragHelper.Callback callback = newViewDragHelper.Callback(){
@Override
public boolean tryCaptureView(View child, int pointerId) {
return mMainView==child;//当触摸mMainView时,开始检测
}
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
return 0;//返回0,不发生滑动
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
return left;//返回水平移动距离
}
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
//手指松开,移动到相应的位置
if(mMainView.getLeft()<500){
//关闭菜单
mViewDragHelper.smoothSlideViewTo(mMainView,0,0);
ViewCompat.postInvalidateOnAnimation(DragViewGround.this);
}else{
//打开菜单
mViewDragHelper.smoothSlideViewTo(mMainView,300,0);
ViewCompat.postInvalidateOnAnimation(DragViewGround.this);
}
}
};