Liebe Community
Ich brauche wieder mal eure Meinung. Ich mache meinem Nickname erneut alle Ehre und jage als Einzelkämpfer seit über 20 Stunden verzweifelt einem seltsamen Effekt hinterher - unterdessen denke ich, dass es ein Bug in Android ist. Aber schöne der Reihe nach: Ich programmiere eine Bildschirmlupe, um einzelne Pixels des Homescreens sichtbar zu machen. Soweit erfolgreich - bis auf ein kleines Detail. Das Fenster der Lupe ist in Breite und Höhe veränderbar, wenn ich nun dessen OBERE oder LINKE Kante jeweils nach INNEN ziehe, ruckelt - vor allem wenn ich schnell ziehe - mein Bild und ändert sogar seinen Massstab, obwohl es genau in das ImageView passt (siehe mein 10-Sekunden-Video hier; für die anderen sechs Kombinationen von Kanten und Ziehrichtungen funktioniert mein Code jedoch perfekt, was schon mal seltsam ist, denn mein Code unterscheidet Ziehrichtungen nicht). Der einzig zuständige Code (für festen Vergrösserungsfaktor 10 und für den Fall im Video) lautet:
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()
);
Alles anzeigen
Auf der Suche nach der Ursache kam ich auf die Idee, bitmapSrc durch ein festes geladenes Bild pic auszutauschen (zusätzliche Zeile 9):
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) {
bitmapSrc = Bitmap.createBitmap(pic, 0, pic.getHeight() - windowHeightSrc, windowWidthSrc, windowHeightSrc);
imageViewMagnification.setImageBitmap(Bitmap.createScaledBitmap(bitmapSrc, 10*windowWidthSrc, 10*windowHeightSrc,false));
}
},
new Handler()
);
Alles anzeigen
Das ändert (ausser dem Bild natürlich) gar nichts, siehe Video hier. ABER: Wenn ich Zeilen 9 und 10, die ja vom Befehl PixelCopy.request() unabhängig sind, vor diesen Befehl ziehe, funktioniert überraschenderweise alles bestens (siehe mein drittes Video hier
Rect rect = new Rect(xOffset,yOffset - windowHeightSrc,xOffset + windowWidthSrc, yOffset);
bitmapSrc = Bitmap.createBitmap(windowWidthSrc, windowHeightSrc, Bitmap.Config.ARGB_8888);
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()
);
Alles anzeigen
Das beweist meiner Meinung nach, dass mein übriger Code (der nichts mehr am Bild ändert) korrekt ist und der Fehler nicht dort liegen kann, dass aber PixelCopy.request() einen unerwarteten Einfluss auf imageViewMagnification.setImageBitmap() hat, obschon das nicht sein sollte. Mein Fragen:
1) Übersehe ich da was Fundamentales, oder ist der Unterschied von Version 2 und 3 nicht ein Android-Bug?
2) Wie könnte man den Fehler noch mehr eingrenzen?
3) Mit welchen Wordarounds kann ich meine App doch noch perfektionieren?
Jede Rückmeldung und Idee ist hochwillkommen ...