Pregunta

Hay una serie de problemas que tengo, todos relacionados. Algunos que he resuelto, pero la solución que he encontrado podría estar deteniéndome del producto final. Mencionaré todos los problemas y soluciones aquí, ya que estoy seguro de que este sería un problema bastante común que varias personas encontrarían.

Resultado final Tengo una imagen base que tiene 3 capas (PNG transparentes) en la parte superior. Las capas que muestran dependen del usuario. Cada capa agrega más información a la imagen base. En mi situación, la imagen base es una imagen de las estrellas. A medida que el usuario agrega capas adicionales, puede ver los límites de la constelación, los nombres de las estrellas y una cuadrícula. El usuario también debe poder acercar en un área para una imagen más clara de una sección del cielo.

Primer problema, los tamaños de imagen son dos grandes (1324 × 1872) que causan un error de Memoria.

Resuelto escalando la imagen 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;
    }

Aunque este código ha ayudado, todavía obtengo el error OutOfMemory al cargar las 3 capas. También creo que escalar la imagen será un problema cuando se acerca la calidad, ya que la calidad se ha reducido.

Segundo problema. Por lo que he encontrado, no puedes colocar PNG donde una de las imágenes no es transparente. No se mostrarán imágenes transparentes que muestren solo la que no es transparente (imagen base).

Resolvió esto estableciendo el fondo del Framelayout a la imagen base y dejando solo las 3 capas cuando niños a ese diseño.

Tercer problema zoom en la imagen. He encontrado lo que podría ser una solución aquí ¿Cómo puedo obtener la funcionalidad de zoom para las imágenes?, pero aún no lo he probado, ya que el emulador no tiene multitouch y a mi dispositivo no le gustó cuando lo tomé para nadar. Actualmente no tengo otros dispositivos para probar.

¿Cuál es la mejor manera de cargar las 4 imágenes (base + 3 capas) sin obtener el OutOfMemoryError y tener la funcionalidad para acercar las imágenes?

He creado un proyecto con el código requerido aquí

¿Fue útil?

Solución

He encontrado algunas soluciones. Problema uno: después de completar el código y usar el TouchImageView encontrado aquí. Ya no obtengo los errores de memoria. Puedo cargar todas las capas sin problemas.

El segundo y tercer problema también se resolvieron mediante el uso de TouchImageView. Si bien estoy contento con eso, me encantaría que la clase comentara más, ya que pasé mucho tiempo tratando de averiguar cómo funciona y por qué, pero al final falló.

El último gran problema que tuve fue cuando el zoom de pellizco solo ampliaría la capa superior (como se esperaba). La solución a esto fue cambiar ligeramente la clase TouchImageView y agregar la funcionalidad para un oyente cambiado de matriz. Ahora, cuando se cambia la matriz, la matriz se devuelve al oyente que luego actualiza la matriz en todas las capas, incluida la imagen base. Esto ahora hace que todas las imágenes se alejen al mismo tiempo manteniendo las etiquetas apuntando a la misma ubicación en la imagen base independientemente del zoom.

Esta es la interfaz muy simple utilizada para notificar a los oyentes sobre el cambio de matriz

public interface IOnMatixChangedListener
{
        public void onMatrixChanged(Matrix matrix);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top