1

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);
    }
}

完全なコードを見たい場合は、ここからダウンロードできます。

スワイプ/フリングを防ぐために、このスタックオーバーフローの投稿にある次の情報を使用することを考えました

4

1 に答える 1

0

部分的な解決策を見つけました。

リンクに記載されているように、 Disable ViewPagerを実装しました。次に、onClick メソッドに以下を追加しました。

public void onClick(View v) {

    TouchImageViewLocal ti = (TouchImageViewLocal) findViewById(R.id.imageView);
    if(ti.isZoomed()){
        Log.d(TAG, "-----------------------------------------is zoomed in? " + ti.isZoomed());
        mPager.setPagingEnabled(false);
    }else
    {
        Log.d(TAG, "-----------------------------------------is zoomed in? " + ti.isZoomed());
        mPager.setPagingEnabled(true);
    }

これにより、スワイプを停止/開始するためにズームインしている場合に画面が許可されますが、それでもエッジ検出を見つける必要があります。:-)

于 2013-03-11T10:15:54.163 に答える