2013-10-24 42 views
2

:d禁用刷卡,如果ImageViewTouch在縮放模式

我實現了使用ImageViewTouch畫廊:https://github.com/sephiroth74/ImageViewZoom 這使得使用DoupleTap和其他不錯的東西,它的偉大工程放大。

這些圖像被添加到PagerAdapter中,以啓用圖像之間的滑動操作。

但是,我目前在放大圖像時遇到了x軸滾動問題。 如果用戶放大圖像,我想禁用PageAdapters觸摸監聽器。

但是,如果沒有縮放,或者圖像放大並且位於圖像的最遠端,我想再打開它。延伸FragmentActivity

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

GalleryActivity這是不是有人已經實現?

最好的問候, Henric

回答

7

你應該用自己的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

+0

很好用!這種解決所有問題的簡單解決方案,爲什麼我之前沒有看到這一點:P – Henric

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