Android自定义View的移动

 
 

自定义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);

            }

       }

   };

 

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值