由於讀取緩慢,所以滑動頁面的時候就會卡住,整個快哭了。
後來想到可以使用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