2013-04-10 55 views
1

我想創建一個圖像查看器,可以從給定的URL加載圖像。下面的代碼實現用戶界面。如何使用ImageViews和PageAdapter輕掃縮放圖像

我的意圖是讓用戶縮放圖像並使用滑動事件移動到下一張圖像。但問題是,當我縮放然後滑動時,而不是顯示剩餘部分時,它會移至下一張圖像。

enter image description here

我試着用requestDisallowInterceptTouchEvent在TouchImageView的(https://github.com/MikeOrtiz/TouchImageView)onTouchListener。經過這剩餘部分可以顯示,但現在我不能進入下一個頁面。我想知道如何可以做到這一點的情況下只能去任何的TouchView或PageAdapter

public class PageActivity extends Activity { 
private int numPages = 33; 
private TouchImageView[] imageViews = new TouchImageView[numPages]; 

private String URL = "http://www.smbc-comics.com/comics/200905"; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ViewPager viewPager = new ViewPager(this); 

    for (int i = 0; i < numPages; i++) { 
     imageViews[i] = new TouchImageView(this); 
     imageViews[i].setBackgroundResource(R.drawable.banke); 
     imageViews[i].setMaxZoom(4f); 
    } 

    setContentView(viewPager); 
    ImagePagerAdapter adapter = new ImagePagerAdapter(); 
    viewPager.setAdapter(adapter); 
    viewPager.setOffscreenPageLimit(2); 
} 

@SuppressWarnings("unused") 
private class ImagePagerAdapter extends PagerAdapter { 
    @Override 
    public int getCount() { 
     return numPages; 
    } 

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

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Context context = PageActivity.this; 

     String pageURL = URL; 

     if (imageViews[position].getDrawable() == null) { 
      ImageFetcher imagefetcher = new ImageFetcher(); 
      imagefetcher.execute(
        pageURL + String.format("%02d", position+1) + ".gif", 
        String.valueOf(position)); 
     } 


     ((ViewPager) container).addView(imageViews[position], 0); 
     return imageViews[position]; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 

     ((ViewPager) container).removeView((TouchImageView) object); 
     imageViews[position].setImageDrawable(null); 

    } 

} 
public class ImageFetcher extends AsyncTask<String, Integer, Drawable> { 
    int fillthisPos; 

    public Drawable doInBackground(String... urls) { 
     try { 
      InputStream is = (InputStream) new URL(urls[0]).getContent(); 
      fillthisPos = Integer.parseInt(urls[1]); 
      Drawable d = Drawable.createFromStream(is, "src name"); 
      return d; 
     } catch (Exception e) { 
      return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(Drawable result) { 
     super.onPostExecute(result); 
     imageViews[fillthisPos].setImageDrawable(result); 
     result = null; 
    } 

} 

}

+1

如果你不是自己動手構建它,請查看這個庫:https://github.com/chrisbanes/PhotoView它提供了一個你正在尋找的實現,據我所知。 – FoamyGuy 2013-04-10 18:49:52

回答

2

可以在TouchImageView類中添加以下代碼:在

public boolean isZoomed() { 
    return (normalizedScale > minScale); 
} 

private void onSwipeEvent(MotionEvent event) { 
    boolean zoomed = this.isZoomed(); 

    if (!zoomed && (swipeLen > 0)) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      swipeStartPos = (int) event.getRawX(); 
     } 
     else if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      int distance = ((int) event.getRawX()) - swipeStartPos; 
      int swipeVector = SWIPE_RIGHT; 
      if (distance < 0) swipeVector = SWIPE_LEFT; 

      if (Math.abs(distance) > swipeLen) { 
       onSwipeHandler.onSwipe(swipeVector); 

       swipeStartPos = (int) event.getRawX(); 
       this.setScaleX(1f); 
      } 
      else { 
       int swipeStDist = swipeLen - Math.round(((swipeLen/100) * 50)); 
       if (Math.abs(distance) > swipeStDist) { 
        this.setScaleX(0.98f); 
       } 
      } 
     } 
     else if (event.getAction() == MotionEvent.ACTION_UP) { 
      swipeStartPos = (int) event.getRawX(); 
      this.setScaleX(1f); 
     } 
    } 
} 

public static int SWIPE_LEFT = 0; 
public static int SWIPE_RIGHT = 1; 
    public int swipeStartPos = 0; 
public onSwipeListener onSwipeHandler = new onSwipeListener() { 
    public void onSwipe(int vector) {} 
}; 
public static int swipeLen = 0; 

public void setOnSwipeListener(onSwipeListener c, int swipeLength) { 
    onSwipeHandler = c; 
    swipeLen = swipeLength; 
} 
public interface onSwipeListener { 
    public void onSwipe(int vector); 
} 

而且還TouchImageView下面的第636行添加onSwipeEvent(event)像這樣:

 ...... 
      setImageMatrix(matrix); 
      onSwipeEvent(event); 
      // 
      // indicate event was handled 
      // 
      return true; 
     ........... 

t他從你的代碼,你可以添加刷卡事件偵聽器,像這樣:

這onSwipeListener忽略onswipe其中圖像被放大+。它適合我。