Android传递Bitmap对象在两个Activity之间
程序员文章站
2023-12-20 14:51:22
通过内部存储方式实现了在两个activity之间传递bitmap对象以及其它支持串行化的java对象,关键点有如下:
1. http客户端下载图片,通过ima...
通过内部存储方式实现了在两个activity之间传递bitmap对象以及其它支持串行化的java对象,关键点有如下:
1. http客户端下载图片,通过imageview对象显示
2. 把imageview上的bitmap对象从当前activity传递到另外一个activity中并显示出来
3. 基于串行化传递java对象数据
首先看我是怎么实现http客户端下载图片,通过异步task接口实现http客户端下载图片并通过handler来更新imageview,代码如下:
package com.example.sharedemo; import java.io.ioexception; import java.io.inputstream; import org.apache.http.httpentity; import org.apache.http.httpresponse; import org.apache.http.httpstatus; import org.apache.http.client.clientprotocolexception; import org.apache.http.client.httpclient; import org.apache.http.client.methods.httpget; import org.apache.http.impl.client.defaulthttpclient; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.os.asynctask; import android.os.handler; import android.os.message; import android.util.log; public class imageloadtask extends asynctask<string, void, bitmap> { private handler handler; public imageloadtask(handler handler) { this.handler = handler; } protected void onpostexecute(bitmap bitmap) { message msg = new message(); msg.obj = bitmap; handler.sendmessage(msg); } @override protected bitmap doinbackground(string... urls) { bitmap bitmap = null; // create http client httpclient httpclient = new defaulthttpclient(); try { // get request log.i("image-url", urls[0]); httpget httprequest = new httpget(urls[0]); httpresponse httpresponse = httpclient.execute(httprequest); if (httpresponse.getstatusline().getstatuscode() == httpstatus.sc_ok) { // get entity from response httpentity httpentity = httpresponse.getentity(); // read stream inputstream is = httpentity.getcontent(); bitmap = bitmapfactory.decodestream(is); is.close(); log.i("image", "already get the image by url : " + urls[0]); } } catch (clientprotocolexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } finally { httpclient.getconnectionmanager().shutdown(); } return bitmap; } }
在当前的activity中通过按钮上的事件响应实现切换view到对应的activity中去,同时实现java串行化数据传递。mainactivity的代码如下:
package com.example.sharedemo; import java.io.bytearrayoutputstream; import java.io.fileoutputstream; import android.app.activity; import android.content.context; import android.content.intent; import android.graphics.bitmap; import android.graphics.matrix; import android.graphics.drawable.bitmapdrawable; import android.os.bundle; import android.os.handler; import android.os.message; import android.util.log; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.imageview; public class mainactivity extends activity implements onclicklistener{ public final static string share_bitmap_command = "share-image"; public final static string share_text_data_command = "share-text-data"; private handler handler; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); setuponclicklistener(); } private void setuponclicklistener() { button bitmapbtn = (button)this.findviewbyid(r.id.bitmapsharebtn); bitmapbtn.settag(share_bitmap_command); bitmapbtn.setonclicklistener(this); button textdatabtn = (button)this.findviewbyid(r.id.mapsharebtn); textdatabtn.settag(share_text_data_command); textdatabtn.setonclicklistener(this); final imageview imageview = (imageview)this.findviewbyid(r.id.imageview1); handler = new handler() { public void handlemessage(message msg) { bitmap bitmap = (bitmap)msg.obj; if(bitmap != null) { /* // 为防止原始图片过大导致内存溢出,这里先缩小原图显示,然后释放原始bitmap占用的内存 bitmap smallbitmap = zoombitmap(bitmap, bitmap.getwidth()/ 5, bitmap.getheight() / 5); // 释放资源 bitmap.recycle(); // 显示图片 imageview.setimagebitmap(smallbitmap); imageview.invalidate(); */ imageview.setimagebitmap(bitmap); } } }; imageloadtask task = new imageloadtask(handler); task.execute("http://img.blog.csdn.net/20150607143208238"); } public static bitmap zoombitmap(bitmap bitmap, int width, int height) { int w = bitmap.getwidth(); int h = bitmap.getheight(); matrix matrix = new matrix(); float scalewidth = ((float) width / w); float scaleheight = ((float) height / h); matrix.postscale(scalewidth, scaleheight); // 不改变原来图像大小 bitmap newbmp = bitmap.createbitmap(bitmap, 0, 0, w, h, matrix, true); return newbmp; } @override public void onclick(view v) { object tag = v.gettag(); log.i("command", tag.tostring()); if(share_bitmap_command.equals(tag)) { intent intent = new intent(this.getapplicationcontext(), imageprocessactivity.class); imageview imageview = (imageview)this.findviewbyid(r.id.imageview1); bitmap bitmap = ((bitmapdrawable)imageview.getdrawable()).getbitmap(); intent.putextra("selectedimage", bitmap); intent.putextra("name", "lena"); intent.putextra("description", "超级大美女"); this.startactivity(intent); } else if(share_text_data_command.equals(tag)) { intent intent = new intent(this.getapplicationcontext(), imageprocessactivity.class); imageview imageview = (imageview)this.findviewbyid(r.id.imageview1); bitmap bitmap = ((bitmapdrawable)imageview.getdrawable()).getbitmap(); // save it first then pass uri imageinfobean dto = new imageinfobean(); string uri = createimagefrombitmap(bitmap); dto.setdescription("超级大美女"); dto.setname("lena"); dto.seturi(uri); intent.putextra("tiger", dto); this.startactivity(intent); } } public string createimagefrombitmap(bitmap bitmap) { string filename = "myimage"; try { bytearrayoutputstream bytes = new bytearrayoutputstream(); bitmap.compress(bitmap.compressformat.jpeg, 100, bytes); fileoutputstream fo = openfileoutput(filename, context.mode_private); fo.write(bytes.tobytearray()); fo.close(); } catch (exception e) { e.printstacktrace(); filename = null; } log.i("filename", filename); return filename; } }
对应另外一个activity中实现读取与组装bitmap对象显示的代码如下:
package com.example.sharedemo; import java.io.filenotfoundexception; import android.app.activity; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.os.bundle; import android.widget.imageview; import android.widget.textview; public class imageprocessactivity extends activity { @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.share_info); backfilldata(); } private void backfilldata() { object obj = this.getintent().getextras().get("tiger"); imageview imageview = (imageview)this.findviewbyid(r.id.imageview1); textview text1 = (textview)this.findviewbyid(r.id.textview1); textview text2 = (textview)this.findviewbyid(r.id.textview2); try { if(obj != null && obj instanceof imageinfobean) { imageinfobean dto = (imageinfobean)obj; bitmap bitmap = bitmapfactory.decodestream(this.openfileinput(dto.geturi())); imageview.setimagebitmap(bitmap); imageview.invalidate(); // refresh text1.settext("名称: " + dto.getname()); text2.settext("描述: " + dto.getdescription()); return; } } catch (filenotfoundexception e) { e.printstacktrace(); } bitmap bitmap = (bitmap) this.getintent().getparcelableextra("selectedimage"); string name = this.getintent().getextras().getstring("name"); string description = this.getintent().getextras().getstring("description"); if(bitmap != null) { imageview.setimagebitmap(bitmap); imageview.invalidate(); // refresh } if(name != null) { text1.settext("名称: " + name); } if(description != null) { text2.settext("描述: " + description); } } }
对应的java串行化对象类代码如下:
package com.example.sharedemo; import java.io.serializable; public class imageinfobean implements serializable { /** * */ private static final long serialversionuid = 1l; public string getname() { return name; } public void setname(string name) { this.name = name; } public string getdescription() { return description; } public void setdescription(string description) { this.description = description; } public string geturi() { return uri; } public void seturi(string uri) { this.uri = uri; } private string name; private string description; private string uri; }
最后声明:
别忘记在manifest文件添加网络访问的权限
<uses-permission android:name="android.permission.internet"/>
第一个按钮【传递图片】将会演示我遇到错误,第二按钮【传递文本数据】
将会演示正确的处理结果,显示如下:
以上就是本文的全部内容,希望对大家的学习有所帮助。
推荐阅读
-
Android传递Bitmap对象在两个Activity之间
-
Android中两个Activity之间数据传递及返回问题
-
Android Activity之间传递图片(Bitmap)的方法
-
Android Activity之间传递图片(Bitmap)的方法
-
Android 入门第十讲02-广播(广播概述,使用方法(系统广播,自定义广播,两个activity之间的交互和传值),EventBus使用方法,数据传递,线程切换,Android的系统广播大全)
-
Android实例:使用Intent在多个Activity之间传递数据
-
Android Intent传递类对象_安卓Activity之间数据传递