UCrop:图片裁剪开源库详细使用

首先来看效果图,可以对图片进行操作,也可以对裁剪框进行操作。我很满足,我已经用尽洪荒之力啦

UCrop:图片裁剪开源库详细使用_第1张图片

最近项目涉及到这样一个需求,用户上传头像功能——且,在选择玉照以后,要求对玉照进行各种裁剪操作。

for example一下:玉照缩放、玉照旋转、玉照双击放大、玉照局部放大、裁剪框框选变化等等功能。    

上传头像功能在第一个项目中是做过的,当时需求很简单,就是点击下头像,然后调用系统图库或者调用系统相机拍照返回图片后,对图片进行裁剪。而裁剪界面的效果也很简单,嗯,简单的有点清新。只能对图片进行操作,放大缩小移动,但是不能旋转,而且裁剪框不能操作。  

然后我就网上扒拉,想看看有没有现成的,找了大概一天,皇天在上,找到了UCrop这个开源库。不多说,动手干~但是网上对UCrop的使用过程介绍的简直像狗屎一样,没头没尾,我只有这边摘一段,那边摘一段,凑合凑合用。因此,才想着把整个集成流程和一些使用中遇到的问题放上来,大家一起讨论一下。    

**首先,注入依赖,如图:其中在dependencies中添加一行代码 —compile'com.yalantis:ucrop:1.3.+'** 

UCrop:图片裁剪开源库详细使用_第2张图片'com.yalantis:ucrop:1.0.1'

'com.yalantis:ucrop:1.3.+'

'com.yalantis:ucrop:1.4.1'....还有1.5.1什么的  

不知道是不是和我当时创建的环境有关系,当我把包从1.3改到1.4以后,项目就会报**width and height cannot be <= 0**的错误,无奈,我只能用1.3的。    

**第二步,在AndroidManifest.xml文件中配置如下:**  

**设置权限,很容易忘掉设置读取内存卡权限,而这样做的后果是裁剪界面不会显现,千万不要忘了这里会掉坑**

```  

```  

**添加Ucrop的裁剪界面,这里需要设置横屏或者竖屏,我这里用的是pad,所以设置为横屏。**

```  

android:name="com.yalantis.ucrop.UCropActivity"  

android:screenOrientation="landscape"

android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>  

**第三步,主界面代码:**   

1.首先是主界面xml文件,其实就是一个ImageView,点击一下可以选择图片或者调用系统相机拍照。比较简单,这里就不再写了。 

2.主界面代码:

public class MainActivity extends Activity {

    private Button btn_start_crop;
    //拍照请求码
    private static final int REQUEST_CAMERA = 1;
    private static final int REQUEST_PICK = 2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        btn_start_crop = (Button)findViewById(R.id.btn_start_crop);
        btn_start_crop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击弹出对话框,选择拍照或者系统相册
                new AlertDialog.Builder(MainActivity.this).setTitle("上传头像")//设置对话框标题
                        .setPositiveButton("拍照", new DialogInterface.OnClickListener() {//添加确定按钮
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                //调用系统相机的意图
                                Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                                startActivityForResult(takePhotoIntent, REQUEST_CAMERA);
                            }
                        }).setNegativeButton("系统相册", new DialogInterface.OnClickListener() {
                             @Override
                            public void onClick(DialogInterface dialog, int which) {
                                 //调用系统图库的意图
                                 Intent choosePicIntent = new Intent(Intent.ACTION_PICK, null);
                                 choosePicIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
                                 startActivityForResult(choosePicIntent, REQUEST_PICK);
                    }
                }).show();//在按键响应事件中显示此对话框
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        switch (requestCode){
            case REQUEST_CAMERA:
                //调用相机了,要调用图片裁剪的方法
                startCropImage(Environment.getExternalStorageDirectory()+"/SavaPhoto/");
                break;
            case REQUEST_PICK :
                try {
                    if(data != null){
                        Uri uri = data.getData();
                        if(!TextUtils.isEmpty(uri.getAuthority())){
                            Cursor cursor = this.getContentResolver().query(uri,new String[]{MediaStore.Images.Media.DATA},null,null,null);
                            if(null == cursor){
                                return;
                            }
                            cursor.moveToFirst();
                            //拿到了照片的path
                            String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                            cursor.close();
                            path = "file://"+path;
                            //启动裁剪界面,配置裁剪参数
                            startUcrop(path);
                        }
                    }
                } catch (Exception e){
                    e.printStackTrace();
                }
                break;
            case UCrop.REQUEST_CROP:
                Uri croppedFileUri = UCrop.getOutput(data);
                break;
        }
    }

    private void startUcrop(String path) {
        Uri uri_crop = Uri.parse(path);
        //裁剪后保存到文件中
        Uri destinationUri = Uri.fromFile(new File(getCacheDir(), "SampleCropImage.jpg"));
        UCrop uCrop = UCrop.of(uri_crop, destinationUri);
        UCrop.Options options = new UCrop.Options();
        //设置裁剪图片可操作的手势
        options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);
        //设置隐藏底部容器,默认显示
//        options.setHideBottomControls(true);
        //设置toolbar颜色
        options.setToolbarColor(ActivityCompat.getColor(this, R.color.colorPrimary));
        //设置状态栏颜色
        options.setStatusBarColor(ActivityCompat.getColor(this, R.color.colorPrimary));
        //是否能调整裁剪框
//        options.setFreeStyleCropEnabled(true);
         uCrop.withOptions(options);
         uCrop.start(this);
    }

    /**
     * 调用相机后对图片进行裁剪的方法
     * @param s
     */
    private void startCropImage(String s) {

    }
}

好了,到这里就能看到效果了,但是具体自定义的其他一些配置,可以去百度一下,其他朋友介绍的很详细。在这里只是把设置方法以及在哪里设置参数给写一下。不知道为什么,我去设置隐藏底部容器和是否能调整裁剪框的时候,系统不能识别这两个方法。我想应该是和我导入包有问题。这里也又一次回对了我刚开始的问题,我换其他错误的问题。

你可能感兴趣的:(Android)