¿Alguien sabe cómo lograr el escalado general de la interfaz de Android?
Escriba el siguiente código en MulitPointTouchListener.java y luego ejecute OnTouchListener en su imagen correspondiente.
Por ejemplo: imageView.setOnTouchListener(new MulitPointTouchListener ());
En xml, cambie el formato de escala de ImageView a Matrix
Por ejemplo: android: scaleType ="matrix"
Puede lograr el escalado general de la interfaz de Android
El siguiente es el código MulitPointTouchListener.java: public class MulitPointTouchListener implements OnTouchListener { private static final String TAG = "Touch"; // Estas matrices se utilizarán para mover y ampliar la imagen Matrix Matrix = new Matrix(); Matrix saveMatrix = new Matrix() // Podemos estar en uno de estos 3 estados static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = NONE; // Recuerda algunas cosas para hacer zoom PointF start = new PointF(); new PointF(); boolean onTouch(View v, evento MotionEvent) { ImageView view = (ImageView) v; // Log.e("view_width", // view.getImageMatrix()..toString() "*" v.getWidth()); // Volcar evento táctil para registrar dumpEvent(event); // Manejar eventos táctiles aquí... switch (event.getAction() amp; MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: Matrix.set(view.getImageMatrix()) ; saveMatrix.set(matriz); start.set(event.getX(), event.getY()); //Log.d(TAG, "modo=DRAG"); TAG, "modo=NONE "); break; case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); //Log.d(TAG, "oldDist=" oldDist); if (oldDist gt; 10f) { saveMatrix.set( matriz); midPoint(mid, evento); modo = ZOOM; //Log.d(TAG, "modo=
ZOOM"); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: modo = NONE; //Log.e("view.getWidth", view.getWidth() ""); //Log.e("view .getHeight", view.getHeight() ""); break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { // ... Matrix.set(savedMatrix); Matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); } else if (modo == ZOOM) { float newDist = spacing(event); //Log.d(TAG, "newDist=" newDist); newDist gt; 10f) { Matrix.set(savedMatrix); escala flotante = newDist / oldDist; Matrix.postScale(escala, mid.x, mid.y); true; // indica que el evento fue manejado } private void dumpEvent(evento MotionEvent) { String nombres[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP" , "¿7?", "¿8?", "¿9?" }; StringBuilder = new StringBuilder(); int action = event.getAction(); int actionCode = action amp; ACTION_").append(nombres[actionCode]); if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) { sb.append("(pid ").append( acción gt; gt; MotionEvent.ACTION_POINTER_ID_SHIFT ); sb.append(")"); } sb.append("["); para (int i = 0; i lt; event.getPointerCount(); i ) { sb.append("#").append (i); sb.append("(pid ").append(event.getPointerId(i)); sb.append()=").append((int) event.getX(i)); (",").a
ppend((int) event.getY(i)); if (i 1 lt; event.getPointerCount()) sb.append(";"); } sb.append("]"); TAG, sb.toString()); } espaciado flotante privado (evento MotionEvent) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); ); return FloatMath.sqrt(x * x y * y); } private void midPoint(punto PointF, evento MotionEvent) { float x = event.getX(0) event.getX(1); ) evento.getY(1); punto.set(x/2, y/2);