首先来看效果图,可以对图片进行操作,也可以对裁剪框进行操作。我很满足,我已经用尽洪荒之力啦
最近项目涉及到这样一个需求,用户上传头像功能——且,在选择玉照以后,要求对玉照进行各种裁剪操作。
for example一下:玉照缩放、玉照旋转、玉照双击放大、玉照局部放大、裁剪框框选变化等等功能。
上传头像功能在第一个项目中是做过的,当时需求很简单,就是点击下头像,然后调用系统图库或者调用系统相机拍照返回图片后,对图片进行裁剪。而裁剪界面的效果也很简单,嗯,简单的有点清新。只能对图片进行操作,放大缩小移动,但是不能旋转,而且裁剪框不能操作。
然后我就网上扒拉,想看看有没有现成的,找了大概一天,皇天在上,找到了UCrop这个开源库。不多说,动手干~但是网上对UCrop的使用过程介绍的简直像狗屎一样,没头没尾,我只有这边摘一段,那边摘一段,凑合凑合用。因此,才想着把整个集成流程和一些使用中遇到的问题放上来,大家一起讨论一下。
**首先,注入依赖,如图:其中在dependencies中添加一行代码 —compile'com.yalantis:ucrop:1.3.+'**
'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) { } }
好了,到这里就能看到效果了,但是具体自定义的其他一些配置,可以去百度一下,其他朋友介绍的很详细。在这里只是把设置方法以及在哪里设置参数给写一下。不知道为什么,我去设置隐藏底部容器和是否能调整裁剪框的时候,系统不能识别这两个方法。我想应该是和我导入包有问题。这里也又一次回对了我刚开始的问题,我换其他错误的问题。