Android: individuare la posizione assoluta clic sul ImageView dopo lo zoom (utilizzando il pizzico per lo zoom utilizzando il layout di matrix)

Sto usando il codice trovato in Hello Android, 3rd Edition per Pinch to Zoom. Dopo aver usato questo il pizzico per lo zoom funziona bene, ma dopo lo zoom ho voglia di get la posizione assoluta clic sulla visualizzazione image.

Ecco il mio codice

  • Android: impedisce il pop-up del field di text quando si inserisce il text in un SearchView
  • Aiuta a passare l'attività ArrayList e parcelable
  • Come avviare e interrompere il servizio android da una shell adb?
  • La strana risposta SOAP, è JSON? Come analizzarlo?
  • Come faccio a determinare la quantità di text che si inserisce in un TextView in Android?
  • per get il numero di telefono in modo programmato in android
  • package org.example.touch; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Matrix; import android.graphics.PointF; import android.os.Bundle; import android.util.FloatMath; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.GridView; import android.widget.ImageView; public class Touch extends Activity implements OnTouchListener { private static final String TAG = "Touch"; private static final float MIN_ZOOM = 1.0f; private static final float MAX_ZOOM = 5.0f; // These matrixs will be used to move and zoom image Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); // 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 start = new PointF(); PointF mid = new PointF(); float oldDist = 1f; ImageView image2; image2 = (ImageView)this.findViewById(R.id.imageView2); image2.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView) image2; // Handle touch events here... switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: savedMatrix.set(matrix); start.set(event.getX(), event.getY()); mode = DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { matrix.set(savedMatrix); matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); } else if (mode == ZOOM) { float newDist = spacing(event); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); } } break; } view.setImageMatrix(matrix); } /** Determine the space between the first two fingers */ private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } /** Calculate the mid point of the first two fingers */ private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); } 

  • Retrofit SocketTimeOutException nell'invio di dati multiparty o JSON in android
  • Gridview con due colonne e immagini ridimensionate automaticamente
  • Avviso di adattatore di binding personalizzato di DataBinding di Android
  • Come posso usare l'opzione "multi-dex"?
  • Menu contestuale su Android WebView
  • Come faccio ad get un gestore di proiezione di mezzi senza disturbare l'attuale process di progettazione, tranne che per chiedere permissi?
  • 2 Solutions collect form web for “Android: individuare la posizione assoluta clic sul ImageView dopo lo zoom (utilizzando il pizzico per lo zoom utilizzando il layout di matrix)”

    È ansible utilizzare la matrix attualmente applicata all'image per mappare punti a / da i punti di default originali.

     //points from a touch/click event on the zoomed/translated imageview float X; float Y; float initialPoints = new float[]{X, Y}; //invert the matrix and map points back if(transformMatrix.invert(inverseTransformMatrix)) inverseTransformMatrix.mapPoints(initialFocalPoints); 

    initialPoints ora contiene i punti originali, cioè where il punto di click sarebbe se non si applicava alcuna matrix all'image

    EDIT : dovresti aver aggiunto questo da qualche parte in modo da sapere che cosa sono.

     Matrix inverseTransformMatrix = new Matrix(); Matrix transformMatrix = new Matrix(); 

    Applicare la seguente logica

     float[] values = new float[9]; matrix.getValues(values); 

    calcolare scalefactor prima di pinchzoom;

     scaleX=values[0]; scaleY=vales[4]; 

    Ora calcolare le coordinate di contatto relative secondo iamge dopo lo zoom pizzico

     float relativeX = ((event.getX() - values[2])*sacleX) / values[0]; float relativeY = ((event.getY() - values[5])*scaleY) / values[4]; 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.