2012-01-22 29 views
7

我有一堆構成單個圖像的圖塊,這些圖塊根據請求呈現(通過屏幕上可見的部分總圖像)。合成圖像比屏幕大得多。每個圖塊緊鄰其鄰居放置,以創建單個圖像的幻影(如果沒有平鋪,則單個圖像將太大並且具有OOM錯誤)。Android - 在運行時縮放視圖組(佈局)

這些是在FrameLayout中的ImageViews,用top/leftMargin定位。

靶向API 2.2/SDK 8

我試圖響應於用戶事件(按鈕按壓,夾持等)來縮放整個圖像。

顯然setScale在API 11之前是不可用的。我嘗試使用setWillNotDraw(false)在FrameLayout的onDraw中使用canvas.scale,並調用onDraw,但沒有應用縮放(我假設因爲佈局本身沒有任何圖像信息?我曾假設它會呈現它的孩子,但我想不是,除非我在這裏做錯了什麼)。

我想我可以迭代通過每個瓷磚和獨立的規模,但每次都需要重新定位每個瓷磚。

我不得不認爲有一種方法可以縮放父視圖(ViewGroup?),以便它的所有子項都被縮放(像負責管理GUI的其他語言一樣)。我錯過了什麼?

由於

回答

8

作爲參考,上述的(使用親本的ViewGroup的的onDraw)是否確實工作的辦法。我在轉換之前使用了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(),我一直在做同樣的事情。事實上沒有它們,它正在工作。所以你可以告訴我爲什麼在[android開發頁面](http://developer.android.com/training/gestures/scale.html)他們把這些行? – AsafK

+1

@AsafK我不知道。 – momo