安卓UCrop实现图片裁剪,好用!!完整代码如下

package com.xmkjsoft.xhgh.fragment;

import static android.app.Activity.RESULT_OK;

import android.Manifest;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.xmkjsoft.xhgh.R;
import com.yalantis.ucrop.UCrop;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class FullscreenImageViewerDialogFragment4 extends DialogFragment {

    private static final String ARG_IMAGE_URI = "image_uri";
    private Uri imageUri;
    private ActivityResultLauncher<Intent> cropLauncher;
    private ImageView imageView; // Declare ImageView as a class-level member
    public static FullscreenImageViewerDialogFragment4 newInstance(Uri uri) {
        FullscreenImageViewerDialogFragment4 fragment = new FullscreenImageViewerDialogFragment4();
        Bundle args = new Bundle();
        args.putParcelable(ARG_IMAGE_URI, uri);
        fragment.setArguments(args);
        return fragment;
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_fullscreen_image_viewer_4, container, false);
// 点击 Dialog 外部区域关闭 Dialog
//        view.setOnTouchListener((v, event) -> {
//            dismiss();
//            return true;
//        });
         imageView = view.findViewById(R.id.fullscreen_image);

        if (getArguments() != null) {
            imageUri = getArguments().getParcelable(ARG_IMAGE_URI);
        }

        if (imageUri != null) {
            Glide.with(this)
                    .load(imageUri)
                    .apply(new RequestOptions().placeholder(R.color.main_color).error(R.color.main_color))
                    .into(new CustomTarget<Drawable>() {
                        @Override
                        public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
                            imageView.setImageDrawable(resource);
                            // 在图片加载成功后再启动裁剪
                            startCrop(imageUri);
                        }

                        @Override
                        public void onLoadCleared(@Nullable Drawable placeholder) {
                            // Placeholder处理
                            imageView.setImageDrawable(placeholder);
                        }
                    });
        } else {
            imageView.setImageResource(R.color.main_color); // 如果 imageUri 为空,显示占位符或错误图片
        }

        return view;
    }




    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set style for full-screen dialog
        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
        // Initialize ActivityResultLauncher for UCrop
        cropLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
            if (result.getResultCode() == getActivity().RESULT_OK && result.getData() != null) {
                Intent data = result.getData();
                handleCropResult(data);
            } else if (result.getResultCode() == UCrop.RESULT_ERROR && result.getData() != null) {
                Intent data = result.getData();
                handleCropError(data);
            }
        });
    }


    private void startCrop(@NonNull Uri uri) {
        String destinationFileName = "SampleCropImage.jpg";
        Uri destinationUri = Uri.fromFile(new File(requireContext().getCacheDir(), destinationFileName));

        UCrop uCrop = UCrop.of(uri, destinationUri);
        uCrop.withAspectRatio(1, 1);  // 设置剪裁比例
        uCrop.withMaxResultSize(450, 450);  // 设置最大剪裁尺寸

        Intent intent = uCrop.getIntent(requireContext());
        cropLauncher.launch(intent);
    }

    private void handleCropResult(Intent data) {
        final Uri resultUri = UCrop.getOutput(data);
        if (resultUri != null) {

            // 处理剪裁后的图片,比如显示在ImageView中

            imageView.setImageURI(resultUri);
            Toast.makeText(getContext(), "剪裁回调"+resultUri, Toast.LENGTH_SHORT).show();
            System.out.println("剪裁回调"+resultUri);
        }
    }







    private void handleCropError(Intent data) {
        final Throwable cropError = UCrop.getError(data);
        // 处理剪裁错误
        if (cropError != null) {
            Toast.makeText(getContext(), cropError.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }








}

怎么使用?


    private void openImageViewerFragment(Uri uri) {
        FragmentActivity activity = getActivity(); // 获取当前 Activity 的上下文

        if (activity != null) {
            // 创建并显示新的 Fragment
            FullscreenImageViewerDialogFragment4 fragment = FullscreenImageViewerDialogFragment4.newInstance(uri);
            fragment.show(activity.getSupportFragmentManager(), "FullscreenImageViewerDialogFragment4");

            // 关闭当前 Fragment
            dismiss();
        }



    }


在androidmanifest.xml 加入

<activity
    android:name="com.yalantis.ucrop.UCropActivity"
    android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>

对了,还要添加依赖啊:

 implementation 'com.github.yalantis:ucrop:2.2.6'

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值