android - View Pager + ImageView +Pinch Zoom + Rotation

标签 android imageview android-viewpager pinchzoom

我想在 Imageview 上实现 Pinch Zoom,在 View Pager 中类似于 Default Android Gallery。我在 GitHub 上找到了多个来源,但缩放和滑动仅适用于第一张图片。

我尝试过的:

1.) TouchImageView

2.) PhotoView

3.) Android Touch Gallery

以上所有链接都适用于单个 ImageView 。但是,当涉及到 View pager 中的图像时,它们会出现一些故障,并且仅适用于 View Pager 中的第一张图像。当我们在 View 寻呼机中滚动到第 3 个第 4 个图像时,如果图像被缩放,则拖动功能无法按预期工作。

如果有人知道这样做的好图书馆,请给我他们的链接。

最佳答案

编辑 2:示例代码已推送到 TouchImageView 的主分支。这是 link to the example activitylink to the ExtendedViewPager .


编辑:添加了将示例链接适配到 TouchImageView 的代码。注意:您将需要最新的代码,该代码当前位于 dev 分支中。将来,这将包含在 v1.2.0 中。如果 TouchImageView 覆盖 canScrollHorizo​​ntally,你知道你有最新的代码。

第 1 步:扩展 ViewPager 并覆盖 canScroll 以调用 canScrollHorizo​​ntallyFroyo。

public class ExtendedViewPager extends ViewPager {

public ExtendedViewPager(Context context) {
    super(context);
}

public ExtendedViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (v instanceof TouchImageView) {
        return ((TouchImageView) v).canScrollHorizontallyFroyo(-dx);
    } else {
        return super.canScroll(v, checkV, dx, x, y);
    }
}

}

第二步:修改TouchImageView,添加canScrollHorizo​​ntallyFroyo:

public boolean canScrollHorizontallyFroyo(int direction) {
    return canScrollHorizontally(direction);
}

第 3 步:您的 Activity

public class TouchImageViewActivity extends Activity {

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ExtendedViewPager mViewPager = (ExtendedViewPager) findViewById(R.id.view_pager);
        setContentView(mViewPager);
        mViewPager.setAdapter(new TouchImageAdapter());
    }

    static class TouchImageAdapter extends PagerAdapter {

            private static int[] images = { R.drawable.img1, R.drawable.img2, R.drawable.img3 };

            @Override
            public int getCount() {
                    return images.length;
            }

            @Override
            public View instantiateItem(ViewGroup container, int position) {
                    TouchImageView img = new TouchImageView(container.getContext());
                    img.setImageResource(images[position]);
                    container.addView(img, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
                    return img;
            }

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                    container.removeView((View) object);
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                    return view == object;
            }

    }
}

第四步: main.xml

<com.example.touch.ExtendedViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/view_pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

TouchImageView 实际上是我的项目。我目前有a fixdev branch用于与 ViewPagers 集成,它将在即将发布的版本中推送到 master。不幸的是,此修复仅适用于 API 14 及更高版本,因为蜂窝和更早版本不调用 canScrollHorizo​​ntally。如果您需要支持较旧的 API,则需要在 ViewPager 中实现解决方法。 Here is an example.

关于android - View Pager + ImageView +Pinch Zoom + Rotation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20943831/

相关文章:

android - ImageViews 中加载 Picasso 的图片在 GridLayout 中溢出?

android - 如何在滑动页面时播放短音?

android - 使用 FragmentPagerAdapter 的 Circular ViewPager

android - 带有 setcontentview 的警报对话框

java - 使用 onActivityResult 调用函数

java - 通过单击 ImageView 获取图像上的 x 和 y 点对应位置?

android - ListView 减慢了 ViewPager 的滑动速度

android - 如何列出我的联系人列表并在 applozic 中发送消息

android - 这段使用 parse.com 数据库存储数据的 Android 代码有什么问题

android - 将 ImageView 设置为可绘制对象 (Android)