ImageEditActivity.java 8.57 KB
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<ActivityImageEditBinding> {
    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();
                float sx = 1f * backGroundBitmap.getWidth() / binding.markView.getWidth();
                float sy = 1f * backGroundBitmap.getHeight() / binding.markView.getHeight();

                bitmap = Bitmap.createBitmap(
                        backGroundBitmap,
                        (int) (markedArea.left * sx + 0.5),
                        (int) (markedArea.top * sy + 0.5),
                        (int) ((markedArea.right - markedArea.left) * sx + 0.5),
                        (int) ((markedArea.bottom - markedArea.top) * sy + 0.5)
                );
                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);
        }
    }
}