Interferenz von PixelCopy und setImageBitmap?

O

Optimist

Neues Mitglied
Threadstarter
Hallo Community

Ich bin beim Entwickeln einer Bildschirmlupe auf einen seltsamen, für mich völlig unerklärbaren Effekt gestossen. Kann mir jemand erklären, warum die beiden folgenden (für mich identischen) Code-Versionen verschiedene Auswirkungen haben? Die Codes werden genau dann ausgeführt, wenn ich die obere Kante einer ImageView ziehe, und zwar auf einem Galaxy 9 mit Android 9.0.

VERSION 1: Hier wird ein passender, vergrösserter Ausschnitt eines lokalen Bildes "pic" in die ImageView geladen. Der Effekt ist wie erwartet: Das Bild wird beim Ziehen der Kante abgedeckt bzw. zugedeckt, bleibt aber stabil "an Ort", siehe mein 10-Sekunden-Video hier.

Code:
    Rect rect = new Rect(xOffset, yOffset - windowHeightSrc, xOffset + windowWidthSrc, yOffset);
    bitmapSrc = Bitmap.createBitmap(pic, 0, pic.getHeight() - windowHeightSrc, windowWidthSrc, windowHeightSrc);
    imageViewMagnification.setImageBitmap(Bitmap.createScaledBitmap(bitmapSrc, 10*windowWidthSrc, 10*windowHeightSrc,false));
    PixelCopy.request(surface, rect, bitmapSrc,
        new PixelCopy.OnPixelCopyFinishedListener() {
          @Override public void onPixelCopyFinished(int resultCode) {
          }
        }, new Handler()
    );
VERSION 2: Hier wird gegenüber Version 1 einzig und allein die 2. und 3. Codezeile nach "onPixelCopyFinished" verschoben. Jetzt wird die ImageView beim Vergrössern wie in Version 1 korrekt gefüllt, wenn ich aber die Kante nach innen ziehe, zittert das Bild und ändert, vor allem beim schnellen Ziehen, sogar den Massstab, siehe Video hier. Für mich absolut unerklärbar. Ist dies evtl. ein Android-Bug?

Code:
    Rect rect = new Rect(xOffset, yOffset - windowHeightSrc, xOffset + windowWidthSrc, yOffset);
    PixelCopy.request(surface, rect, bitmapSrc,
        new PixelCopy.OnPixelCopyFinishedListener() {
          @Override public void onPixelCopyFinished(int resultCode) {
            bitmapSrc = Bitmap.createBitmap(pic, 0, pic.getHeight() - windowHeightSrc, windowWidthSrc, windowHeightSrc);
            imageViewMagnification.setImageBitmap(Bitmap.createScaledBitmap(bitmapSrc, 10*windowWidthSrc, 10*windowHeightSrc,false));
          }
        }, new Handler()
    );
BEMERKUNG: Natürlich machen die Befehle in den obigen Code-Snippets keinen grossen Sinn. Wie gesagt, möchte ich eine Bildschirmlupe schreiben, und der entsprechende (jetzt sinnvolle) Originalcode lautet wie folgt. Aber auch hier zittert der Inhalt der View , wenn die Kante nach innen gezogen wird, siehe Video hier.

Code:
    Rect rect = new Rect(xOffset, yOffset - windowHeightSrc, xOffset + windowWidthSrc, yOffset);
    bitmapSrc = Bitmap.createBitmap(windowWidthSrc, windowHeightSrc, Bitmap.Config.ARGB_8888);
    PixelCopy.request(surface, rect, bitmapSrc,
        new PixelCopy.OnPixelCopyFinishedListener() {
          @Override public void onPixelCopyFinished(int resultCode) {
            imageViewMagnification.setImageBitmap(Bitmap.createScaledBitmap(bitmapSrc, 10*windowWidthSrc, 10*windowHeightSrc,false));
          }
        }, new Handler()
    );
Ich wäre für jede Bemerkung, Einschätzung oder Vermutung sehr dankbar, denn langsam bin ich am verzweifeln...
 
Oben Unten