区域选定(类似截图,可拖动)

版权声明:本文为博主原创文章,转载请标明原文出处链接。 https://blog.csdn.net/iblade/article/details/81281558
/**
 * Created by ylWang on 2018/7/23 18:22.
 */

public class MarkView extends RelativeLayout {
    private ImageView ivTouch;
    private RelativeLayout rlRect, rlRoot;
    private LinearLayout llSummit;
    private TextView tvCancel, tvSure;
    private MarkView markView;

    public MarkView(Context context) {
        super(context);
        initViews(context);
    }

    public MarkView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initViews(context);
    }

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

    private <T extends View> T f(int resId) {
        return (T) findViewById(resId);
    }

    private void initViews(Context context) {
        markView = this;
        LayoutInflater.from(context).inflate(R.layout.view_mark, this, true);
        ivTouch = f(R.id._iv_touch);
        rlRect = f(R.id._rl_rect);
        llSummit = f(R.id._ll_summit);
        tvSure = f(R.id._tv_sure);
        tvCancel = f(R.id._tv_cancel);
        rlRoot = f(R.id._rl_root);
        setListener();
    }

    private static final String TAG = "@@@";
    private int lastX, lastY, offsetX, offsetY;
    private final static int MIN_WH = 50;
    private int toRight, toBottom;

    private void setListener() {

        ivTouch.setOnTouchListener(new OnTouchListener() {

            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int x = (int) event.getX();
                int y = (int) event.getY();
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        llSummit.setVisibility(INVISIBLE);
                        lastX = x;
                        lastY = y;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        offsetX = x - lastX;
                        offsetY = y - lastY;
                        toRight = rlRect.getRight() + offsetX;
                        toBottom = rlRect.getBottom() + offsetY;
                        if ((rlRect.getLeft() + MIN_WH > toRight) || (rlRect.getTop() + MIN_WH > toBottom)) {//控制最小区域
                            break;
                        } else if (toRight > rlRoot.getRight() || toBottom > rlRoot.getBottom()) {//不许出界
                            break;
                        } else {
                            ivTouch.offsetLeftAndRight(offsetX);
                            ivTouch.offsetTopAndBottom(offsetY);
                            llSummit.offsetLeftAndRight(offsetX);
                            llSummit.offsetTopAndBottom(offsetY);
                            rlRect.layout(rlRect.getLeft(), rlRect.getTop(), toRight, toBottom);
                            areaListener.changePoint(getPosition(rlRect, rlRoot));
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        llSummit.setVisibility(VISIBLE);
                        break;
                    default:
                        break;
                }
                return true;
            }
        });

        rlRect.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int x = (int) event.getX();
                int y = (int) event.getY();
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        llSummit.setVisibility(INVISIBLE);
                        lastX = x;
                        lastY = y;
                        break;
                    case MotionEvent.ACTION_MOVE:
                        offsetX = x - lastX;
                        offsetY = y - lastY;
                        if (-offsetX > rlRect.getLeft()
                                || rlRect.getRight() + offsetX > rlRoot.getRight()
                                || -offsetY > rlRect.getTop()
                                || rlRect.getBottom() + offsetY > rlRoot.getBottom()
                                ) {
                            break;
                        } else {
                            ivTouch.offsetLeftAndRight(offsetX);
                            ivTouch.offsetTopAndBottom(offsetY);
                            rlRect.offsetLeftAndRight(offsetX);
                            rlRect.offsetTopAndBottom(offsetY);
                            llSummit.offsetLeftAndRight(offsetX);
                            llSummit.offsetTopAndBottom(offsetY);
                            areaListener.changePoint(getPosition(rlRect, rlRoot));
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        llSummit.setVisibility(VISIBLE);
                        break;
                    default:
                        break;
                }

                return true;
            }
        });
        ClickListener listener = new ClickListener();
        tvSure.setOnClickListener(listener);
        tvCancel.setOnClickListener(listener);
    }

    private final class ClickListener implements OnClickListener {

        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id._tv_sure:
                    Log.d(TAG, "Sure_onTouch: " + Arrays.toString(getPosition(rlRect, rlRoot)));
                    areaListener.setPoints(getPosition(rlRect, rlRoot));
                    ((ViewGroup) markView.getParent()).removeView(markView);
                    break;
                case R.id._tv_cancel:
                    areaListener.cancel();
                    ((ViewGroup) markView.getParent()).removeView(markView);
                    break;
                default:
                    break;
            }
        }
    }

    private int[] getPosition(View view, ViewGroup viewRoot) {
        return new int[]{view.getLeft(), view.getTop(), view.getRight(), view.getBottom(), viewRoot.getRight(), viewRoot.getBottom()};
    }

    public interface AreaListener {
        void changePoint(int[] pos);

        void setPoints(int[] pos);

        void cancel();
    }

    private AreaListener areaListener;

    public void setAreaListener(AreaListener areaListener) {
        this.areaListener = areaListener;
    }
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/_rl_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <RelativeLayout
        android:id="@+id/_rl_rect"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:layout_gravity="center"
        android:background="@drawable/red_rect"/>

    <ImageView
        android:id="@+id/_iv_touch"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_below="@id/_rl_rect"
        android:layout_marginLeft="-20dp"
        android:layout_marginTop="-20dp"
        android:layout_toRightOf="@id/_rl_rect"
        android:background="@drawable/red_point" />

    <LinearLayout
        android:id="@+id/_ll_summit"
        android:layout_width="65dp"
        android:layout_height="30dp"
        android:layout_above="@id/_iv_touch"
        android:layout_marginRight="30dp"
        android:layout_toLeftOf="@id/_iv_touch"
        android:background="@android:color/holo_orange_dark"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/_tv_cancel"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:background="@android:color/holo_blue_bright"
            android:gravity="center"
            android:text="No" />

        <TextView
            android:id="@+id/_tv_sure"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:layout_marginLeft="5dp"
            android:background="@android:color/holo_green_light"
            android:gravity="center"
            android:text="Yes" />
    </LinearLayout>
</RelativeLayout>

猜你喜欢

转载自blog.csdn.net/iblade/article/details/81281558