2012-01-22 38 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