Android自定义View-一个拖动控件

1,365 阅读1分钟

好久没写博客了,最近一直忙着赶项目,趁着中午午休,更一篇博客吧,时间有限,直接进入正题吧。

  • 效果

GIF.gif

  • 继承合适的View。
public class VerticalTouchImageView extends android.support.v7.widget.AppCompatImageView{
}
  • 构造器 为了方便,构造里通过this调用其它构造方法,我们就可以把初始化逻辑放在最后调用的构造器里。
    public VerticalTouchImageView(Context context) {
        this(context, null);
    }

    public VerticalTouchImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public VerticalTouchImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
         //TODO 这里做初始化操作
    }
  • 重写onTouchEvent方法,由于这里要处理手势,需要对事件进行处理。
@Override
public boolean onTouchEvent(MotionEvent event) {
     switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
         
                break;
            case MotionEvent.ACTION_MOVE:

                 break;
            case MotionEvent.ACTION_UP:
            
                break;
        }
    return super.onTouchEvent(event);
}

完整代码(代码分析):

/**
 * 首页拖动控件,仅能垂直拖动。
 * Created by Chao on 2017-11-16.
 */

public class VerticalTouchImageView extends android.support.v7.widget.AppCompatImageView {

    public VerticalTouchImageView(Context context) {
        this(context, null);
    }

    public VerticalTouchImageView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public VerticalTouchImageView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    float moveY;

    /**
    *由于项目需求只能上下滑动,所以我们只关心Y轴。
    */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                //记录下当前按下的Y坐标
                moveY = event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                //在Move事件里面,拿到现在的Y坐标减去按下时候的坐标,就能计算出当前View应该移动的距离。
                float y = event.getRawY();
                float diffY = y - moveY;
                //如果当前的Y坐标已经移到屏幕外,我们需要修正坐标,最多移动到顶部0坐标。
                if (getY() <= 0) {
                    setY(0);
                } else {//如果没有超出边界,我们就让View移动起来。
                    setY(currY);
                }
                //这里返回true将此次事件消耗,自己处理。
                 return true;
            case MotionEvent.ACTION_UP:
                break;
        }
        return super.onTouchEvent(event);
    }

    /**
    *重置方法
    */
    public void reset() {
        if (getY() <= 0) {
            setY(0);
        }
    }

}