github地址 https://github.com/linliangliang/CorpIamge
uCrop 支持缩放图片,旋转图片,改变裁剪长宽比例,支持出手势:一根指头滑动图片,两根指头旋转图片,捏拉缩放,双击缩放。等功能。对于裁剪头像的需求基本满足。
下面记录在学习头像裁剪的笔记,以及一个上传到git的demo。
1、依赖添加
//项目中的build.gradle
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
//App中的build.gradle
compile 'com.github.yalantis:ucrop:2.2.1'
2、权限申请(android6.0及以上需要动态申请权限,我在其他博客中也写过这么不再贴,可以在github中查看)
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!--允许读取手机状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.VIBRATE" />
3、开始写代码
3.1 在androidmanifest.xml中注册裁剪图片的activity
<!--android:screenOrientation="portrait"表示竖屏-->
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
3.2 图片有两种方式获取,从图库选择,或者拍照
/**
* 从相册选择图片
*
* @param activity
*/
public static void choosePhoto(Activity activity) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_PICK);//打开图库
//REQUEST_PICTURE_CHOOSE表示请求参数,是个常量
activity.startActivityForResult(intent, REQUEST_PICTURE_CHOOSE);
}
/**
* 打开相机拍照
*
* @param activity
* @return
*/
public static void openCamera(Activity activity) {
//CROPIMAGEROOT是我为app建立的一个根目录文件夹,
//定义方式:
//private final static String CROPIMAGEROOT = Environment.getExternalStorageDirectory() + "/myAppName/";
//当然这个目录需要自己创建,可以下载demo查看
//mPictureFile 拍照后图片保存的文件。
mPictureFile = new File(CROPIMAGEROOT, "_" + System.currentTimeMillis() + ".jpg");
imageUri = Uri.fromFile(mPictureFile);
// 启动拍照,并保存到临时文件
Intent mIntent = new Intent();
mIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
mIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mPictureFile));
mIntent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);
activity.startActivityForResult(mIntent, REQUEST_CAMERA_IMAGE);
}
其中注释已经横清楚了
3.3选择图片后在 ActivityforResult()中调用裁剪图片的方法,裁剪完后,还是在 ActivityforResult()对裁剪后的结果进行处理。
这里直接贴出整个ActivityforResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
//相册
case REQUEST_PICTURE_CHOOSE:
if (resultCode == RESULT_OK) {
Uri sourceUri = data.getData();
startUCrop(sourceUri);
} else {
Toast.makeText(this, "选图失败!", Toast.LENGTH_SHORT).show();
}
break;
//照相
case REQUEST_CAMERA_IMAGE:
if (resultCode == RESULT_OK) {
if (data != null) {
startUCrop(imageUri);
} else {
Toast.makeText(this, "拍照失败!", Toast.LENGTH_SHORT).show();
}
}
break;
//裁剪后的效果
case UCrop.REQUEST_CROP:
if (resultCode == RESULT_OK) {
Uri resultUri = UCrop.getOutput(data);
try {
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(resultUri));
avatarImage.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
//错误裁剪的结果
case UCrop.RESULT_ERROR:
if (resultCode == RESULT_OK) {
final Throwable cropError = UCrop.getError(data);
handleCropError(cropError);
}
break;
}
}
3.4 实现图片裁剪的函数
/**
* 裁剪图片
*
* @param sourceUri
*/
private void startUCrop(Uri sourceUri) {
UCrop.Options options = new UCrop.Options();
//裁剪后图片保存在文件夹中
Uri destinationUri = Uri.fromFile(new File(CROPIMAGEROOT, "uCrop.jpg"));
UCrop uCrop = UCrop.of(sourceUri, destinationUri);//第一个参数是裁剪前的uri,第二个参数是裁剪后的uri
uCrop.withAspectRatio(1, 1);//设置裁剪框的宽高比例
//下面参数分别是缩放,旋转,裁剪框的比例
options.setAllowedGestures(com.yalantis.ucrop.UCropActivity.ALL, com.yalantis.ucrop.UCropActivity.NONE, com.yalantis.ucrop.UCropActivity.ALL);
options.setToolbarTitle("移动和缩放");//设置标题栏文字
options.setCropGridStrokeWidth(2);//设置裁剪网格线的宽度(我这网格设置不显示,所以没效果)
//options.setCropFrameStrokeWidth(1);//设置裁剪框的宽度
options.setMaxScaleMultiplier(3);//设置最大缩放比例
//options.setHideBottomControls(true);//隐藏下边控制栏
options.setShowCropGrid(true); //设置是否显示裁剪网格
//options.setOvalDimmedLayer(true);//设置是否为圆形裁剪框
options.setShowCropFrame(true); //设置是否显示裁剪边框(true为方形边框)
options.setToolbarWidgetColor(Color.parseColor("#ffffff"));//标题字的颜色以及按钮颜色
options.setDimmedLayerColor(Color.parseColor("#AA000000"));//设置裁剪外颜色
options.setToolbarColor(Color.parseColor("#000000")); // 设置标题栏颜色
options.setStatusBarColor(Color.parseColor("#000000"));//设置状态栏颜色
options.setCropGridColor(Color.parseColor("#ffffff"));//设置裁剪网格的颜色
options.setCropFrameColor(Color.parseColor("#ffffff"));//设置裁剪框的颜色
uCrop.withOptions(options);
/*//裁剪后保存到文件中
Uri destinationUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/myxmpp/" + "test1.jpg"));
UCrop uCrop = UCrop.of(sourceUri, destinationUri);
UCrop.Options options = new UCrop.Options();
//设置裁剪图片可操作的手势
options.setAllowedGestures(UCropActivity.SCALE, UCropActivity.ROTATE, UCropActivity.ALL);
//设置toolbar颜色
options.setToolbarColor(ActivityCompat.getColor(this, R.color.orange2));
//设置状态栏颜色
options.setStatusBarColor(ActivityCompat.getColor(this, R.color.orange2));
//是否能调整裁剪框
options.setFreeStyleCropEnabled(true);
options.setToolbarWidgetColor(Color.parseColor("#ffffff"));//标题字的颜色以及按钮颜色
options.setDimmedLayerColor(Color.parseColor("#AA000000"));//设置裁剪外颜色
options.setToolbarColor(Color.parseColor("#000000")); // 设置标题栏颜色
options.setStatusBarColor(Color.parseColor("#000000"));//设置状态栏颜色
options.setCropGridColor(Color.parseColor("#ffffff"));//设置裁剪网格的颜色
options.setCropFrameColor(Color.parseColor("#ffffff"));//设置裁剪框的颜色
//options.setShowCropFrame(false); //设置是否显示裁剪边框(true为方形边框)
uCrop.withOptions(options);*/
uCrop.start(this);
}
实现裁剪可以定制不同的功能,注释写的很清楚,这里不再赘述。可以自己修改,慢慢查看运行效果。
其中UCrop uCrop = UCrop.of(sourceUri, destinationUri);//第一个参数是裁剪前的uri,第二个参数是裁剪后的uri。
完成裁剪之后,在ActivityforResult()中将图片显示在某个imageView中。
这个好像不支持圆形图片的裁剪。稍后将介绍另一种库实现圆形图片的裁剪