Android--自定义可拖动view

//该可拖动view主要是有两个imageview,一个用来隐藏该view,一个用来做正常的点击事件。

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

    LayoutInflater inflater = LayoutInflater.from(context);
    View view = inflater.inflate(R.layout.dragview, this);

    iv_close = view.findViewById(R.id.iv_close);
    iv_pic = view.findViewById(R.id.iv_pic);

}

主要想法是判断ACTION_DOWN手指按下时,按下的位置是否是关闭的那个imageview

//判断是否触摸view
private boolean isTouchInView(ImageView view, float xAxis, float yAxis) {
    if (view== null) {
        return false;
    }
    int[] location = new int[2];
    view.getLocationOnScreen(location);
    int left = location[0];
    int top = location[1];
    int right = left + view.getMeasuredWidth();
    int bottom = top + view.getMeasuredHeight();
    if (yAxis >= top && yAxis <= bottom && xAxis >= left
            && xAxis <= right) {
        return true;
    }
    return false;
}

主要方法进行触摸拦截,使得view随手指移动

@Override
public boolean onTouchEvent(MotionEvent event) {
    //获取相对屏幕的坐标,即以屏幕左上角为原点
    rawX = (int) event.getRawX();
    rawY = (int) event.getRawY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:    //捕获手指触摸按下动作
            //获取相对View的坐标,即以此View左上角为原点
            mStartX = event.getRawX();
            mStartY = event.getRawY();
            if (isTouchInView(iv_close,rawX,rawY)){
                flag = true;
            }
            mLastTime = System.currentTimeMillis();
            lastX=rawX;
            lastY=rawY;
            if(getParent()!=null){
                parent= (ViewGroup) getParent();
                pHeight=parent.getHeight();
                pWidth=parent.getWidth();
            }
            break;
        case MotionEvent.ACTION_MOVE:   //捕获手指触摸移动动作
            int dx=rawX-lastX;
            int dy=rawY-lastY;
            float x=getX()+dx;
            float y=getY()+dy;
            //判断是否到边界
            x = x < 0 ? 0 : x > pWidth - getWidth() ? pWidth - getWidth() : x;
            y = getY() < 0 ? 0 : getY() + getHeight() > pHeight ? pHeight - getHeight() : y;
            setX(x);
            setY(y);
            lastX=rawX;
            lastY=rawY;
            break;
        case MotionEvent.ACTION_UP:    //捕获手指触摸离开动作
            if(System.currentTimeMillis() - mLastTime < 800){
                if(Math.abs(mStartX- event.getRawX() )< 10.0 && Math.abs(mStartY - event.getRawY()) < 10.0){
                    //处理点击的事件
                    if (flag){
                        dragViewClickListener.onDragViewListener("delete","");
                    }else
                        dragViewClickListener.onDragViewListener("pic","");
                }
            }
            flag = false;
            break;
    }
    return true;
}

在layout中使用

<com.bai.myapplication.View.DragView
    android:id="@+id/DragView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:layout_editor_absoluteX="0dp"
    tools:layout_editor_absoluteY="0dp"
    tools:ignore="MissingConstraints" />

自定义接口

Android--自定义可拖动view

在activity中使用

Android--自定义可拖动view

效果
Android--自定义可拖动view

点击关闭imageview时

Android--自定义可拖动view

源码在这

一个小小的记录–积跬步,至千里