图片裁剪(基于RxPaparazzo)

前言:基于RxPaparazzo的图片裁剪,图片旋转、比例放大|缩小。

效果:

开发环境:AndroidStudio2.2.1+gradle-2.14.1

涉及知识:

1.Material Design(CardView+CoordinatorLayout+AppBarLayout+NestedScrollView+CollapsingToolbarLayout+Toolbar+FloatingActionButton)使用
 
2.butterknife注解式开发
 
3.基于RxJava+RxAndroid的RxPaparazzo使用

引入依赖:

  1. compile 'com.android.support:appcompat-v7:24.+'
  2. //RxPaparazzo 拍照&相册
  3. // compile "com.github.miguelbcr:RxPaparazzo:0.4.2-2.x"
  4. compile ("com.github.miguelbcr:RxPaparazzo:0.5.2-2.x") {
  5. exclude module: 'okhttp'
  6. exclude module: 'okio'
  7. }
  8. compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
  9. compile 'com.android.support:cardview-v7:24.+'
  10. // compile 'com.android.support:customtabs:24.+'
  11. compile 'com.android.support:design:24.+'
  12. compile 'com.jakewharton:butterknife:7.0.1'

部分代码:

  1. public class MainActivity extends AppCompatActivity {
  2.  
  3. @Bind(R.id.iv_appbar)
  4. ImageView iv_appbar;
  5.  
  6. @Bind(R.id.main_toolbar)
  7. Toolbar toolbar;
  8.  
  9. /* @Bind(R.id.btn_float)
  10. FloatingActionButton btn_float;*/
  11.  
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. super.onCreate(savedInstanceState);
  15. setContentView(R.layout.activity_main);
  16. ButterKnife.bind(this);
  17. initToolBar();
  18. }
  19.  
  20. private void initToolBar() {
  21. this.setSupportActionBar(toolbar);
  22. toolbar.setTitle("我的");
  23. }
  24.  
  25. @OnClick({R.id.main_toolbar, R.id.btn_float})
  26. public void onClick(View view) {
  27. final UCrop.Options options = new UCrop.Options();
  28. int color = ContextCompat.getColor(view.getContext(), R.color.colorPrimary);
  29. options.setToolbarColor(color);
  30. options.setStatusBarColor(ContextCompat.getColor(view.getContext(), R.color.colorPrimaryDark));
  31. options.setActiveWidgetColor(color);
  32. switch (view.getId()) {
  33. case R.id.main_toolbar:
  34. Toast.makeText(MainActivity.this, "Toolbar点击", Toast.LENGTH_SHORT).show();
  35. break;
  36. case R.id.btn_float: {
  37. showDialog(view, options);
  38. break;
  39. }
  40. }
  41. }
  42.  
  43. private void showDialog(View view, final UCrop.Options options) {
  44. final Context context = view.getContext();
  45. final AlertDialog.Builder builder = new AlertDialog.Builder(context);
  46. builder.setTitle("设置背景图片:").setMessage("如何获取图片?")
  47. .setPositiveButton("相册", new DialogInterface.OnClickListener() {
  48. @Override
  49. public void onClick(DialogInterface dialog, int which) {
  50. dialog.dismiss();
  51. // RxPaparazzo.takeImage(MainActivity.this)
  52. RxPaparazzo.single(MainActivity.this)
  53. .crop(options)
  54. .usingGallery()
  55. .subscribeOn(Schedulers.io())
  56. .observeOn(AndroidSchedulers.mainThread())
  57. .subscribe(new Consumer<Response<MainActivity, FileData>>() {
  58. @Override
  59. public void accept(Response<MainActivity, FileData>
  60. response) throws Exception {
  61. if (response.resultCode() == Activity.RESULT_OK) {
  62.  
  63. File filePath = response.data().getFile();
  64. Bitmap bitmap = BitmapFactory.
  65. decodeFile(filePath.getPath());
  66. iv_appbar.setImageBitmap(bitmap);
  67.  
  68. } else if (response.resultCode() == Activity.RESULT_CANCELED) {
  69.  
  70. Toast.makeText(MainActivity.this, "取消相册访问",
  71. Toast.LENGTH_SHORT).show();
  72.  
  73. } else {
  74.  
  75. Toast.makeText(MainActivity.this, "未知错误!",
  76. Toast.LENGTH_SHORT).show();
  77. }
  78. }
  79. });
  80. }
  81. })
  82. .setNeutralButton("取消", new DialogInterface.OnClickListener() {
  83. @Override
  84. public void onClick(DialogInterface dialog, int which) {
  85. dialog.dismiss();
  86. }
  87. })
  88. .setNegativeButton("拍照", new DialogInterface.OnClickListener() {
  89. @Override
  90. public void onClick(DialogInterface dialog, int which) {
  91. dialog.dismiss();
  92. // RxPaparazzo.takeImage(MainActivity.this)
  93. RxPaparazzo.single(MainActivity.this)
  94. .crop(options)
  95. .usingCamera()
  96. .subscribeOn(Schedulers.io())
  97. .observeOn(AndroidSchedulers.mainThread())
  98. .subscribe(new Consumer<Response<MainActivity, FileData>>() {
  99. @Override
  100. public void accept(Response<MainActivity, FileData>
  101. response) throws Exception {
  102.  
  103. if (response.resultCode() == Activity.RESULT_OK) {
  104. FileData filePath = response.data();
  105. Bitmap bitmap = BitmapFactory.
  106. decodeFile(filePath.getFile().getPath());
  107. iv_appbar.setImageBitmap(bitmap);
  108. } else if (response.resultCode() == Activity.RESULT_CANCELED) {
  109. Toast.makeText(MainActivity.this, "取消拍照",
  110. Toast.LENGTH_SHORT).show();
  111. } else {
  112. Toast.makeText(MainActivity.this, "未知错误!",
  113. Toast.LENGTH_SHORT).show();
  114. }
  115. }
  116. });
  117. /**
  118. * new Consumer<Response<MainActivity, String>>() {
  119. @Override public void accept(@NonNull Response<MainActivity, String> response) throws Exception {
  120. if (response.resultCode() == Activity.RESULT_OK) {
  121. String filePath = response.data();
  122. Bitmap bitmap = BitmapFactory.decodeFile(filePath);
  123. iv_appbar.setImageBitmap(bitmap);
  124. } else if (response.resultCode() == Activity.RESULT_CANCELED) {
  125. Toast.makeText(MainActivity.this, "取消拍照", Toast.LENGTH_SHORT).show();
  126. } else {
  127. Toast.makeText(MainActivity.this, "未知错误!", Toast.LENGTH_SHORT).show();
  128. }
  129. }
  130. }
  131. *
  132. */
  133. }
  134. });
  135.  
  136. AlertDialog dialog = builder.create();
  137. dialog.show();
  138.  
  139. dialog.getButton(DialogInterface.BUTTON_POSITIVE).
  140.  
  141. setTextColor(ContextCompat.getColor(context, R.color.colorPrimary)
  142. );
  143. dialog.getButton(DialogInterface.BUTTON_NEGATIVE).
  144.  
  145. setTextColor(ContextCompat.getColor(context, R.color.colorPrimary)
  146.  
  147. );
  148. dialog.getButton(DialogInterface.BUTTON_NEUTRAL).
  149.  
  150. setTextColor(ContextCompat.getColor(context, R.color.colorAccent)
  151.  
  152. );
  153. }
  154.  
  155. @Override
  156. protected void onDestroy() {
  157. super.onDestroy();
  158. ButterKnife.unbind(this);//解除绑定
  159. }
  160. }

源码下载...

图片裁剪(基于RxPaparazzo)的更多相关文章

  1. 基于jQuery功能非常强大的图片裁剪插件

    今天我们要来介绍一款基于jQuery功能非常强大的图片裁剪插件,这款jQuery图片裁剪插件可以选择裁剪框的尺寸比例,可以设置高宽尺寸,同时可以设置图片翻转角度,当然也支持图片的缩放,裁剪框也可以用鼠 ...

  2. Cropper – 简单的 jQuery 图片裁剪插件

    Cropper 是一个简单的 jQuery 图像裁剪插件.它支持选项,方法,事件,触摸(移动),缩放,旋转.输出的裁剪数据基于原始图像大小,这样你就可以用它们来直接裁剪图像. 如果你尝试裁剪跨域图像, ...

  3. struts2+jsp+jquery+Jcrop实现图片裁剪并上传

    <1> 使用html标签上传需要裁剪的大图. <2> 在页面呈现大图,使用Jcrop(Jquery)对大图进行裁剪,并且可以进行预览. <3> 选择好截取部分之后发 ...

  4. bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (二) 图片裁剪

    图片裁剪参见: http://deepliquid.com/projects/Jcrop/demos.php?demo=thumbnail        一个js插件 http://www.mikes ...

  5. 从web图片裁剪出发:了解H5中的canvas

    本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 重说三,好了,现在进 ...

  6. react-native多图选择、图片裁剪(支持ad/ios图片个数控制)

    扯淡: 目前关于rn比较知名并且封装好的图片选择控件很多,不过能同时支持多图片上传,个数控制兼容iOS/Ad的却寥寥无几,而今天介绍的这款框架可以实现:图片裁剪.最大图片个数限制.拍照.本地相册等功能 ...

  7. node.js平台下,cropper.js实现图片裁剪预览并转换为base64发送至服务端。

    一 .准备工作 1.首先需要先下载cropper,常规使用npm,进入项目路径后执行以下命令: npm install cropper 2. cropper基于jquery,在此不要忘记引入jq,同时 ...

  8. cropper.js实现图片裁剪预览并转换为base64发送至服务端。

    一 .准备工作 1.首先需要先下载cropper,常规使用npm,进入项目路径后执行以下命令: npm install cropper 2. cropper基于jquery,在此不要忘记引入jq,同时 ...

  9. JavaScript图片裁剪

    1.jquery 图片裁剪库选择 Jcrop:http://deepliquid.com/content/Jcrop.html imgareaselect:http://odyniec.net/pro ...

随机推荐

  1. 【性能测试】:解决loadrunner执行脚本启动慢的问题

    解决方法更改.net安装目录中一个配置文件machine.config. 该文件位于.net安装目录下v2.0.50727\CONFIG(如C:\Windows\Microsoft.NET\Frame ...

  2. 20190416 OSX系统使用VMware Fusion安装CentOS7踩的那些坑

    一.创建虚拟机 (1)在虚拟机资源库中点击[+添加]按钮,选择“新建...”选项 (2)选择创建自定义虚拟机 (3)选择系统类型为CentOS (4)选择虚拟磁盘类型 (5)选择虚拟机存储位置:点击[ ...

  3. java 调用 C# 类库 实战视频, 非常简单, 通过 云寻觅 javacallcsharp 生成器 一步即可!

    java 调用 C# 类库 实战视频, 非常简单, 通过 云寻觅 javacallcsharp 生成器 一步即可! 通过 云寻觅 javacallcsharp 生成器 自动生成java jni类库,  ...

  4. 【Markdown】Markdown相关问题

    1.显示多行代码 将代码用一个tab缩进或者四个空格缩进

  5. VS2015 release模式下进行debug调试

    有时候软件发布,又不得不调试其中的某个dll模块, 这时候就需要在发布的release版本的软件中来调试其中的dll模块了. vs2015设置: 1.Release模式下右键工作属性,选择C/C++, ...

  6. 【Kafka】Kafka数据可靠性深度解读

    转帖:http://www.infoq.com/cn/articles/depth-interpretation-of-kafka-data-reliability Kafka起初是由LinkedIn ...

  7. android系统权限的管理

    被权限搞了好久,决定好好的研究一下: 参考资料 http://blog.csdn.net/xieyan0811/article/details/6083019?reload http://blog.c ...

  8. [转]asp.net权限认证:摘要认证(digest authentication)

    本文转自:http://www.cnblogs.com/lanxiaoke/p/6357501.html 摘要认证简单介绍 摘要认证是对基本认证的改进,即是用摘要代替账户密码,从而防止明文传输中账户密 ...

  9. Java如何操作对象(bean)进行动态排序?

    原文出自:https://blog.csdn.net/seesun2012 简介如题:Java如何操作对象(bean)进行动态排序?Java实体类(bean)动态排序? 原理:利用反射根据指定的属性值 ...

  10. 清空控件的TeXt属性

    foreach (Control item in groupBox1.Controls) { if (item is TextBox) //判断控件是不是TextBox { item.Text = & ...