Estoy tratando de crear un grupo de visualización que admita el paneo y el acercamiento de sus contenidos. Todo lo que pude encontrar en línea fueron ideas e implementaciones para hacerlo en un ImageView, pero nunca en un contenedor. Quiero mostrar un mapa y, además, quiero mostrar varios marcadores que son ImageButtons, por lo que el usuario puede tocarlos para obtener más información. Esto se logra en iOS mediante UIScrollView, pero no pude encontrar una alternativa en Android.Creación de un contenedor con capacidad de ampliación/capacidad de ampliación
Decidí usar un FrameView, así que pude establecer un ImageView con la imagen como fondo, y agregar un RelativeLayout en el que puedo agregar los ImageButtons y colocarlos usando los márgenes.
Tomé prestada parte de la implementación de TouchImageView here, pero he tenido complicaciones. Empecé con el paneo, y lo logré parcialmente, hace que el contenedor se mueva, pero el paneo funciona espantosamente, se agita mucho. Aquí está mi código:
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
}
});
}
Todas las ideas son muy apreciados.
editar: la inestabilidad parece ser la causa porque cuando se mueve, deltaX y deltaY alternan entre números positivos y negativos, verificando LogCat ... todavía no estoy seguro de por qué. Esto es causado por la variable curr que da valores diferentes cada vez, pero en lugar de ser consistentes, parecen como si el dedo se moviera hacia adelante y hacia atrás en lugar de solo hacia delante. Por ejemplo, en lugar de curr.x es 0,1,2,3,4, etc., es 0,1,0,5,2,1,5, etc. No estoy seguro de por qué tampoco.
¿Alguna vez encontró una solución a esto? Estoy buscando exactamente lo mismo. Un mapa de zoom/panorámica con botones – 0xSina
Oye, lo siento, dejé la compañía hace un tiempo y no puedo proporcionar el código. Encontré alguna solución, pero no puedo recordar cómo lo hice. –