2016-06-01 15 views
1

Ich versuche, eine Bildansicht mit Zoom und Scroll zu erstellen. Überprüft viele Lösungen über das Internet und ich habe kein genaues Ergebnis erhalten. Meine aktuelle Bildansicht hat die Eigenschaft scroll.Need, um einen Zoom hinzuzufügen.Android benutzerdefinierte Bildansicht mit Zoom und Bildlauf

public class MapView extends ImageView { 

    private GestureDetectorCompat gestureDetector; 
    private OverScroller overScroller; 

    private final int screenW; 
    private final int screenH; 

    private int positionX = 0; 
    private int positionY = 0; 

    public MapView(Context context) { 
     super(context); 
     // We need screen dimensions to make sure we don't over scroll the image 
     DisplayMetrics dm = getResources().getDisplayMetrics(); 
     screenW = dm.widthPixels; 
     screenH = dm.heightPixels; 

     gestureDetector = new GestureDetectorCompat(context, gestureListener); 
     overScroller = new OverScroller(context); 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     gestureDetector.onTouchEvent(event); 
     return true; 
    } 

    @Override 
    public void computeScroll() { 
     super.computeScroll(); 
     // computeScrollOffset() returns true only when the scrolling isn't 
     // already finished 
     if (overScroller.computeScrollOffset()) { 
      positionX = overScroller.getCurrX(); 
      positionY = overScroller.getCurrY(); 
      scrollTo(positionX, positionY); 
     } else { 
      // when scrolling is over, we will want to "spring back" if the 
      // image is overscrolled 
      overScroller.springBack(positionX, positionY, 0, getMaxHorizontal(), 0, getMaxVertical()); 
     } 
    } 

    private int getMaxHorizontal() { 
     return (Math.abs(getDrawable().getBounds().width() - screenW)); 
    } 



    private int getMaxVertical() { 
     return (Math.abs(getDrawable().getBounds().height() - screenH)); 
    } 



    private SimpleOnGestureListener gestureListener = new SimpleOnGestureListener() { 

     @Override 
     public boolean onDown(MotionEvent e) { 
      overScroller.forceFinished(true); 
      ViewCompat.postInvalidateOnAnimation(MapView.this); 
      return true; 
     } 

     @Override 
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
           float velocityY) { 
      overScroller.forceFinished(true); 
      overScroller.fling(positionX, positionY, (int) -velocityX, (int) -velocityY, 0, getMaxHorizontal(), 0, 
        getMaxVertical()); 
      ViewCompat.postInvalidateOnAnimation(MapView.this); 
      return true; 
     } 

     @Override 
     public boolean onScroll(MotionEvent e1, MotionEvent e2, 
           float distanceX, float distanceY) { 
      overScroller.forceFinished(true); 
      // normalize scrolling distances to not overscroll the image 
      int dx = (int) distanceX; 
      int dy = (int) distanceY; 
      int newPositionX = positionX + dx; 
      int newPositionY = positionY + dy; 
      if (newPositionX < 0) { 
       dx -= newPositionX; 
      } else if (newPositionX > getMaxHorizontal()) { 
       dx -= (newPositionX - getMaxHorizontal()); 
      } 
      if (newPositionY < 0) { 
       dy -= newPositionY; 
      } else if (newPositionY > getMaxVertical()) { 
       dy -= (newPositionY - getMaxVertical()); 
      } 
      overScroller.startScroll(positionX, positionY, dx, dy, 0); 
      ViewCompat.postInvalidateOnAnimation(MapView.this); 
      return true; 
     } 
    }; 

} 

Kann ich irgendwelche Hinweise darauf bekommen?

+0

Okay, brauchen ... '0x3A28213A' , '0x6339392C' und' 0x7363682E'. [Von XKCD] (https://xkcd.com/138/). Entschuldigung, ich konnte nicht widerstehen. – callyalater

Antwort