Frage

Es gibt eine Reihe von Problemen, die ich habe und alle verwandt sind. Einige habe ich gelöst, aber die Lösung, die ich gefunden habe, könnte mich vom Endprodukt aushalten. Ich werde hier alle Probleme und Lösungen erwähnen, da ich sicher bin, dass dies ein ziemlich häufiges Problem wäre, auf das eine Reihe von Menschen stoßen würden.

Endergebnisse Ich habe ein Basisbild mit 3 Schichten (transparente PNGs). Die Ebenen, die angezeigt werden, liegt beim Benutzer. Jede Ebene fügt dem Basisbild weitere Informationen hinzu. In meiner Situation ist das Basisbild ein Bild der Sterne. Da der Benutzer zusätzliche Ebenen hinzufügt, können er Konstellationsgrenzen, Sternnamen und ein Raster sehen. Der Benutzer muss auch in der Lage sein, einen Bereich für ein klareres Bild eines Abschnitts des Himmels zu vergrößern.

Erste Ausgabe Die Bildgrößen sind zwei große (1324 × 1872), die einen Fehler verursachen.

Gelöst, indem das Bild mithilfe skaliert wird

    /**
    * This method scales an image in the assets directory and returns a 
    * BitmapDrawable object that can be passed to an images setImageBitmap or a
    * views setBackgroundDrawable by passing this method into the constructor
    * of BitmapDrawable.
    * eg ViewGroup.setBackgroundDrawable(
    * new BitmapDrawable(getScaledBitMap(this, imagePath, 2)));
    * 
    * @param context
    * @param imgFullPath
    * @param imageSize
    * @return
    * @throws IOException
    */
    public static Bitmap getScaledBitMap(Context context, String imgFullPath,
        int imageSize)  throws IOException
    {
        InputStream instream;
        instream = context.getAssets().open(imgFullPath);

        BitmapFactory.Options options=new BitmapFactory.Options();
        options.inSampleSize = imageSize;
        Bitmap bitmap=BitmapFactory.decodeStream(instream, null, options);

        return bitmap;
    }

Obwohl dieser Code geholfen hat, erhalte ich immer noch den Fehler mit dem Laden der 3 Schichten. Ich denke auch, dass die Skalierung des Bildes ein Problem beim Zoomen sein wird, da die Qualität verringert wurde.

Zweite Ausgabe. Soweit ich festgestellt habe, können Sie keine PNGs schichten, wenn eines der Bilder nicht transparent ist. Es werden keine transparenten Bilder angezeigt, die nur diejenigen zeigen, die nicht transparent ist (Basisbild).

Löste dies, indem Sie den Hintergrund des Framelayouts auf das Basisbild setzten und nur die 3 Schichten als Kinder dieses Layout überlassen.

Dritte Ausgabe, das das Bild vergrößert. Ich habe gefunden, was hier eine Lösung sein könnte Wie kann ich Zoom -Funktionen für Bilder erhalten?, aber habe es noch nicht getestet, da der Emulator nicht Multitouch hat und mein Gerät es nicht mochte, als ich es zum Schwimmen nahm. Ich habe derzeit keine anderen Geräte zu testen.

Was ist der beste Weg, um alle 4 Bilder (Basis + 3 Ebenen) zu laden, ohne das OutofMemoryError zu erhalten und die Funktionen zu haben, die Bilder zu zoomen.

Ich habe ein Projekt mit dem erforderlichen Code erstellt hier

War es hilfreich?

Lösung

Ich habe ein paar Lösungen gefunden. Ausgabe eins: Nach Abschluss des Codes und der Verwendung des gefundenen TouchImageView hier. Ich bekomme nicht mehr die Speicherfehler mehr. Ich kann alle Schichten ohne Probleme laden.

Die zweite und dritte Probleme wurden ebenfalls unter Verwendung von TouchImageview gelöst. Obwohl ich damit zufrieden bin, würde ich die Klasse gerne mehr Kommentare haben, da ich viel Zeit damit verbracht habe, herauszufinden, wie es funktioniert und warum, aber am Ende scheiterte.

Das letzte große Problem, das ich hatte, war, als das Zoomen von Prisen nur die oberste Schicht vergrößern würde (wie erwartet). Das Fix dafür bestand darin, die TouchImageView -Klasse geringfügig zu ändern und die Funktionalität für eine von Matrix veränderte Hörer hinzuzufügen. Wenn immer die Matrix geändert wird, wird die Matrix an den Hörer zurückgegeben, der die Matrix in allen Ebenen einschließlich des Basisbildes aktualisiert. Dadurch zoomen jetzt alle Bilder gleichzeitig, um die Etiketten unabhängig vom Zoom den gleichen Ort auf dem Basisbild zu zeigen.

Dies ist die sehr einfache Schnittstelle, mit der die Hörer über die Matrixänderung informiert wurden

public interface IOnMatixChangedListener
{
        public void onMatrixChanged(Matrix matrix);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top