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?
Okay, brauchen ... '0x3A28213A' , '0x6339392C' und' 0x7363682E'. [Von XKCD] (https://xkcd.com/138/). Entschuldigung, ich konnte nicht widerstehen. – callyalater