快速連結

2013年2月18日

ViewPager + PagerAdapter + AsyncTask 讓讀圖更順利

最近開始進行下載圖片,然後放入ViewPager去翻頁顯示,但是因為圖片是存在SD卡內,卻不知道為什麼會讀取很慢(已經壓縮到100k左右了)。
由於讀取緩慢,所以滑動頁面的時候就會卡住,整個快哭了。
後來想到可以使用AsyncTask分流讀取,果然順暢許多!


前置作業
1.確認圖片都下載完畢哦!(這部份就不多贅述了)
2.圖片名稱我都是用page1.png、page2.png......
3.ViewPager必須要放在Activity才會順暢
4.在layout先拉好ViewPager
5.我全部語法都放在同個java檔案內,只是分開寫而已

第一階段
主要是做好基本布局,程式挺少的。

public class BookActivity extends Activity {
 private static final String TAG = "BookActivity";
 private int TotalPage = 10;
 private ViewPager bookview;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_book);
  initViewer();
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_folding, menu);
  return true;
 }

 private void initViewer(){
  //找到剛在layout上設定的ViewPager物件。
  bookview = (ViewPager) findViewById(R.id.vp);
  //設定PagerAdapter,這個class之後會在第三階段的時候撰寫
  MyViewPagerAdapter pa = new MyViewPagerAdapter(this);
  bookview.setAdapter(pa);
 }

第二階段:建立AsyncTask的Class

private class ImageLoader extends AsyncTask{
 private int index;
 @Override
 protected Bitmap doInBackground(String... p) {
  // TODO 自動產生的方法 Stub
  index = Integer.parseInt(p[0]);
  try{
   //記得要從sd card的路徑讀取檔案哦!
   String SDPath = Environment.getExternalStorageDirectory()+"/";
   File bfile = new File(SDPath,"page" + index + ".png");
   Bitmap bmp = Common.getBitmap(bfile);
            
   return bmp;
  }catch (Exception e){
   Log.e(TAG,"Error!");
  }
  return null;
 }
  
 @Override
  protected void onPostExecute(Bitmap bmp){
  Log.v(TAG,"Show Image -- " + bmp);
   if (bmp != null){
   //確定點陣圖ok後,呼叫這個函式把圖加進去!不過這函式還沒寫到在第四階段就來寫
    setBookPage(index,bmp);
  }
  }
  
}

第三階段:建立PagerAdapter

private class MyViewPagerAdapter extends PagerAdapter {
        private Context ctx;
        
        public MyViewPagerAdapter(Context ctx) {
            this.ctx = ctx;
        }

 @Override
 public int getCount() {
  // TODO 自動產生的方法 Stub
  return TotalPage;
 }
 
 public Object instantiateItem(View collection, int position) {
         ImageView view = new ImageView(ctx,null);
         int id = position+1;
         view.setId(id);
         view.setTag(id);
         ((ViewPager)collection).addView(view);
         
         String pos = String.valueOf(id);
         
         final ImageLoader loader = new ImageLoader();
         loader.execute(pos);
         
            
  return view;
 }
  
 @Override
        public void destroyItem(View collection, int position, Object view) {
         //提出bitmap把他回收
         ImageView iv = (ImageView) view;
         Drawable drawable = iv.getDrawable();
         if (drawable instanceof BitmapDrawable) {
             BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
             Bitmap bitmap = bitmapDrawable.getBitmap();
             bitmap.recycle();
             System.gc(); //提醒系統及時回收
         }
             ((ViewPager) collection).removeView((View) view);
             
        }

 @Override
 public boolean isViewFromObject(View view, Object obj) {
  // TODO 自動產生的方法 Stub
  return view == (View) obj;
 }
}

第四階段
這次就是要回到 class BookActivity 底下寫setBookPage(int, bitmap)函式了!只有短短幾行很簡單的!

public void setFoldingPage(int index, Bitmap bmp){
 ImageView view = (ImageView) bookview.findViewById(index);
 
 view.setImageBitmap(bmp);
 view.setBackgroundColor(Color.WHITE);

}

沒有留言:

張貼留言

歡迎大家留言提問,我會答的都會盡力回答!
如果太久沒出現回應就是我又忘記回來看留言了TAT