2012-01-22 4 views
7

У меня есть куча плиток, которые составляют одно изображение, которое отображается по запросу (по тому, какая часть общего изображения видна на экране). Составное изображение значительно больше, чем экран. Каждая плитка плотно располагается рядом со своими соседями, создавая иллюзию одного изображения (одно изображение, если оно не черепичное, будет слишком большим и иметь ошибки OOM).Android - масштабирование группы просмотра (макета) во время выполнения

Это ImageViews внутри FrameLayout, расположенные сверху/leftMargin.

ориентируется API 2,2/SDK 8

Я пытаюсь масштабировать общее изображение в ответ на пользовательские события (нажатие кнопок, щепотка, и т.д.).

Очевидно, что setScale недоступен до API 11. Я попытался использовать canvas.scale в onDraw для FrameLayout с помощью setWillNotDraw (false) и вызывается onDraw, но масштабирование не применяется (я предполагаю, что сам макет не имеет никакой графической информации? Я предположил, что это тоже сделает ее дочерью, но я думаю, что если я не сделаю здесь что-то не так).

Я думаю, что я мог бы проходить через каждую плиту и масштабировать ее независимо, но каждый раз нужно будет менять и каждый.

Я должен думать, что есть способ масштабировать родительский вид (ViewGroup?), Чтобы все его дочерние элементы также масштабировались (как и любой другой язык, ответственный за управление графическим интерфейсом). Что мне не хватает?

Благодаря

ответ

8

Для справки, подход упоминалось выше (с использованием OnDraw родителя ViewGroup) делает фактически работают. Я использовал canvas.save() перед преобразованием и canvas.restore() после (на основе некоторых примеров), что было неверно.

Ниже приведен общий подкласс FrameLayout, который будет масштабироваться это дети

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

Ничего себе, это довольно поучительное, спасибо! Но я предполагаю, что это имеет смысл (легче добраться до контлукции, зная ответ;)). Мы не хотим сохранять и восстанавливать холст до его предыдущего состояния, так как это изменение, которое мы хотим, сделанное непосредственно на том же слое. Еще раз, приветствия :) – aMiGo

+0

Что касается canvas.save() и canvas.restore(), я делал то же самое. и действительно без них он работает. так что вы можете сказать мне, почему на странице разработчиков и разработчиков (http://developer.android.com/training/gestures/scale.html) они помещают эти строки? – AsafK

+1

@AsafK Я понятия не имею. – momo

Смежные вопросы