今回は Displaying Bitmaps in Your UI
です。
前回までのビットマップのメモリ管理を基にして
画面遷移のシステムを見ていきます。
まず、スワイプビューを実装してみます。→ Swipe Views
ニュース項目などを切り替えるときに
今のものと次のものをスワイプする画面効果を実装します。
ViewPager と PagerAdapter を使います。
public class ImageDetailActivity extends FragmentActivity {
public static final String EXTRA_IMAGE = "extra_image";
private ImagePagerAdapter mAdapter;
private ViewPager mPager;
ViewPagerアダプタをバックアップするためにの静的データセット
public final static Integer[] imageResIds = new Integer[] {
R.drawable.sample_image_1,R.drawable.sample_image_2,
R.drawable.sample_image_3,R.drawable.sample_image_4,
R.drawable.sample_image_5,R.drawable.sample_image_6,
R.drawable.sample_image_7,R.drawable.sample_image_8,
R.drawable.sample_image_9};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.image_detail_pager);
mAdapter = new ImagePagerAdapter(getSupportFragmentManager(),
imageResIds.length);
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
}
public static class ImagePagerAdapter extends FragmentStatePagerAdapter{
private final int mSize;
public ImagePagerAdapter(FragmentManager fm, int size) {
super(fm);
mSize = size;
}
@Override
public int getCount() {
return mSize;
}
@Override
public Fragment getItem(int position) {
return ImageDetailFragment.newInstance(position);
}
}
}
public class ImageDetailFragment extends Fragment {
private static final String IMAGE_DATA_EXTRA = "resId";
private int mImageNum;
private ImageView mImageView;
static ImageDetailFragment newInstance(int imageNum) {
final ImageDetailFragment f = new ImageDetailFragment();
final Bundle args = new Bundle();
args.putInt(IMAGE_DATA_EXTRA, imageNum);
f.setArguments(args);
return f;
}
public ImageDetailFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mImageNum = getArguments() != null ?
getArguments().getInt(IMAGE_DATA_EXTRA) : -1;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View v = inflater.inflate(R.layout.image_detail_fragment,
container, false);
mImageView = (ImageView) v.findViewById(R.id.imageView);
return v;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (ImageDetailActivity.class.isInstance(getActivity())) {
final int resId = ImageDetailActivity.
imageResIds[mImageNum];
((ImageDetailActivity)getActivity()).
loadBitmap(resId,mImageView);
}
}
}
public class ImageDetailActivity extends FragmentActivity {
...
private LruCache<String, Bitmap> mMemoryCache;
@Override
public void onCreate(Bundle savedInstanceState) {
LRUCacheを初期化する
...
}
public void loadBitmap(int resId, ImageView imageView) {
final String imageKey = String.valueOf(resId);
final Bitmap bitmap = mMemoryCache.get(imageKey);
if (bitmap != null) {
mImageView.setImageBitmap(bitmap);
} else {
バックグラウンドスレッドでビットマップをロードする
mImageView.setImageResource(R.drawable.image_placeholder);
BitmapWorkerTask task = new BitmapWorkerTask(mImageView);
task.execute(resId);
}
}
...
}
これまでのおさらい的な感じがします。
今回は以上で、次回はグリッドビューをします。
