2012-01-22 26 views
7

Mam kilka płytek, które składają się na pojedynczy obraz, które są renderowane na żądanie (przez to, jaka część całkowitego obrazu jest widoczna na ekranie). Obraz złożony jest znacznie większy niż ekran. Każda płytka jest umieszczona ciasno obok sąsiadów, aby stworzyć iluzję pojedynczego obrazu (pojedynczy obraz, jeśli nie jest wyłożony płytkami, byłby zbyt duży i zawierałby błędy OOM).Android - skalowanie widoku (układu) w czasie wykonywania

Są to ImageViews wewnątrz FrameLayout, ustawione za pomocą top/leftMargin.

targetting API 2.2/SDK 8

próbuję przeskalować całkowity obraz w odpowiedzi na zdarzenia użytkownika (naciśnięć klawiszy, szczypanie, etc).

Najwyraźniej funkcja setScale jest niedostępna do wersji interfejsu API 11. Próbowałem użyć canvas.scale w pliku onDraw obiektu FrameLayout z parametrem setWillNotDraw (false), a onDraw jest wywoływany, ale nie jest stosowane skalowanie (zakładam, ponieważ sam układ nie ma żadnych informacji graficznych? Założę się, że to sprawi, że to również dzieci, ale chyba nie, chyba że robię coś złego również tutaj).

Sądzę, że mógłbym iterować po każdym kafelku i skalować go niezależnie, ale musiałbym również zmieniać położenie każdego z nich za każdym razem.

Muszę myśleć, że istnieje sposób skalowania widoku rodzica (ViewGroup?), Aby wszystkie jego dzieci również były skalowane (jak każdy inny język odpowiedzialny za zarządzanie GUI). czego mi brakuje?

Dzięki

Odpowiedz

8

Dla porównania, podejście wspomniano powyżej (przy użyciu OnDraw rodzica ViewGroup) Czy w rzeczywistości pracy. Używałem canvas.save() przed transformacją i canvas.restore() po (na podstawie niektórych przykładów), co było niepoprawne.

Poniżej ogólny podklasa FrameLayout że będą skalować to dzieci

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

Wow, to całkiem otwarcia oczu, dziękuję! Ale wydaje mi się, że ma to sens (łatwiej jest dojść do konkluzji znając odpowiedź;)). Nie chcemy zapisywać i przywracać płótna do jego poprzedniego stanu, ponieważ taka jest zmiana, którą chcemy, Wykonaną bezpośrednio na tej samej warstwie. Jeszcze raz, okrzyki :) – aMiGo

+0

Odnośnie canvas.save() i canvas.restore(), robiłem to samo. i rzeczywiście bez nich działa. więc czy możesz mi powiedzieć, dlaczego na stronie [Android development page] (http://developer.android.com/training/gestures/scale.html) umieszczają te wiersze? – AsafK

+1

@AsafK Nie mam pojęcia. – momo

Powiązane problemy