2

我已经使用 ImageViewTouch 实现了一个画廊:https ://github.com/sephiroth74/ImageViewZoom 。这可以使用 DoupleTap 和其他好东西进行缩放,效果很好。

这些图像被添加到 PagerAdapter 以启用图像之间的滑动。

但是,当图像放大时,我目前在 x 轴上滚动时遇到问题。如果用户缩放了图像,我想禁用 PageAdapters 触摸侦听器。

但是,如果没有缩放或者图像被放大并且位于图像的远端,我想再次打开它。

扩展了 FragmentActivity 的 GalleryActivity

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gallery_layout);
    
    GalleryAdapter galleryAdapter = new GalleryAdapter(GalleryActivity.this, images);

    // create view pager using the fragment adapter
    final ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    viewPager.setAdapter(galleryAdapter);
    viewPager.setOnPageChangeListener(new PageChangeListener());
}

我的适配器

public class GalleryAdapter extends PagerAdapter {

Matrix imageMatrix;
private Activity activity;
private ArrayList<Bitmap> images;
private LayoutInflater inflater;

// constructor
public GalleryAdapter(Activity activity, ArrayList<Bitmap> images) {
    this.activity = activity;
    this.images = images;
}

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

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

@Override
public Object instantiateItem(ViewGroup container, int position) {
    final ImageViewTouch imgDisplay;
    final Bitmap image;

    inflater = (LayoutInflater) activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    final View viewLayout = inflater.inflate(R.layout.gallery_image,
            container, false);

    imgDisplay = (ImageViewTouch) viewLayout.findViewById(R.id.image);
    imgDisplay.setDisplayType(DisplayType.FIT_IF_BIGGER);
    imgDisplay.setVisibility(View.GONE);
    image = images.get(position);

    imgDisplay.setDoubleTapEnabled(true);

    if (null == GalleryAdapter.this.imageMatrix) {
        GalleryAdapter.this.imageMatrix = new Matrix();
    } else {
        // get the current image matrix, if we want restore the
        // previous matrix once the bitmap is changed
        imageMatrix = imgDisplay.getDisplayMatrix();
    }

    imgDisplay.setImageBitmap(image, GalleryAdapter.this.imageMatrix
            .isIdentity() ? null : GalleryAdapter.this.imageMatrix,
            ImageViewTouchBase.ZOOM_INVALID,
            ImageViewTouchBase.ZOOM_INVALID);
    imgDisplay.setVisibility(View.VISIBLE);

    viewLayout.setTag(imgDisplay);

    ((ViewPager) container).addView(viewLayout);

    return viewLayout;
}

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

这是有人实现的吗?

4

2 回答 2

8

您应该使用自己的 ImageView 子类扩展 ImageViewZoom。然后尝试这样的事情:

this.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (getScale() > 1f) {
getParent().requestDisallowInterceptTouchEvent(true);
} else {
getParent().requestDisallowInterceptTouchEvent(false);
}
return false;
}
});

每当图像缩放/缩放超过 1 倍时,这基本上应该禁止分页。因此,用户必须缩小才能翻页。

见这里https://github.com/sephiroth74/ImageViewZoom/issues/38

于 2013-10-25T13:29:10.570 回答
1

我已经扩展了图像视图触摸并在下面发布了我的代码。这段代码更类似于 Android 图库:双击总是缩小,除非你已经缩小了;如果放大,除非您位于图像边缘,否则将禁用滚动到下一张图像。希望有人觉得这很有用。(我扩展了现有的类并进行了修改,直到它起作用,它可能不是最干净的代码:))

public class ExtendedImageViewTouch extends ImageViewTouch {

static final float SCROLL_DELTA_THRESHOLD = 1.0f;

public ExtendedImageViewTouch(Context context, AttributeSet attrs,
        int defStyle) {
    super(context, attrs, defStyle);
    init();
}

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

public ExtendedImageViewTouch(Context context) {
    super(context);
    init();
}

private void init() {
    OnTouchListener listener = new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (getScale() > 1f) {
                getParent().requestDisallowInterceptTouchEvent(true);
            } else {
                getParent().requestDisallowInterceptTouchEvent(false);
            }
            return false;
        }
    };
    setOnTouchListener(listener);
    setDisplayType(DisplayType.FIT_TO_SCREEN);
}

@Override
protected float onDoubleTapPost(float scale, float maxZoom) {
    if (scale!=1f) {
        mDoubleTapDirection = 1;
        return 1f;
    }
    if (mDoubleTapDirection == 1) {
        mDoubleTapDirection = -1;
        if ( ( scale + ( mScaleFactor * 2 ) ) <= maxZoom ) {
            return scale + mScaleFactor;
        } else {
                mDoubleTapDirection = -1;
                return maxZoom;
        }
    } else {
        mDoubleTapDirection = 1;
        return 1f;
    }
}

@Override
public boolean canScroll( int direction ) {
        RectF bitmapRect = getBitmapRect();
        updateRect( bitmapRect, mScrollRect );
        Rect imageViewRect = new Rect();
        getGlobalVisibleRect( imageViewRect );

        if( null == bitmapRect ) {
                return false;
        }

        if ( Math.abs( bitmapRect.right - imageViewRect.right ) < SCROLL_DELTA_THRESHOLD ) {
                if ( direction < 0 ) {
                        return false;
                }
        }

        if (Math.abs( bitmapRect.left - mScrollRect.left ) < SCROLL_DELTA_THRESHOLD) {
            if ( direction > 0 ) {
                return false;
            }
        }
        return true;
}

@Override
public boolean onScroll( MotionEvent e1, MotionEvent e2, float distanceX, float distanceY ) {
    if ( getScale() == 1f ) return false;
    if (distanceX!=0 && !canScroll((int) -distanceX)) {
        getParent().requestDisallowInterceptTouchEvent(false);
        return false;
    } else {
        getParent().requestDisallowInterceptTouchEvent(true);
        mUserScaled = true;
        scrollBy( -distanceX, -distanceY );
        invalidate();
        return true;
   }
}
}
于 2013-11-07T18:31:41.607 回答