ImageSelectActivity.java 9.01 KB
package com.hjx.parent;

import android.app.Dialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.SystemClock;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;

import com.hjx.parent.databinding.ActivityImageSelectBinding;
import com.hjx.parent.dialog.PhotoViewDialog;
import com.hjx.parent.dialog.TipDialog;
import com.prws.common.bean.CutPicBean;
import com.prws.common.bean.ImageBean;
import com.prws.common.utils.BitmapUtils;
import com.prws.common.utils.CommonUtil;
import com.prws.common.widget.MarkSizeView;

public class ImageSelectActivity extends BaseActivity<ActivityImageSelectBinding> {
    private Bitmap bitmap;
    Rect rect;
    private double widthFold, heightFold;
    private Bitmap backGroundBitmap;
    private int bitmapWidth, bitmapHeight;
    private Rect select;
    private boolean isSelect = false;

    @Override
    public void initView(Bundle savedInstanceState) {
        String path = getIntent().getStringExtra("path");
        bitmap = BitmapFactory.decodeFile(path);
        showImage();
        binding.markView.setmOnClickListener(new MarkSizeView.onClickListener() {
            @Override
            public void onConfirm(Rect markedArea) {
                if (isSelect) {
                    binding.markView.setBackGroundBitmap(backGroundBitmap);
                    isSelect = false;
                }
                int markSizeViewWidth = binding.markView.getWidth();
                int markSizeHeight = binding.markView.getHeight();
                backGroundBitmap = binding.markView.getBackGroundBitmap();
                bitmapWidth = backGroundBitmap.getWidth();
                bitmapHeight = backGroundBitmap.getHeight();
                widthFold = CommonUtil.div(bitmapWidth, markSizeViewWidth, 2);
                heightFold = CommonUtil.div(bitmapHeight, markSizeHeight, 2);
                Log.d(toString(), markedArea.toString());
                drawRectangles(markedArea);
                binding.markView.reset();
            }

            @Override
            public void onCancel() {
                rect = null;
            }

            @Override
            public void onTouch() {

            }
        });
        binding.tvSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (rect != null) {
                    if (select == null) {
                        Intent intent = new Intent();
                        intent.putExtra("cut", rect);
                        setResult(1004, intent);
                        finish();
                    } else {
                        Intent intent = new Intent();
                        intent.putExtra("cut", rect);
                        intent.putExtra("position", getIntent().getIntExtra("position", 0));
                        setResult(1005, intent);
                        finish();
                    }
                } else {
                    showToast("未选择框题区域");
                }
            }
        });
        binding.llDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (select == null) {
                    finish();
                } else {
                    rect = null;
                    Intent intent = new Intent();
                    intent.putExtra("cut", rect);
                    intent.putExtra("position", getIntent().getIntExtra("position", 0));
                    setResult(1005, intent);
                    finish();
                }
            }
        });
        binding.ivBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                back();
            }
        });

        String source = getIntent().getStringExtra("source");
        binding.btnShowSource.setOnClickListener(v -> {
            new PhotoViewDialog(this).show(source);
        });
    }

    private void back() {
        showTipDialog("温馨提示", "是否确认放弃当前的编辑?", "取消", "确定", new TipDialog.TipDialogInterface() {
            @Override
            public void onConfirm(Dialog dialog) {
                dialog.dismiss();
                finish();
            }

            @Override
            public void onCancel(Dialog dialog) {
                dialog.dismiss();
            }
        });
    }

    private void simulateClick(int x1, int x2, int y1, int y2) {
        long downTime = SystemClock.uptimeMillis();
        final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x1, y1, 0);
        downTime += 1000;
        final MotionEvent moveEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_MOVE, x2, y2, 0);
        final MotionEvent upEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP, x2, y2, 0);
        binding.markView.onTouchEvent(downEvent);
        binding.markView.onTouchEvent(moveEvent);
        binding.markView.onTouchEvent(upEvent);
        downEvent.recycle();
        moveEvent.recycle();
        upEvent.recycle();
    }

    private void drawRectangles(Rect ints) {
        isSelect = true;
        rect = new Rect(ints.left, ints.top, ints.right, ints.bottom);
        Log.d(toString(), ints.toString());
        Rect rect = new Rect(CommonUtil.mulForInt(ints.left, widthFold), CommonUtil.mulForInt(ints.top, heightFold), CommonUtil.mulForInt(ints.right, widthFold), CommonUtil.mulForInt(ints.bottom, heightFold));
//        Log.d(toString(),rect.toString());
        Bitmap mutableBitmap = backGroundBitmap.copy(Bitmap.Config.ARGB_8888, true);
        Canvas canvas = new Canvas(mutableBitmap);
        //画矩形框
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.FILL);//填充
        paint.setStrokeWidth(CommonUtil.dpToPx(this, 1)); //线的宽度
        paint.setColor(getColor(R.color.select_fill));
        canvas.drawRect(rect, paint);
        paint.setStyle(Paint.Style.STROKE);//不填充
        paint.setColor(getColor(R.color.select_border));
        canvas.drawRect(rect, paint);
        binding.markView.setBackGroundBitmap(mutableBitmap);
    }

    private void showImage() {
        float imageHeight = bitmap.getHeight();
        float imageWidth = bitmap.getWidth();
        float viewHeight = CommonUtil.getScreenHeight(context) - CommonUtil.dpToPx(context, 250);
        float viewWidth = CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 60);
        binding.markView.post(new Runnable() {
            @Override
            public void run() {
                binding.markView.reset();
                RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(binding.markView.getLayoutParams());
                if (imageHeight / imageWidth > viewHeight / viewWidth) {
                    if (viewHeight > imageHeight) {
                        layoutParams.height = (int) imageHeight;
                        layoutParams.width = (int) imageWidth;
                    } else {
                        layoutParams.height = (int) viewHeight;
                        layoutParams.width = (int) ((float) (imageWidth / imageHeight) * viewHeight);
                    }
                } else {
                    if (viewWidth > imageWidth) {
                        layoutParams.height = (int) imageHeight;
                        layoutParams.width = (int) imageWidth;
                    } else {
                        layoutParams.height = (int) ((float) (imageHeight / imageWidth) * viewWidth);
                        layoutParams.width = (int) viewWidth;
                    }
                }
                layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
                binding.markView.setLayoutParams(layoutParams);
                binding.markView.setBackGroundBitmap(bitmap);
                binding.markView.reset();
                select = getIntent().getParcelableExtra("rect");
                if (select != null) {
                    simulateClick(select.left, select.right, select.top, select.bottom);
                }
            }
        });
    }

    @Override
    protected void onDestroy() {
        if (backGroundBitmap != null) {
            backGroundBitmap.recycle();
            backGroundBitmap = null;
        }
        if (bitmap != null) {
            bitmap.recycle();
            bitmap = null;
        }
        super.onDestroy();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            back();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    protected ActivityImageSelectBinding getViewBinding() {
        return ActivityImageSelectBinding.inflate(getLayoutInflater());
    }
}