Sto cercando di fare un ViewGroup che supporta la panoramica e lo zoom dei suoi contenuti. Tutto quello che potevo trovare online erano idee e implementazioni per farlo in un ImageView, ma mai un contenitore. Voglio visualizzare una mappa e in cima a essa voglio visualizzare più marker che sono ImageButtons, quindi l'utente può toccarli per ottenere maggiori informazioni. Questo è realizzato su iOS tramite UIScrollView, ma non sono riuscito a trovare un'alternativa su Android.Costruire un/recipiente-teglia in grado di zoom-in grado
Ho deciso di utilizzare un FrameView, così ho potuto impostare un ImageView con l'immagine come sfondo, e sopra di esso aggiungere un RelativeLayout, sul quale potrei aggiungere i ImageButtons e posizionarli usando i margini.
Ho preso in prestito parte dell'implementazione di TouchImageView here, ma mi sono imbattuto in complicazioni. Ho iniziato con il panning, e in parte ho avuto successo, fa girare il contenitore, ma il panning funziona in modo orribile, fa tremare molto. Ecco il mio codice:
public class ScrollingViewGroup extends FrameLayout {
private int x = 0;
private int y = 0;
// We can be in one of these 3 states
static final int NONE = 0;
static final int DRAG = 1;
static final int ZOOM = 2;
int mode = NONE;
// Remember some things for zooming
PointF last = new PointF();
PointF start = new PointF();
public ScrollingViewGroup(Context context) {
super(context);
sharedConstructing(context);
}
public ScrollingViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
sharedConstructing(context);
}
private void sharedConstructing(Context context) {
super.setClickable(true);
this.context = context;
mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mScaleDetector.onTouchEvent(event);
PointF curr = new PointF(event.getX(), event.getY());
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
last.set(event.getX(), event.getY());
start.set(last);
mode = DRAG;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
float deltaX = curr.x - last.x;
float deltaY = curr.y - last.y;
Log.d("ScrollingViewGroup", Float.toString(deltaX));
Log.d("ScrollingViewGroup", Float.toString(deltaY));
float scaleWidth = Math.round(origWidth * saveScale);
float scaleHeight = Math.round(origHeight * saveScale);
x += deltaX;
y += deltaY;
last.set(curr.x, curr.y);
}
break;
case MotionEvent.ACTION_UP:
mode = NONE;
int xDiff = (int) Math.abs(curr.x - start.x);
int yDiff = (int) Math.abs(curr.y - start.y);
if (xDiff < CLICK && yDiff < CLICK)
performClick();
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
}
// setImageMatrix(matrix);
setTranslationX(x);
setTranslationY(y);
invalidate();
return true; // indicate event was handled
}
});
}
Tutte le idee sono molto apprezzate.
edit: jitter sembra essere causa, perché quando si spostano, deltaX e DeltaY alternano tra numeri positivi e negativi, la verifica LogCat ... ancora non so perché. Questo è causato dalla variabile curr che dà valori diversi ogni volta, ma invece di essere coerenti, sembrano come se il dito si muovesse avanti e indietro invece che solo in avanti. Ad esempio, invece che curr.x è 0,1,2,3,4, ecc., È 0,1,0,5,2,1,5, ecc. Non so perché.
Avete mai trovato una soluzione a questo? Sto cercando la stessa identica cosa. Una mappa zoom/pan in grado con i pulsanti – 0xSina
Ehi, scusa, ho lasciato la compagnia qualche tempo fa e non sono in grado di fornire il codice, ho trovato qualche soluzione, ma non riesco a ricordare come l'ho fatto. –