Android傳遞Bitmap對(duì)象在兩個(gè)Activity之間
通過內(nèi)部存儲(chǔ)方式實(shí)現(xiàn)了在兩個(gè)Activity之間傳遞Bitmap對(duì)象以及其它支持串行化的Java對(duì)象,關(guān)鍵點(diǎn)有如下:
1. HTTP客戶端下載圖片,通過ImageView對(duì)象顯示
2. 把ImageView上的Bitmap對(duì)象從當(dāng)前Activity傳遞到另外一個(gè)Activity中并顯示出來
3. 基于串行化傳遞Java對(duì)象數(shù)據(jù)
首先看我是怎么實(shí)現(xiàn)HTTP客戶端下載圖片,通過異步Task接口實(shí)現(xiàn)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; } }
在當(dāng)前的Activity中通過按鈕上的事件響應(yīng)實(shí)現(xiàn)切換View到對(duì)應(yīng)的Activity中去,同時(shí)實(shí)現(xiàn)Java串行化數(shù)據(jù)傳遞。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) { /* // 為防止原始圖片過大導(dǎo)致內(nèi)存溢出,這里先縮小原圖顯示,然后釋放原始Bitmap占用的內(nèi)存 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); // 不改變?cè)瓉韴D像大小 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", "超級(jí)大美女"); 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("超級(jí)大美女"); 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; } }
對(duì)應(yīng)另外一個(gè)Activity中實(shí)現(xiàn)讀取與組裝Bitmap對(duì)象顯示的代碼如下:
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); } } }
對(duì)應(yīng)的Java串行化對(duì)象類代碼如下:
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文件添加網(wǎng)絡(luò)訪問的權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
第一個(gè)按鈕【傳遞圖片】將會(huì)演示我遇到錯(cuò)誤,第二按鈕【傳遞文本數(shù)據(jù)】
將會(huì)演示正確的處理結(jié)果,顯示如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- Android webview與js交換JSON對(duì)象數(shù)據(jù)示例
- Android 不同Activity間數(shù)據(jù)的傳遞 Bundle對(duì)象的應(yīng)用
- android中intent傳遞list或者對(duì)象的方法
- Android 解析JSON對(duì)象及實(shí)例說明
- android將Bitmap對(duì)象保存到SD卡中的方法
- 深入Android 五大布局對(duì)象的應(yīng)用
- Android解析json數(shù)組對(duì)象的方法及Apply和數(shù)組的三個(gè)技巧
- 詳解Android中Intent對(duì)象與Intent Filter過濾匹配過程
- Android中怎樣避免創(chuàng)建不必要的對(duì)象
相關(guān)文章
使用Broadcast實(shí)現(xiàn)Android組件間的通信
這篇文章主要為大家詳細(xì)介紹了使用Broadcast實(shí)現(xiàn)Android組件間的通信,感興趣的小伙伴們可以參考一下2016-06-06Android Handler中的休眠喚醒實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了Android Handler中的休眠喚醒實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android studio 自動(dòng)換行和取消自動(dòng)換行操作
這篇文章主要介紹了Android studio 自動(dòng)換行和取消自動(dòng)換行操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Android逆向之dex2oat的實(shí)現(xiàn)解析
虛擬機(jī)的發(fā)生展經(jīng)歷了從初期的dalvik,到中期的dalvik,以及后期的ART。但是市面上的APK文件早已已經(jīng)全球流行。為了能夠讓這些APK不加改動(dòng)的在所有虛擬機(jī)上面運(yùn)行,google采用了類似適配器模式。即在讓虛擬運(yùn)行之前多一道工序。就是dexopt2021-10-10Android使用Shape實(shí)現(xiàn)ProgressBar樣式實(shí)例
本篇文章主要介紹了Android使用Shape實(shí)現(xiàn)ProgressBar樣式實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-04-04Android studio中生成引用.aar和.jar的方法詳解
這篇文章主要是講解.aar的生成與引用,文中的內(nèi)容屬于完全基礎(chǔ)性概念,對(duì)剛學(xué)習(xí)使用Android studio的朋友們很有幫助,有需要的可以參考學(xué)習(xí),下面來一起看看吧。2016-09-09Android實(shí)現(xiàn)為Notification加上一個(gè)進(jìn)度條的方法
這篇文章主要介紹了Android實(shí)現(xiàn)為Notification加上一個(gè)進(jìn)度條的方法,結(jié)合實(shí)例形式分析了Android針對(duì)Notification組件的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10Android UI使用HorizontalListView實(shí)現(xiàn)水平滑動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android UI使用HorizontalListView實(shí)現(xiàn)水平滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01