图片裁剪(基于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. WebFrom局部刷新

    因为页面用的是服务器的控件 结果每次触发后导致页面刷新 把刚填完的数据给整没了 很烦 在网上找了蛮久才找到的一个方法 战略插眼 以后还有用到的时候 <asp:ScriptManager runa ...

  2. create-react-app安装出错问题解决

    在用create-react-app的时候 报错 错误如下图: 在SF上查到说是或许是因为国内npm拉去资源,拉去不到的问题,可以试着从解决创建create-react-app慢的方法着手: 解决方法 ...

  3. 思维题--code forces round# 551 div.2

    思维题--code forces round# 551 div.2 题目 D. Serval and Rooted Tree time limit per test 2 seconds memory ...

  4. [Xamarin.Android]使用Java Bindings Libary專案 Binding Java元件(.jar) 與Metadata.xml、型別對應 (转帖)

    使用Xamarin開發Android APP時, 如果已經有原本就用Java寫好的套件(.jar), 就可以利用Xamarin提供的Java Bindings Libary將他變成C#可使用的元件. ...

  5. win7 免安装MariaDB

    1.  官网下载MariaDB的windows版本 地址:https://downloads.mariadb.org/mariadb/10.0.17/ 目前最新版本是10.0.17 2.  下载完成后 ...

  6. Linus' Law

    Given enough eyeballs, all bugs are shallow.                                               ------埃里克 ...

  7. Jmeter创建一个 JMS 主题的测试计划

    新建一个 JMS 主题的测试计划 JMS 需要下载一些可选的jar 文件.详细信息请参阅 第一章:新手入门.在本章节,将学习如何创建测试计划来测试JMS提供程序.创建5个订阅者和1个发布者.创建2个线 ...

  8. ECharts概念学习系列之ECharts官网教程之自定义构建 ECharts(图文详解)

    不多说,直接上干货! 官网 http://echarts.baidu.com/tutorial.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9E%84%E5%BB%BA%2 ...

  9. JAVA的静态代理与动态代理比较--转载

    扩展:http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/JAVA的静态代理与动态代理比较 一.概念 代理模式是常用的Java 设计模式,它的特 ...

  10. 汇编语言、与C语言、实现--汉诺塔--

    题意描述:   用汇编语言实现汉诺塔.只需要显示移盘次序,不必显示所移盘的大小,例如: X>Z,X>Y,Z>Y,X>Z,..... (n阶Hanoi塔问题)假设有三个分别命名为 ...