1 uCrop简介

最近项目中用到了图片裁剪功能,于是百度了一下,发现了uCrop这个框架,这个框架的星星数很多,就决定使用这个框架

uCrop的Github地址:https://github.com/Yalantis/uCrop

uCrop的特点:

  1. 裁剪框不动,图片动
  2. 图片可以旋转,缩放
  3. 支持各种比例裁剪框

uCrop的效果图(来自其Github):

2 集成uCrop

(1) uCrop集成方法:

compile 'com.yalantis:ucrop:1.4.1'

(2) 修改当前项目的build.gradle文件,修改后代码如下:

android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {applicationId "com.test"minSdkVersion 15targetSdkVersion 23versionCode 1versionName "1.0"}....
}dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])compile 'com.android.support:appcompat-v7:23.3.0'compile 'com.yalantis:ucrop:1.4.1'
}

注意:修改了targetSdkVersion后com.android.support:appcompat-v7的版本也要相匹配

虽然使用maven依赖的话即使appcompat-v7的版本不匹配也没有关系,但使用aar文件则会报错,所以建议你修改了compileSdkVersion 后也要修改appcompat-v7的版本,搞不好就会遇到问题

(3) 如果你没有23版本的sdk,也就是Android 6.0的sdk,则要启动sdk manger去下载,同时也要下载Android SDK Build-tools 23.0.2,如下图:

(4) 修改gradle插件的版本
修改整个project最外面的全局build.gradle文件的gradle版本:

 dependencies {classpath 'com.android.tools.build:gradle:2.0.0'}

(5) 下载最新的gradle

Gradle下载地址:http://services.gradle.org/distributions

目前最新版本是gradle-2.13-rc-2-all.zip,下载完成后解压,然后在Android Studio中指定gradle的地址,如下图所示:

要使用2.0以上版本的gradle插件,必须使用2.10以上的gradle,注意gradle插件和gradle是两个东西,前者是Android Studio的插件,后者是独立的东西

(6) 准备工作完毕,同步代码,uCrop已经集成到我们的项目中去了,是不是很麻烦?不然我写这篇文章干嘛。

注意:uCrop必须使用23及以上版本的sdk,gradle插件版本必须2.0.0及以上,gradle版本必须2.10及以上,appcompat-v7版本必须23.0及以上

如果以上都满足了,应该就不会报错了。至于为什么非要23以上的sdk,因为uCrop使用了Android 6.0的新特性:VectorDrawable

3 uCrop的用法

(1) 在AndroidManifest.xml中添加UCropActivity,代码如下:

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

(2) 在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>

(3) MainActivity代码如下:

public class MainActivity extends Activity {Button btnTest;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnTest = (Button) findViewById(R.id.btn_test);btnTest.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {startCrop();}});}private void startCrop() {Uri sourceUri = Uri.parse("http://star.xiziwang.net/uploads/allimg/140512/19_140512150412_1.jpg");//裁剪后保存到文件中Uri destinationUri = Uri.fromFile(new File(getCacheDir(), "SampleCropImage.jpeg"));UCrop.of(sourceUri, destinationUri).withAspectRatio(16, 9).withMaxResultSize(300, 300).start(this);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {//裁切成功if (requestCode == UCrop.REQUEST_CROP) {Uri croppedFileUri = UCrop.getOutput(data);//获取默认的下载目录String downloadsDirectoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();String filename = String.format("%d_%s", Calendar.getInstance().getTimeInMillis(), croppedFileUri.getLastPathSegment());File saveFile = new File(downloadsDirectoryPath, filename);//保存下载的图片FileInputStream inStream = null;FileOutputStream outStream = null;FileChannel inChannel = null;FileChannel outChannel = null;try {inStream = new FileInputStream(new File(croppedFileUri.getPath()));outStream = new FileOutputStream(saveFile);inChannel = inStream.getChannel();outChannel = outStream.getChannel();inChannel.transferTo(0, inChannel.size(), outChannel);Toast.makeText(this, "裁切后的图片保存在:" + saveFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();} catch (Exception e) {e.printStackTrace();} finally {try {outChannel.close();outStream.close();inChannel.close();inStream.close();} catch (Exception e) {e.printStackTrace();}}}}//裁切失败if (resultCode == UCrop.RESULT_ERROR) {Toast.makeText(this, "裁切图片失败", Toast.LENGTH_SHORT).show();}}}

主界面layout\activity_main.xml上就一个按钮,不贴出代码了
(4) 调用uCrop去裁切的方法

Uri sourceUri = Uri.parse("http://star.xiziwang.net/uploads/allimg/140512/19_140512150412_1.jpg");//裁剪后保存到文件中Uri destinationUri = Uri.fromFile(new File(getCacheDir(), "SampleCropImage.jpeg"));UCrop.of(sourceUri, destinationUri).withAspectRatio(16, 9).withMaxResultSize(300, 300).start(this);

本例中是从网上下载一张图片,裁切后保存到本地
(5) 获取裁切后的图片代码如下

//裁切成功
if (requestCode == UCrop.REQUEST_CROP) {Uri croppedFileUri = UCrop.getOutput(data);//获取默认的下载目录String downloadsDirectoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();String filename = String.format("%d_%s", Calendar.getInstance().getTimeInMillis(), croppedFileUri.getLastPathSegment());File saveFile = new File(downloadsDirectoryPath, filename);//保存下载的图片FileInputStream inStream = null;FileOutputStream outStream = null;FileChannel inChannel = null;FileChannel outChannel = null;try {inStream = new FileInputStream(new File(croppedFileUri.getPath()));outStream = new FileOutputStream(saveFile);inChannel = inStream.getChannel();outChannel = outStream.getChannel();inChannel.transferTo(0, inChannel.size(), outChannel);Toast.makeText(this, "裁切后的图片保存在:" + saveFile.getAbsolutePath(), Toast.LENGTH_SHORT).show();} catch (Exception e) {e.printStackTrace();} finally {try {outChannel.close();outStream.close();inChannel.close();inStream.close();} catch (Exception e) {e.printStackTrace();}}}

重写onActivityResult()方法,通过data获取返回的uri,再从uri中取得裁切后的文件地址,然后保存到本地

注意:要获取裁切后的uri,必须使用 Uri croppedFileUri = UCrop.getOutput(data),不能使用 Uri uri = data.getData()否则会报空指针错误

如果裁切失败,代码如下:

 //裁切失败if (resultCode == UCrop.RESULT_ERROR) {Toast.makeText(this, "裁切图片失败", Toast.LENGTH_SHORT).show();}

4 效果图

5 使用aar遇到的问题

为什么建议使用aar文件,而不是maven依赖,请参考我的这篇博客:

[Android Studio系列(三)]Android Studio 编译、同步慢的解决方法

如何下载uCrop的aar文件也请参考我上面这篇博客,目前下载的最新的uCrop的aar文件是ucrop-1.4.1.aar

如果使用uCrop的aar文件的话,可能会遇到下面的问题:

仔细看报的错:

Error:(35) No resource identifier found for attribute 'srcCompat' in package 'com.test3'

百度了半天,也没有找到原因,最后模仿uCrop的demo修改了appcompat-v7的版本,解决了问题,经过实践,appcompat-v7应该修改为如下代码:

compile 'com.android.support:appcompat-v7:23.3.0'

6 其他可能遇到的问题

(1) sdk版本太低

仔细看,发现报下面两个错:

Error:(2) Error retrieving parent for item: No resource found that matches the given name ‘android:TextAppearance.Material.Widget.Button.Inverse’.

Error:(2) Error retrieving parent for item: No resource found that matches the given name ‘android:Widget.Material.Button.Colored’.

报这两个错的原因是: values-23是API 23(Android 6.0)中的资源文件,也就是说我们的sdk版本太低了。查看uCrop给出的例子发现确实是我们的版本太低了, uCrop的示例中build.gradle文件地址如下:

https://github.com/Yalantis/uCrop/blob/master/sample/build.gradle

(2) gradle插件版本太低


仔细看,报错:

Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #1: invalid drawable tag vector
at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:933)

如果sdk已经是23了,运行时报下面的错,就是gradle插件版本没有达到2.0的原因,解决方法是:classpath 'com.android.tools.build:gradle:2.0.0'

(3) gradle版本太低

仔细看,报错:

Error:Gradle version 2.10 is required. Current version is 2.8. If using the gradle wrapper, try editing the distributionUrl in D:\AndroidStudioProjects\Hello7\gradle\wrapper\gradle-wrapper.properties to gradle-2.10-all.zip
Fix Gradle wrapper and re-import project
Gradle settings

一看就明白是gradle版本太低了,按照第2步去下载最新的gradle,然后在Android Studio中指定即可

(4) 引入UCropActivity不当导致action bar报错

仔细看,报错:

Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.

原因是,在AndroidManifest.xml中UCropActivity时掉了android:theme="@style/Theme.AppCompat.Light.NoActionBar"这句话,正确的引入代码是:

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

注意:最后一句不能掉

(5) Mutate() is not supported for older platform 问题
最近在使用的时候发现报了下面这个错误:

仔细看报错:

Mutate() is not supported for older platform - Therefore, override color resource (ucrop_color_toolbar_widget) in your app to make it work on pre-L devices

解决方法是在color.xml中添加下面一段代码:

<!-- UCrop colors -->
<color name="ucrop_color_toolbar_widget">@color/white</color>

如果还是无法显示图片,那么请检查你的图片url是否能正确打开。

7 总结

经过一番折腾,终于把uCrop用上了,这个项目还是很新的,使用了Android 6.0中的victor drawable,代码中也用到很多Android新特性,例如:注释@NoNull等,值得去看一看作者的源码。经过本文的讲解,相信你应该已经愉快的用上了uCrop了,如果还遇到什么问题,欢迎给我留言

8 转载请注明来自”梧桐那时雨”的博客:http://blog.csdn.net/fuchaosz/article/details/51202264

Tips
如果觉得这篇博客对你有帮助或者喜欢博主的写作风格,就给博主留个言或者顶一下呗,鼓励博主创作出更多优质博客,Thank you.

Android 图片裁切框架 uCrop 的用法相关推荐

  1. 一款现代、高效的 Android 图片压缩框架

    本项目主要基于 Android 自带的图片压缩 API 进行实现,提供了开源压缩方案 Luban 和 Compressor 的实现,解决了单一 Fie 类型数据源的问题,并在它们的基础之上进行了功能上 ...

  2. Android图片缓存框架Glide

    Android图片缓存框架Glide Glide是Google提供的一个组件.它具有获取.解码和展示视频剧照.图片.动画等功能.它提供了灵活的API,帮助开发者将Glide应用在几乎任何网络协议栈中. ...

  3. android 图片剪切组件,Android 图片裁剪库 uCrop

    软件介绍 uCrop 是[Yalantis](https://yalantis.com/) 组织开源的图片裁剪库, 支持缩放, 旋转图片, 支持各种比例的裁剪框, 非常强大的一个图片裁剪库. 使用 1 ...

  4. 推荐一个 Android 图片压缩框架

    Luban(鲁班) -- Android图片压缩工具,仿微信朋友圈压缩策略. 项目描述 目前做App开发总绕不开图片这个元素.但是随着手机拍照分辨率的提升,图片的压缩成为一个很重要的问题.单纯对图片进 ...

  5. Android图片选择框架

    1.今天做开发,需要一个相册多选功能,然后就上网查了一下,看了有一个jar包,可以直接引用,就直接调用了, com.yanzhenjie:album:1.0.0 本来想直接写一个左右循环移动的方法,但 ...

  6. android图片选择器框架支持长图,基于RxJava的Android图片选择器. – RxPicker

    RxPicker 基于 RxJava 的 Android 图片选择器. 特性 与 RxJava 结合,支持响应式得到选择图片结果 兼容 Android 7.0 自定义 ImageLoader 预览 使 ...

  7. Android图片压缩框架汇总分析

    Luban(鲁班) -- Android图片压缩工具,仿微信朋友圈压缩策略 github地址(8k star的信赖,中文文档) Compressor github地址(3.6k start,无中文文档 ...

  8. Android图片缓存框架 - Fresco的GenericDraweeHierarchy (五)

    目录 1.Fresco 简介 2. Fresco 文档 3. Fresco开发步骤 4. Fresco加载图片6种方式 5. Drawees xm属性设置 6 Fresco实现圆角或圆形图片 7. D ...

  9. Android 图片选择框架ImageSelector适配Android10及以上

    参考地址: 1.引入依赖 在Project的build.gradle在添加以下代码 allprojects {repositories {...maven { url 'https://jitpack ...

  10. android 图片压缩 框架鲁班。

    图片压缩很常见,实现有很多方式,这里使用很好用luban ,Luban(鲁班)就是通过在微信朋友圈发送近100张不同分辨率图片,对比原图与微信压缩后的图片逆向推算出来的压缩算法. 压缩率真的很高,并且 ...

最新文章

  1. 深度学习(计算机视觉方向)小白入门的一些建议
  2. python集合用法详解(创建、添加(add()、update())、删除(remove()、discard()、pop())、查找(in、not in))
  3. iPhone XS MAX全球首碎!一看官方维修价 网友:修不起!
  4. IDEA 的 LeetCode 刷题插件 leetcode editor
  5. 线性代数:第二章 矩阵及其运算:逆矩阵、分块矩阵
  6. python网络信息提取_Python网络爬虫与信息提取入门13
  7. Host ‘host_name’ is blocked
  8. LeetCode 2011. 执行操作后的变量值
  9. 学生成绩管理系统java+mysql+swing入门级项目开发
  10. python终端指令大全_使用python模拟命令行终端的示例
  11. ssm数据库异常问题
  12. leetcode 题库894-- 所有可能的满二叉树
  13. 免费python课程排行榜-Python势头大好,PYPL 11 月编程语言排行榜
  14. Widget改变大小
  15. 重磅!解读国内唯一入选全球顶会SIGCOMM的阿里云网络论文
  16. Java练习题--员工类案例练习
  17. git的安装步骤,仅适用于windows-64位系统
  18. QCheckBox::toggled(bool)和QCheckBox::clicked(bool)的区别
  19. 桌面计算机未响应怎么办,电脑卡死程序未响应的解决方法步骤详解
  20. 【漏洞复现-coldfusion-文件读取】vulfocus/coldfusion-cve_2010_2861

热门文章

  1. linux 打印文件目录结构,linux基本文件目录的结构及管理
  2. idea 内存溢出问题
  3. JNI便捷开发框架JNA框架之指针参数Pointer(二)
  4. java短信验证码_java实现发送短信验证码
  5. 从抢票软件到浏览器设计
  6. 前端开发工程师职位要求
  7. error和exception区别,throw和throws
  8. Android 打开应用商店评分
  9. 高校计算机水平能力联合测试成绩,学校关于开展2017年度专业技术职务任职资格评审工作的通知...
  10. java zhs16gbk_oracle 修改字符集 为ZHS16GBK