package com.hjx.parent; import android.app.Dialog; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Rect; import android.hardware.camera2.CameraCharacteristics; import android.net.Uri; import android.os.Bundle; import android.os.SystemClock; import android.provider.MediaStore; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.widget.RelativeLayout; import androidx.annotation.Nullable; import androidx.core.content.FileProvider; import com.hjx.parent.databinding.ActivityImageEditBinding; import com.hjx.parent.dialog.TipDialog; import com.prws.common.utils.BitmapUtils; import com.prws.common.utils.CommonUtil; import com.prws.common.widget.MarkSizeView; import com.zhangteng.imagepicker.bean.ImageInfo; import com.zhangteng.imagepicker.config.ImagePickerConfig; import com.zhangteng.imagepicker.config.ImagePickerEnum; import com.zhangteng.imagepicker.config.ImagePickerOpen; import com.zhangteng.imagepicker.imageloader.GlideImageLoader; import com.zhangteng.utils.IHandlerCallBack; import java.io.File; import java.util.ArrayList; import java.util.List; public class ImageEditActivity extends BaseActivity { private Bitmap bitmap; private String filepath; @Override public void initView(Bundle savedInstanceState) { String path = getIntent().getStringExtra("path"); bitmap = BitmapFactory.decodeFile(path); showImage(true); binding.markView.setmOnClickListener(new MarkSizeView.onClickListener() { @Override public void onConfirm(Rect markedArea) { Bitmap backGroundBitmap = binding.markView.getBackGroundBitmap(); int bitmapWidth = backGroundBitmap.getWidth(); int bitmapHeight = backGroundBitmap.getHeight(); int markSizeViewWidth = binding.markView.getWidth(); int markSizeHeight = binding.markView.getHeight(); Log.d(toString(), markedArea.toString()); int widthFold = (int) CommonUtil.div(bitmapWidth, markSizeViewWidth, 2); int heightFold = (int) CommonUtil.div(bitmapHeight, markSizeHeight, 2); markedArea.left = CommonUtil.mulForInt(markedArea.left, widthFold); markedArea.top = CommonUtil.mulForInt(markedArea.top, heightFold); markedArea.right = CommonUtil.mulForInt(markedArea.right, widthFold); markedArea.bottom = CommonUtil.mulForInt(markedArea.bottom, heightFold); Log.d(toString(), "markedArea.left=" + markedArea.left + "markedArea.top=" + markedArea.top + ";markedArea.right=" + markedArea.right + ";markedArea.bottom=" + markedArea.bottom); bitmap = Bitmap.createBitmap(backGroundBitmap, markedArea.left, markedArea.top, (markedArea.right - markedArea.left) > bitmapWidth ? bitmapWidth : markedArea.right - markedArea.left, (markedArea.bottom - markedArea.top) > bitmapHeight ? bitmapHeight : markedArea.bottom - markedArea.top); binding.markView.reset(); showImage(false); } @Override public void onCancel() { } @Override public void onTouch() { } }); binding.llRotate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { bitmap = BitmapUtils.routeBitmap(bitmap); showImage(false); } }); binding.ivBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { back(); } }); binding.llDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { setResult(1002); finish(); } }); binding.tvSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bitmap b = BitmapUtils.compress(bitmap); String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; CommonUtil.saveBitmapToUri(b, filepath); Intent intent = new Intent(); intent.putExtra("path", filepath); setResult(1003, intent); finish(); } }); binding.llPhoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //确保有相机来处理Intent filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; File photoFile = new File(filepath); if (photoFile != null) { //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile); takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); activity.startActivityForResult(takePictureIntent, 1); } } }); } private void back() { showTipDialog("温馨提示", "是否确认放弃当前的编辑?", "取消", "确定", new TipDialog.TipDialogInterface() { @Override public void onConfirm(Dialog dialog) { dialog.dismiss(); finish(); } @Override public void onCancel(Dialog dialog) { dialog.dismiss(); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { back(); return true; } return super.onKeyDown(keyCode, event); } private void showImage(boolean cut) { float imageHeight = bitmap.getHeight(); float imageWidth = bitmap.getWidth(); float viewHeight = CommonUtil.getScreenHeight(context) - CommonUtil.dpToPx(context, 210); float viewWidth = CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 30); 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(); if (cut) { simulateClick(10, layoutParams.width - 10, 10, layoutParams.height - 10); } } }); } 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(); } @Override protected ActivityImageEditBinding getViewBinding() { return ActivityImageEditBinding.inflate(getLayoutInflater()); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK && !TextUtils.isEmpty(filepath)) { bitmap = BitmapFactory.decodeFile(filepath); showImage(false); } } }