Android傳遞Bitmap對象在兩個Activity之間
通過內(nèi)部存儲方式實現(xiàn)了在兩個Activity之間傳遞Bitmap對象以及其它支持串行化的Java對象,關(guān)鍵點有如下:
1. HTTP客戶端下載圖片,通過ImageView對象顯示
2. 把ImageView上的Bitmap對象從當(dāng)前Activity傳遞到另外一個Activity中并顯示出來
3. 基于串行化傳遞Java對象數(shù)據(jù)
首先看我是怎么實現(xiàn)HTTP客戶端下載圖片,通過異步Task接口實現(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)實現(xiàn)切換View到對應(yīng)的Activity中去,同時實現(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); // 不改變原來圖像大小 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; } }
對應(yīng)另外一個Activity中實現(xiàn)讀取與組裝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); } } }
對應(yīng)的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文件添加網(wǎng)絡(luò)訪問的權(quán)限
<uses-permission android:name="android.permission.INTERNET"/>
第一個按鈕【傳遞圖片】將會演示我遇到錯誤,第二按鈕【傳遞文本數(shù)據(jù)】
將會演示正確的處理結(jié)果,顯示如下:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
使用Broadcast實現(xiàn)Android組件間的通信
這篇文章主要為大家詳細介紹了使用Broadcast實現(xiàn)Android組件間的通信,感興趣的小伙伴們可以參考一下2016-06-06Android Handler中的休眠喚醒實現(xiàn)詳解
這篇文章主要為大家介紹了Android Handler中的休眠喚醒實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01Android使用Shape實現(xiàn)ProgressBar樣式實例
本篇文章主要介紹了Android使用Shape實現(xiàn)ProgressBar樣式實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04Android studio中生成引用.aar和.jar的方法詳解
這篇文章主要是講解.aar的生成與引用,文中的內(nèi)容屬于完全基礎(chǔ)性概念,對剛學(xué)習(xí)使用Android studio的朋友們很有幫助,有需要的可以參考學(xué)習(xí),下面來一起看看吧。2016-09-09Android實現(xiàn)為Notification加上一個進度條的方法
這篇文章主要介紹了Android實現(xiàn)為Notification加上一個進度條的方法,結(jié)合實例形式分析了Android針對Notification組件的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10Android UI使用HorizontalListView實現(xiàn)水平滑動
這篇文章主要為大家詳細介紹了Android UI使用HorizontalListView實現(xiàn)水平滑動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-01-01