Bug con Android 4.3 Metodo ImageView getImageMatrix ()

Recentemente ho aggiornato a Android 4.4 e qualcuno delle funzionalità della mia applicazione ha sorpreso smesso di funzionare.

Ho questo codice per inizializzare e poi eseguire la visualizzazione personalizzata. L'idea di base è che regola il livello di zoom in modo che l'intera vista si adatta sullo schermo.

  • Android: Come creare un dialogo senza un titolo?
  • Cassetto di navigazione non funzionante
  • Come submit la risposta del messaggio SMS all'indirizzo email?
  • Limitazione di trascinamento di ImageView in Android
  • Come rimuovere la barra dei pulsanti nella schermata inferiore
  • Leggendo il file di database dal dispositivo android
  • private void initAtZoomLevel(float zoomLevel){ .... Matrix transformMatrix = new Matrix(); transformMatrix.setScale(initialZoomLevel, initialZoomLevel); float yTransCenter = (screenHeight - mapHeight)/2.0f; setImageMatrix(transformMatrix); } protected void onDraw(Canvas canvas){ super.onDraw(canvas); float[] values = new float[9]; getImageMatrix().getValues(values); scaleFactor = values[0]; .... } 

    QUESTE OPERAZIONI SU ANDROID 4.1.2 e 4.2.2 DISPOSITIVI CHE SONO

    Ma su Android 4.4 / 4.3 getImageMatrix().getValues(values) smesso di funzionare! Restituisce una matrix di identity framework; invece della matrix di trasformazione che prevedo all'avvio dell'applicazione!

    PRINT-OUT DEBUG:

    4.1.2 : @ setImageMatrix(transformMatrix) : transformMatrix = Matrix{[0.025122833, 0.0, 0.0][0.0, 0.025122833, 566.5][0.0, 0.0, 1.0]}

    getImageMatrix().getValues(values) : transformMatrix = Matrix{[0.025122833, 0.0, 0.0][0.0, 0.025122833, 566.5][0.0, 0.0, 1.0]}

    4.4 : @ setImageMatrix(transformMatrix) : transformMatrix = Matrix{[0.025122833, 0.0, 0.0][0.0, 0.025122833, 553.0][0.0, 0.0, 1.0]}

    @ getImageMatrix().getValues(values) : transformMatrix = Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.0]}

    Mi sono guardato intorno e non riesco a trovare una documentazione su questo. In qualche modo viene ripristinata la matrix di image per la mia visione; ha Android 4.4 modificato il modo in cui dovremmo fare questo? Qualcun altro ha incontrato questo problema?

    nota: il problema sembra avere origine in Android 4.3 – lo stesso problema si verifica in esecuzione su un emulatore

    UPDATE: Ho controllato il registro delle modifiche da 4.2 a 4.3 , ma non c'è niente in che posso vedere sopra la class Matrix, o qualsiasi cosa relativa alla class View.

    UPDATE 2: Il mio pizzico-zoom non funziona anche con lo stesso metodo setImageMatrix() e non è chiaramente attaccato perché non accade nulla in getImageMatrix().getValues()

  • Come smettere di scorrere in un Widget di Gallery?
  • Perché il menu a discesa di overflow si trova nella parte superiore della barra di azione?
  • Attiva simultaneamente l'interface wifi e 3G su Android
  • Abilitazione / disabilitazione di rotazioni dello schermo in Android
  • Aiuti con la prima attività Android
  • Imansible creare il gestore all'interno del thread che non ha chiamato Looper.prepare () all'interno di AsyncTask per ProgressDialog
  • 2 Solutions collect form web for “Bug con Android 4.3 Metodo ImageView getImageMatrix ()”

    Ho trovato quello che credo sia il problema. Ho esaminato il codice sorgente di ImageView e setImageMatrix(Matrix matrix) scoperto che la setImageMatrix(Matrix matrix) sta salvando la matrix in un field diverso da che getImageMatrix() sta tornando …

    Android 4.4 ImageView

     public void setImageMatrix(Matrix matrix) { // collaps null and identity to just null if (matrix != null && matrix.isIdentity()) { matrix = null; } // don't invalidate unless we're actually changing our matrix if (matrix == null && !mMatrix.isIdentity() || matrix != null && !mMatrix.equals(matrix)) { mMatrix.set(matrix); configureBounds(); invalidate(); } } 

    Qui la matrix viene memorizzata nel field mMatrix

     public Matrix getImageMatrix() { if (mDrawMatrix == null) { //<-- should be mMatrix == null return new Matrix(Matrix.IDENTITY_MATRIX); } return mDrawMatrix; //<-- NOT THE RIGHT FIELD TO RETURN } 

    Mentre getImageMatrix() restituisce mDrawMatrix …

    Android 4.1.2 ImageView

     public Matrix getImageMatrix() { return mMatrix; } public void setImageMatrix(Matrix matrix) { // collaps null and identity to just null if (matrix != null && matrix.isIdentity()) { matrix = null; } // don't invalidate unless we're actually changing our matrix if (matrix == null && !mMatrix.isIdentity() || matrix != null && !mMatrix.equals(matrix)) { mMatrix.set(matrix); configureBounds(); invalidate(); } } 

    entrambi i methods utilizzano lo stesso fieldmMatrix

    Quindi c'è il problema proprio lì — improvvisamente getImageMatrix() restituisce il field sbagliato …

    Mentre la mia risposta precedente descrive il problema complessivo, in realtà non potrebbe essere un bug. Come indicato dal Generic Holiday Name, mDrawMatrix dovrebbe essere impostato su mMatrix nel metodo configureBounds() che eliminerebbe questo problema / bug / qualsiasi cosa.

    ANCHE , ho dovuto aggiungere più righe di codice per get configureBounds() per funzionare effettivamente:

     private void configureBounds() { if (mDrawable == null || !mHaveFrame) { return; } int dwidth = mDrawableWidth; int dheight = mDrawableHeight; ... if (dwidth <= 0 || dheight <= 0 || ScaleType.FIT_XY == mScaleType) { /* If the drawable has no intrinsic size, or we're told to scaletofit, then we just fill our entire view. */ mDrawable.setBounds(0, 0, vwidth, vheight); mDrawMatrix = null; } else { //here's the where mDrawMatrix == mMatrix IF using scaleType.MATRIX ... } } 

    Quindi, per realizzare questo per funzionare il modo in cui mi aspetto con 4.2 e più in basso è necessario assicurarsi:

    1. mDrawable != null . Questo non è stato un problema prima, ma per il mio caso non stavo utilizzando un drawable quindi tutto era in mancanza (la dichiarazione di return stata colpita subito)
    2. 'dwidth >0 && dheight >0 . Questo non è un problema se si dispone di un vero e proprio disegnatore, ma come ho detto, non l'ho fatto.
    3. mHaveFrame = true . Non avevo idea di cosa fosse – non l'ho mai usato. L'unico modo per impostarlo su true è call setFrame(int, int, int, int) .

    Per get il mio codice di scala per funzionare di nuovo, ho dovuto aggiungere quanto segue:

      //potentially a fix for the "bug" that appears in Android 4.3+ //mDrawable cannot be null anymore for getImageMatrix to work---stupid //therefore the imageview class MUST set a drawable for matrix scaling to work //so here I am using a "empty" drawable to get around this ShapeDrawable fakeDrawable = new ShapeDrawable(); //so mDrawable != null fakeDrawable.setIntrinsicHeight(1); //so dwidth and dheight are > 0 fakeDrawable.setIntrinsicWidth(1); setImageDrawable(fakeDrawable); setFrame(0, 0, viewWidth, viewHeight); //setting a frame so mHaveFrame = true 

    YIKES

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.