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

开发环境:AndroidStudio2.2.1+gradle-2.14.1
涉及知识:
引入依赖:
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)的更多相关文章
- 基于jQuery功能非常强大的图片裁剪插件
今天我们要来介绍一款基于jQuery功能非常强大的图片裁剪插件,这款jQuery图片裁剪插件可以选择裁剪框的尺寸比例,可以设置高宽尺寸,同时可以设置图片翻转角度,当然也支持图片的缩放,裁剪框也可以用鼠 ...
- Cropper – 简单的 jQuery 图片裁剪插件
Cropper 是一个简单的 jQuery 图像裁剪插件.它支持选项,方法,事件,触摸(移动),缩放,旋转.输出的裁剪数据基于原始图像大小,这样你就可以用它们来直接裁剪图像. 如果你尝试裁剪跨域图像, ...
- struts2+jsp+jquery+Jcrop实现图片裁剪并上传
<1> 使用html标签上传需要裁剪的大图. <2> 在页面呈现大图,使用Jcrop(Jquery)对大图进行裁剪,并且可以进行预览. <3> 选择好截取部分之后发 ...
- bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (二) 图片裁剪
图片裁剪参见: http://deepliquid.com/projects/Jcrop/demos.php?demo=thumbnail 一个js插件 http://www.mikes ...
- 从web图片裁剪出发:了解H5中的canvas
本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 重说三,好了,现在进 ...
- react-native多图选择、图片裁剪(支持ad/ios图片个数控制)
扯淡: 目前关于rn比较知名并且封装好的图片选择控件很多,不过能同时支持多图片上传,个数控制兼容iOS/Ad的却寥寥无几,而今天介绍的这款框架可以实现:图片裁剪.最大图片个数限制.拍照.本地相册等功能 ...
- node.js平台下,cropper.js实现图片裁剪预览并转换为base64发送至服务端。
一 .准备工作 1.首先需要先下载cropper,常规使用npm,进入项目路径后执行以下命令: npm install cropper 2. cropper基于jquery,在此不要忘记引入jq,同时 ...
- cropper.js实现图片裁剪预览并转换为base64发送至服务端。
一 .准备工作 1.首先需要先下载cropper,常规使用npm,进入项目路径后执行以下命令: npm install cropper 2. cropper基于jquery,在此不要忘记引入jq,同时 ...
- JavaScript图片裁剪
1.jquery 图片裁剪库选择 Jcrop:http://deepliquid.com/content/Jcrop.html imgareaselect:http://odyniec.net/pro ...
随机推荐
- 【性能测试】:oracle数据库的监控方式
一,[前提]:登陆操作系统后,需要切换到SQLPLUS的命令行模式:sqlplus / as sysdba 二,[监控步骤]:开始时执行一次:SQL>exec DBMS_WORKLOAD_REP ...
- Q138 复制带随机指针的链表
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的深拷贝. 示例: 输入: {"$id":"1",& ...
- 【WinSCP】WinSCP 5.x使用密钥连接服务器
在WinSCP 4.x中,主页面有一个添加密钥文件的选项,如下图所示 但是在WinSCP 5.x中主界面发生了很大的变化 在主页上没有了载入密钥文件的选项,那么我们应该怎么使用密钥验证呢? WinSC ...
- linux 安装php bz2扩展
折腾了半天,最大的坑就是我是用lnmp一键安装php环境,php7下面没有ext文件夹,有个include下面虽然有个ext 但是里面没有需要的bz2 也尝试去pecl 和 pear 上面去找 无 ...
- docker搭建gitlab,设置邮件提醒,并运行runner
接着http://www.cnblogs.com/wsy1030/p/8431837.html 在另一台机子运行gitlab: docker run --name='gitlab' -d -p 222 ...
- PHP之mb_strstr使用
mb_strstr (PHP 5 >= 5.2.0, PHP 7) mb_strstr - Finds first occurrence of a string within another 查 ...
- 使用gdb进行写操作
使用gdb调试程序,读写操作是很普遍的事情.其中,读操作包括: 读取某个变量的值 读取某个内存地址里的内容 读取某个寄存器的值 对应地,写操作包括: 修改某个变量的值 修改某个内存地址里的内容 修改某 ...
- Memcached分布式算法详解--转
http://xiexiejiao.cn/java/memcached-consistent-hashing.html Memcached分布式算法在网上一搜可以找到一大片了,不过对于Memcache ...
- php中常量 const属性,静态属性,静态的函数方法
<?php//php中的常量define('MYNUM', 2000);echo MYNUM.'<br>';if(!defined('MYNUM')){ define('MYNUM' ...
- bug: 1.eclipse 中tomcat server 变灰色 2.build path 添加的jar不识别
1.网上百度的方案试过,没有作用. 最后删掉tomcat重新解压配置解决. 确保工程属性栏中,server正确才可加载tomcat. 猜测可能原因,tomcat在eclipse有时崩溃,一般做法是将s ...