Domanda

Ci sono una serie di questioni che sto avendo, essendo tutti legati. Alcuni ho risolto, ma la soluzione che ho trovato potrebbe essere mi impedisce di prodotto finale. Citerò tutti i problemi e le soluzioni qui come sono sicuro che questo sarebbe stato un problema abbastanza comune che un certo numero di persone avrebbe incontrato.

Risultato finale Ho un'immagine di base che ha 3 strati (trasparente png di) sulla parte superiore. gli strati che display è lasciata all'utente. Ogni strato aggiunge più informazioni all'immagine di base. Nella mia situazione l'immagine di base è l'immagine delle stelle. Come l'utente aggiunge ulteriori livelli che possano vedere i confini delle costellazioni, nomi di stelle, e una griglia. L'utente ha anche bisogno di essere in grado di ingrandire una zona per un quadro più chiaro di una sezione del cielo.

Prima edizione Le dimensioni delle immagini sono due grandi (1324 × 1872) che causa un errore OutOfMemory.

Risolto da scalare l'immagine usando

    /**
    * 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;
    }

Anche se questo codice ha aiutato, ho ancora ottenere l'errore durante il caricamento OutOfMemory i 3 strati. Penso anche che il ridimensionamento l'immagine sta per essere un problema quando lo zoom come la qualità è stata ridurre.

Seconda edizione. Per quanto ho trovato, non si può strato png di cui una delle immagini non è trasparente. Nessun immagini trasparenti visualizzerà mostrando solo quello che non è trasparente (immagine di base).

Risolto questo impostando lo sfondo del FrameLayout all'immagine di base e lasciando solo i 3 livelli come i bambini a quel layout.

Terza edizione Zoom in sull'immagine. Ho trovato quello che potrebbe essere una soluzione qui Come posso ottenere zoom funzionalità per le immagini? , ma non hanno ancora provato come l'emulatore non ha multitouch e il mio dispositivo non piaceva quando ho preso per una nuotata. Al momento ho altri dispositivi di test.

Qual è il modo migliore per caricare tutte le 4 immagini (base + 3 strati) senza ottenere l'OutOfMemoryError e hanno la funzionalità per ingrandire sulle immagini.

ho creato un progetto con codice richiesto qui

È stato utile?

Soluzione

ho trovato alcune soluzioni. Problema uno: Dopo aver completato il codice e utilizzando il TouchImageView trovato qui . Ottengo più l'errori di memoria. Posso caricare tutti i livelli senza problema.

La seconda e terza problemi sono stati risolti anche utilizzando TouchImageView. Mentre io sono contento di questo, mi piacerebbe per la classe di avere più commentando come ho trascorso un sacco di tempo cercando di capire come funziona e perché, ma alla fine non è riuscita.

L'ultimo grande problema che ho avuto è stato quando pinch zoom sarebbe solo ingrandire lo strato superiore (come previsto). La correzione per questo è stato quello di cambiare la classe TouchImageview un po 'e aggiungere la funzionalità per una matrice cambiato ascoltatore. Ora, quando mai la matrice viene modificato, la matrice viene restituito a chi ascolta che poi aggiorna la matrice di tutti i livelli, tra cui l'immagine di base. Ciò rende ora tutte le immagini zoom, allo stesso tempo mantenendo le etichette che indicano la stessa posizione l'immagine di base sulla indipendentemente zoom.

Ciò è molto semplice interfaccia utilizzata per informare gli ascoltatori del cambiamento matrice

public interface IOnMatixChangedListener
{
        public void onMatrixChanged(Matrix matrix);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top