首先在layout布局中设置按钮和一个imageview
<button
android:id="@+id/selectimagebtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="选择图片" />
<button
android:id="@+id/cutimagebtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="选择图片进行裁剪" />
<!-- 用于显示图片的信息 -->
<imageview
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
在activity上写代码
public class mainactivity extends appcompatactivity implements view.onclicklistener {
private button selectimagebtn, cutimagebtn;
private imageview imageview;
// 声明两个静态的整型变量,主要用于意图的返回的标志
private static final int image_select = 1;// 选择图片
private static final int image_cut = 2;// 裁剪图片
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
selectimagebtn = (button) findviewbyid(r.id.selectimagebtn);
cutimagebtn = (button) findviewbyid(r.id.cutimagebtn);
imageview = (imageview) findviewbyid(r.id.imageview);
// 注册监听事件
selectimagebtn.setonclicklistener(this);
cutimagebtn.setonclicklistener(this);
}
实现onclicklistener的方法,和设置裁剪图片的方法
@override
public void onclick(view v) {
switch (v.getid()) {
case r.id.selectimagebtn:
//如何提取手机的图片库,并且进行选择图片的功能
intent intent = new intent(intent.action_pick, mediastore.images.media.external_content_uri);//打开手机的图片库
startactivityforresult(intent, image_select);
break;
case r.id.cutimagebtn:
intent intent2 = getimageclipintent();
startactivityforresult(intent2, image_cut);
}
}
private intent getimageclipintent() {
intent intent = new intent(intent.action_get_content, null);//不指定url
//实现对图片的裁剪,必须要设置图片的属性和大小
intent.settype("image/*");//获取任意的图片类型 set an explicit mime data type.每个mime类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。
intent.putextra("crop", "true");//滑动选中图片区域
intent.putextra("aspectx", 1);//表示剪切框的比例1:1的效果
intent.putextra("aspecty", 1);
intent.putextra("outputx", 80);//指定输出图片的大小
intent.putextra("outputy", 80);
intent.putextra("return-data", true);//有返回值
return intent;
}
如果你想在activity中得到新打开activity关闭后返回的数据,你需要使用系统提供的startactivityforresult(intent intent,int requestcode)方法打开新的activity,新的activity关闭后会向前面的activity传回数据,为了得到传回的数据,你必须在前面的activity中重写onactivityresult(int requestcode, int resultcode,intent data)方法
当新activity关闭后,新activity返回的数据通过intent进行传递,android平台会调用前面activity的onactivityresult()方法,把存放了返回数据的intent作为第三个输入参数传入,在onactivityresult()方法中使用第三个输入参数可以取出新activity返回的数据。
需要返回数据或结果的,则使用startactivityforresult (intent intent, intrequestcode)
,requestcode的值是自定义的,用于识别跳转的目标activity。
覆盖onactivityresult方法
@override
protected void onactivityresult(int requestcode, int resultcode, intent data) {
super.onactivityresult(requestcode, resultcode, data);
if (resultcode == result_ok) {
//处理图片按照手机的屏幕大小显示
if (requestcode == image_select) {
uri uri = data.getdata();//获得图片的路径
display display = getwindowmanager().getdefaultdisplay();
point point = new point();
display.getsize(point);
int width = point.x;//获得屏幕的宽度
int height = point.y ;//屏幕高度
try {
//实现对图片的裁剪的类,是一个匿名内部类
bitmapfactory.options options = new bitmapfactory.options();
options.injustdecodebounds = false;
//对图片的宽度和高度对应手机的屏幕进行匹配
bitmap bitmap = bitmapfactory.decodestream(getcontentresolver().openinputstream(uri), null, options);
//如果大于1表示图片的高度大于手机屏幕的高度
int hratio = (int) math.ceil(options.outheight / (float) height);//(int)math.ceil是下取整
//如果大于1表示图片的宽度大于手机屏幕的宽度
int wratio = (int) math.ceil(options.outwidth / (float) width);
//如果hratio或wratio大于1,则把图片缩放到1/radio的尺寸和1/radio^2的像素
if (hratio > 1 || wratio > 1) {
if (hratio > wratio) {
options.insamplesize = hratio;
} else {
options.insamplesize = wratio;
}
bitmap = bitmapfactory.decodestream(getcontentresolver().openinputstream(uri), null, options);
imageview.setimagebitmap(bitmap);
}else{
//如果hratio与wratio为0,直接输出
imageview.setimagebitmap(bitmap);
}
} catch (exception e) {
}
//表示裁剪图片
} else if (requestcode == image_cut) {
bitmap bitmap = data.getparcelableextra("data");
imageview.setimagebitmap(bitmap);
}
}
}
options.injustdecodebounds = false/true;
我们去解析一个图片,如果太大,就会oom,我们可以设置压缩比例insamplesize,但是这个压缩比例设置多少就是个问题,所以我们解析图片可以分为俩个步骤,第一步就是获取图片的宽高,这里要设置options.injustdecodebounds=true
,这时候decode的bitmap为null,只是把图片的宽高放在options里。
然后第二步就是设置合适的压缩比例insamplesize,insamplesize为原来的1/ratio,这时候获得合适的bitmap。
再设置options.injustdecodebounds = false;重新读出图片bitmap = bitmapfactory.decodestream(getcontentresolver().openinputstream(uri), null, options);
以上所述是小编给大家介绍的android imageview实现图片裁剪和显示功能,希望对大家有所帮助