图片裁剪(基于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使用

引入依赖:

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

部分代码:

public class MainActivity extends AppCompatActivity {

    @Bind(R.id.iv_appbar)
ImageView iv_appbar; @Bind(R.id.main_toolbar)
Toolbar toolbar; /* @Bind(R.id.btn_float)
FloatingActionButton btn_float;*/ @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initToolBar();
} private void initToolBar() {
this.setSupportActionBar(toolbar);
toolbar.setTitle("我的");
} @OnClick({R.id.main_toolbar, R.id.btn_float})
public void onClick(View view) {
final UCrop.Options options = new UCrop.Options();
int color = ContextCompat.getColor(view.getContext(), R.color.colorPrimary);
options.setToolbarColor(color);
options.setStatusBarColor(ContextCompat.getColor(view.getContext(), R.color.colorPrimaryDark));
options.setActiveWidgetColor(color);
switch (view.getId()) {
case R.id.main_toolbar:
Toast.makeText(MainActivity.this, "Toolbar点击", Toast.LENGTH_SHORT).show();
break;
case R.id.btn_float: {
showDialog(view, options);
break;
}
}
} private void showDialog(View view, final UCrop.Options options) {
final Context context = view.getContext();
final AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("设置背景图片:").setMessage("如何获取图片?")
.setPositiveButton("相册", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
// RxPaparazzo.takeImage(MainActivity.this)
RxPaparazzo.single(MainActivity.this)
.crop(options)
.usingGallery()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response<MainActivity, FileData>>() {
@Override
public void accept(Response<MainActivity, FileData>
response) throws Exception {
if (response.resultCode() == Activity.RESULT_OK) { File filePath = response.data().getFile();
Bitmap bitmap = BitmapFactory.
decodeFile(filePath.getPath());
iv_appbar.setImageBitmap(bitmap); } else if (response.resultCode() == Activity.RESULT_CANCELED) { Toast.makeText(MainActivity.this, "取消相册访问",
Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, "未知错误!",
Toast.LENGTH_SHORT).show();
}
}
});
}
})
.setNeutralButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
})
.setNegativeButton("拍照", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
// RxPaparazzo.takeImage(MainActivity.this)
RxPaparazzo.single(MainActivity.this)
.crop(options)
.usingCamera()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response<MainActivity, FileData>>() {
@Override
public void accept(Response<MainActivity, FileData>
response) throws Exception { if (response.resultCode() == Activity.RESULT_OK) {
FileData filePath = response.data();
Bitmap bitmap = BitmapFactory.
decodeFile(filePath.getFile().getPath());
iv_appbar.setImageBitmap(bitmap);
} else if (response.resultCode() == Activity.RESULT_CANCELED) {
Toast.makeText(MainActivity.this, "取消拍照",
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "未知错误!",
Toast.LENGTH_SHORT).show();
}
}
});
/**
* new Consumer<Response<MainActivity, String>>() {
@Override public void accept(@NonNull Response<MainActivity, String> response) throws Exception {
if (response.resultCode() == Activity.RESULT_OK) {
String filePath = response.data();
Bitmap bitmap = BitmapFactory.decodeFile(filePath);
iv_appbar.setImageBitmap(bitmap);
} else if (response.resultCode() == Activity.RESULT_CANCELED) {
Toast.makeText(MainActivity.this, "取消拍照", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "未知错误!", Toast.LENGTH_SHORT).show();
}
}
}
*
*/
}
}); AlertDialog dialog = builder.create();
dialog.show(); dialog.getButton(DialogInterface.BUTTON_POSITIVE). setTextColor(ContextCompat.getColor(context, R.color.colorPrimary)
);
dialog.getButton(DialogInterface.BUTTON_NEGATIVE). setTextColor(ContextCompat.getColor(context, R.color.colorPrimary) );
dialog.getButton(DialogInterface.BUTTON_NEUTRAL). setTextColor(ContextCompat.getColor(context, R.color.colorAccent) );
} @Override
protected void onDestroy() {
super.onDestroy();
ButterKnife.unbind(this);//解除绑定
}
}

源码下载...

图片裁剪(基于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. 【算法笔记】A1060 Are They Equal

    1060 Are They Equal (25 分)   If a machine can save only 3 significant digits, the float numbers 1230 ...

  2. [转] ELK 之 Logstash

    [From] https://blog.csdn.net/iguyue/article/details/77006201 ELK 之 Logstash 简介: ELK 之 LogstashLogsta ...

  3. C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限

    C#以管理员权限运行源码,C#软件获取管理员权限,c#获取管理员权限 发布时间:2014-10-19 21:40内容来源:未知 点击: 次 windows 7和vista提高的系统的安全性,同时需要明 ...

  4. [Xarmrin.IOS]使用Build Host 在Windows上建置IOS程式及DeBug (转帖)

    使用Xamarin開發IOS程式時, 必須要在Mac上才可以編譯程式,若想在windows系統上編譯,則可透過Build host的方式, 但還是要有一台Mac的電腦就是了XD 首先你的Mac必須要已 ...

  5. HTML5 五大特性

    一.正则表达式: 相信大家都会非常喜欢这个特性,无须服务器端的检测,使用浏览器的本地功能就可以帮助你判断电子邮件的格式,URL,或者是电话格式,防止用户输入错误的信息,通过使用HTML5的patter ...

  6. io流之转换流InputStreamReader、OutputStreamWriter

    例子程序: package io; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.File ...

  7. C 扩展库 - mysql API

    MySQL API C API Data Structures MYSQL This structure represents handler for one database connection. ...

  8. 剑指offer(36-40)编程题

    两个链表的第一个公共结点 数字在排序数组中出现的次数 二叉树的深度 平衡二叉树 数组中只出现一次的数字 36.输入两个链表,找出它们的第一个公共结点. class Solution1 { public ...

  9. python实例:元组命名 频次统计 字典排序

    1.为元组中元素命名 方法1.定义常量 NAME, AGE = 0, 1 student = ('乔峰', 29, 'qf@jinyong.com') name = student[NAME] age ...

  10. redis的数据类型(二)string类型

      下面讲解value,value包括String.List.Set.Sorted Set.Hash 一.String类型 1.string类型  String是最基本的类型,而且Stirng类型是二 ...