Question

Il y a un certain nombre de questions que je vais avoir, toutes choses étant liées. Certains que j'ai résolu, mais la solution que j'ai trouvé peut-être me arrêter du produit final. Je vais mentionner ici toutes les questions et les solutions que je suis sûr que ce serait un problème assez courant qu'un certain nombre de personnes rencontrais.

Résultat final J'ai une image de base qui a 3 couches (png transparent) sur le dessus. les couches que l'affichage est à l'utilisateur. Chaque couche ajoute plus d'informations à l'image de base. Dans ma situation l'image de base est une image des étoiles. Lorsque l'utilisateur ajoute des couches supplémentaires, ils peuvent voir les limites de la constellation, les noms étoiles, et une grille. L'utilisateur doit également être en mesure de zoomer sur une zone pour une image plus claire d'une partie du ciel.

Première question Les tailles d'image sont deux grands (1324 × 1872), provoquant une erreur OutOfMemory.

Résolu par mise à l'échelle de l'image en utilisant

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

Bien que ce code a aidé, je reçois toujours l'erreur lors du chargement OutOfMemory les 3 couches. Je pense aussi mise à l'échelle de l'image va être un problème lorsque vous zoomez la qualité a été réduire.

Deuxième question. Pour autant que je l'ai trouvé vous ne pouvez pas la couche png où l'une des images est pas transparent. Aucun des images transparentes affichent montrant seulement celle qui est non transparent (image de base).

Résolu en réglant l'arrière-plan de la FrameLayout à l'image de base et ne laissant que les 3 couches que les enfants à cette disposition.

Troisième numéro Zoomant sur l'image. J'ai trouvé ce qui pourrait être une solution ici Comment puis-je obtenir la fonctionnalité zoom pour les images? , mais ne l'ont pas encore testé que l'émulateur ne pas multitouch et mon appareil n'a pas aimé quand je l'ai pris pour une baignade. J'ai actuellement pas d'autres unités à tester sur.

Quelle est la meilleure façon de charger les 4 images (base + 3 couches) sans obtenir le OutOfMemoryError et ont la fonctionnalité pour zoomer sur les images.

Je l'ai créé un projet avec le code nécessaire

Était-ce utile?

La solution

Je l'ai trouvé quelques solutions. Première question: Après avoir terminé le code et en utilisant le TouchImageView trouvé ici . Je ne reçois plus le des erreurs de mémoire. Je peux charger toutes les couches sans problème.

Les deuxième et troisième questions ont également été résolus en utilisant TouchImageView. Alors que je suis heureux avec ça, je serais ravi de la classe d'avoir plus de commentaires que j'ai passé beaucoup de temps à essayer de comprendre comment cela fonctionne et pourquoi, mais à la fin a échoué.

Le dernier gros problème que j'ai eu quand pincée de zoom il ne zoomer la couche supérieure (comme prévu). Le correctif à c'était de changer la classe TouchImageview légèrement et ajouter la fonctionnalité pour une matrice d'écoute changé. Maintenant, chaque fois que la matrice est modifiée, la matrice est retournée à l'auditeur qui met alors à jour la matrice dans toutes les couches, y compris l'image de base. Cela fait maintenant zoom toutes les images en même temps en gardant les étiquettes pointant le même endroit sur l'image de base quel que soit le zoom.

Ceci est l'interface très simple pour informer les auditeurs du changement de matrice

public interface IOnMatixChangedListener
{
        public void onMatrixChanged(Matrix matrix);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top