通過內(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é)果,顯示如下:

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
|
新聞熱點(diǎn)
疑難解答
圖片精選