View的几种滑动方式

layout()方式
layout用于布局控件用的,那么它也可以实现view位置的变化。
layout(l,t,r,b) 这几个值可以这样理解 l t 就是view左上角的xy轴,rb就是右下角的xy轴。

     case MotionEvent.ACTION_MOVE:
        //计算移动的距离
        int offsetX = x - lastX;
        int offsetY = y - lastY;
        //调用layout方法来重新放置它的位置
        layout(getLeft()+offsetX, getTop()+offsetY,getRight()+offsetX , getBottom()+offsetY);
      break;

offsetLeftAndRight offsetTopAndBottom
代替了

layout(getLeft()+offsetX, getTop()+offsetY,getRight()+offsetX , getBottom()+offsetY);

直接把偏移值传入方法

   case MotionEvent.ACTION_MOVE:
        //计算移动的距离
        int offsetX = x - lastX;
         int offsetY = y - lastY;
         //对left和right进行偏移
        offsetLeftAndRight(offsetX);
         //对top和bottom进行偏移
        offsetTopAndBottom(offsetY);
        break;

LayoutParams(改变布局参数)

    LinearLayout.LayoutParams layoutParams= (LinearLayout.LayoutParams) getLayoutParams();
                   layoutParams.leftMargin = getLeft() + offsetX;
                   layoutParams.topMargin = getTop() + offsetY;
                   setLayoutParams(layoutParams)

动画
利用动画属性也可以实现view的滑动

scollTo与scollBy
scollBy内部也是调用的scollTo,scollBy是相对于当前的位置进行移动,scollTo是相对于初始化的坐标进行移动 注意这个滑动是滑动当前view内的整个内容 如果想滑动自己可以通过以下代码操作

View viewGroup = (View) getParent();
((View) getParent()).scrollBy(0, offsetY);

viewGroup.getScrollY X() 滑动后距离初始坐标的值
-值是往左或者底部移动
+值是往右或者顶部移动

Scroller
我们用scollTo/scollBy方法来进行滑动时,这个过程是瞬间完成的,所以用户体验不大好。这里我们可以使用Scroller来实现有过度效果的滑动,这个过程不是瞬间完成的,而是在一定的时间间隔完成的。Scroller本身是不能实现View的滑动的,它需要配合View的computeScroll()方法才能弹性滑动的效果。
在这里我们实现CustomView平滑的向右移动

首先我们要初始化Scroller

    public CustomView(Context context, AttributeSet attrs) {
           super(context, attrs);
           mScroller = new Scroller(context);
       }

重要的二个方法

  1. computeScroll()
  2. startScroll(int startX, int startY, int dx, int dy, int duration)
    computeScroll()方法,是调用onDraw中调用的,invalidate可以触发
    @Override
        public void computeScroll() {
            super.computeScroll();
            if(mScroller.computeScrollOffset()){
                ((View) getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
                 //通过不断的重绘不断的调用computeScroll方法
                 invalidate();
            }
        }
------
//触发代码
mScroller.startScroll(0, 0, 12,12, 1000);
invalidate();

computeScrollOffset是判断是否有执行动画
mScroller.getCurrX()获取递增后递减的偏移值
startScroll(int startX, int startY, int dx, int dy, int duration)
startX startY(开始的偏移坐标) dx dy(结束的偏移坐标) duration(执行的时长)
    原文作者:金威JW
    原文地址: https://www.jianshu.com/p/0205dd81b7fc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞