美文网首页程序员
Android自定义View-一个拖动控件

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

作者: 844b9a3a3a68 | 来源:发表于2017-12-08 12:52 被阅读4106次

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

    • 效果
    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);
            }
        }
    
    }
    

    相关文章

      网友评论

        本文标题:Android自定义View-一个拖动控件

        本文链接:https://www.haomeiwen.com/subject/fsleixtx.html