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 { 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()); } }