1

我正在关注 android 开发人员文档中的BitMapFun教程。因为我通常是 Android/Java 编程的新手。

我创建了一个自定义 ImageViewer(称为TouchImageView),它允许用户缩放、双击等......并将其应用于ImageDetailFragment类。

TouchImageView类中,我有一个布尔变量,可以检测用户是否放大,如果它是 zoomedIn,它也会标记图像是否位于边框侧。(因此 zoomedIn 位和屏幕边框很重要)

我想应用此逻辑来启用或禁用 ViewPager 以允许用户滚动到下一页/上一页(读取 Fragment)此 ViewPager 位于实现FragmentActivity的ImageDetailActivity

正如我现在的代码一样,如果我向左或向右移动(在放大状态下)而不是移动图像,它将转到下一个片段而不是向左或向右滚动。除非我首先向上或向下移动,否则我可以滚动图像。

所以我想,如果我在 Fragment 中有一个布尔值,我可以检查它以便我的 Activiy 启用/禁用 ViewPager,那么我可以“控制”滚动的工作方式。

这个逻辑正确吗?如果是这样,我如何从我的 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);
    }
}

如果您想查看完整代码,可以在此处下载。

为了防止滑动/甩动,我想使用在此stackoverflow 帖子中找到的以下信息

4

1 回答 1

0

我找到了一个部分解决方案,whiiii!

我实现了链接中提到的禁用 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 回答