Android開発者ドキュメントのBitMapFunチュートリアルに従っています。私は一般的にAndroid/Javaプログラミングの初心者です。
ユーザーがズーム、ダブルタップなどを行えるようにするカスタム ImageViewer ( TouchImageViewと呼ばれる) を作成し、それをImageDetailFragmentクラスに適用しました。
TouchImageViewクラスには、ユーザーがズームインしたかどうかを検出できるブール変数があり、zoomedIn の場合は、画像が境界側にあるかどうかもフラグします。(したがって、zoomedInビットと画面の境界が重要です)
このロジックを適用して ViewPager を有効または無効にして、ユーザーが次/前のページにスクロールできるようにしたい (フラグメントを読む) この ViewPager は、 FragmentActivityを実装するImageDetailActivityにあります。
私のコードは現在、画像を移動する代わりに左または右 (ズームイン状態) に移動すると、左または右にスクロールする代わりに次の Fragment に移動します。最初に上下に移動しない限り、画像をスクロールできます。
したがって、Activiy が ViewPager を有効/無効にするためにチェックできるブール値が Fragment にあれば、スクロールの動作を「制御」できると思いました。
このロジックは正しいですか?もしそうなら、DetailActivity クラスの Fragment からブール値を取得するにはどうすればよいですか。インターフェイスで試してみましたが、常に誤った応答が返されます (onCreate 中のフラグメントの初期化のため?) ため、表示されたフラグメントで実行時にそのブール値を取得できるものが必要です。ただし、以下のコードからは機能しません。
public void onCreate(Bundle savedInstanceState) {
.... Do stuff like fetching images and caching etc ....
mPager = (ScrollViewPager) findViewById(R.id.pager);
mAdapter = new ImagePagerAdapter(getSupportFragmentManager(), imgs.getImagesLocal().length);
mPager.setAdapter(mAdapter);
mPager.setPageMargin((int) getResources().getDimension(R.dimen.image_detail_pager_margin));
mPager.setOffscreenPageLimit(2);
mPager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//v.mAdapter.mCurItem
ScrollViewPager scroll = (ScrollViewPager) v;
//Log.d(TAG, "-----------------Current pos is "+ scroll.getCurrentItem());
ImageDetailFragment frag = (ImageDetailFragment) mAdapter.getItem(scroll.getCurrentItem());
if(frag.isPageChangeable())
{
Log.d(TAG, "-----------------Page is zoomed");
}else
{
Log.d(TAG, "----------------------Page is not Zoomed");
}
return false;
}
});
}
私が得たフラグメントの初期化は.
/**
* The main adapter that backs the ViewPager. A subclass of FragmentStatePagerAdapter as there could be a large number of items in the ViewPager and we don't want to retain
* them all in memory at once but create/destroy them on the fly.
*/
private 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(imgs.getImagesLocal()[position], position, imgs.getImagesLocal().length);
}
}
完全なコードを見たい場合は、ここからダウンロードできます。
スワイプ/フリングを防ぐために、このスタックオーバーフローの投稿にある次の情報を使用することを考えました