2012-01-22 9 views
7

Tengo un montón de mosaicos que componen una sola imagen, que se procesan a petición (por qué parte de la imagen total está visible en la pantalla). La imagen compuesta es significativamente más grande que la pantalla. Cada azulejo se coloca firmemente junto a sus vecinos para crear la ilusión de una sola imagen (la imagen individual, si no está embaldosada, sería demasiado grande y tendría errores OOM).Android: escalar un grupo de vistas (diseño) en el tiempo de ejecución

Estas son las ImageView dentro de un FrameLayout, posicionado con la parte superior/izquierda de la marca.

Targetting API 2.2/SDK 8

Estoy tratando de escalar la imagen completa en respuesta a los eventos de usuario (pulsaciones de botón, pellizco, etc).

Aparentemente setScale no está disponible hasta API 11. Intenté usar canvas.scale en onDraw de FrameLayout con setWillNotDraw (falso), y se está llamando a onDraw, pero no se está aplicando ninguna escala (supongo que porque el diseño en sí mismo no tiene ninguna información gráfica? Supuse que representaría también a los niños, pero supongo que no, a menos que esté haciendo algo mal aquí también).

Supongo que podría iterar a través de cada mosaico y escalarlo de forma independiente, pero también tendría que cambiar la posición de cada uno, cada vez.

Tengo que pensar que hay una manera de escalar una vista principal (ViewGroup?) Para que todos sus hijos también tengan una escala (como cualquier otro idioma responsable de administrar una GUI). ¿Qué me estoy perdiendo?

Gracias

Respuesta

8

Como referencia, el enfoque mencionado anteriormente (usando onDraw de un padre ViewGroup) de hecho funciona. Había estado utilizando canvas.save() antes de la transformación y canvas.restore() después (basado en algunos ejemplos), que era incorrecto.

La siguiente es una subclase genérica de FrameLayout que se reduce la escala de los niños

package com.whatever.layouts; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.widget.FrameLayout; 

public class ScalingFrameLayout extends FrameLayout { 

    private float scale = 1; 

    public ScalingFrameLayout(Context context) { 
     super(context); 
     setWillNotDraw(false); 
    } 

    public void setScale(float factor){ 
     scale = factor; 
     invalidate(); 
    } 
    public float getScale(){ 
     return scale; 
    } 

    @Override 
    public void onDraw(Canvas canvas){ 
     canvas.scale(scale, scale); 
     super.onDraw(canvas); 
    } 

} 
+0

Vaya, es muy reveladora, gracias! Pero creo que tiene sentido (es más fácil llegar a una conclusión sabiendo la respuesta;)). No queremos guardar y restaurar el lienzo a su estado anterior, ya que ese es el cambio que queremos, hecho directamente en la misma capa. Una vez más, aplausos :) – aMiGo

+0

En cuanto a canvas.save() y canvas.restore(), he estado haciendo lo mismo. y de hecho sin ellos está funcionando. Entonces, ¿puedes decirme por qué en [la página de desarrollo de Android] (http://developer.android.com/training/gestures/scale.html) están poniendo esas líneas? – AsafK

+1

@AsafK No tengo idea. – momo

Cuestiones relacionadas