Android-在运行时缩放视图组(布局)

Android-在运行时缩放视图组(布局),android,Android,我有一堆瓷砖组成了一个单独的图像,这些瓷砖是根据要求渲染的(总图像的哪一部分在屏幕上是可见的)。合成图像明显大于屏幕。每个平铺紧挨着它的邻居放置,以创建单个图像的幻觉(单个图像如果不平铺,将太大并且有错误) 这些是框架布局内的图像视图,使用上/左边距定位 针对API 2.2/SDK 8 我试图根据用户事件(按钮按下、挤压等)缩放整个图像 显然,setScale在API 11之前不可用。我尝试在带有setWillNotDraw(false)的FrameLayout的onDraw中使用canvas.

我有一堆瓷砖组成了一个单独的图像,这些瓷砖是根据要求渲染的(总图像的哪一部分在屏幕上是可见的)。合成图像明显大于屏幕。每个平铺紧挨着它的邻居放置,以创建单个图像的幻觉(单个图像如果不平铺,将太大并且有错误)

这些是框架布局内的图像视图,使用上/左边距定位

针对API 2.2/SDK 8

我试图根据用户事件(按钮按下、挤压等)缩放整个图像

显然,setScale在API 11之前不可用。我尝试在带有setWillNotDraw(false)的FrameLayout的onDraw中使用canvas.scale,并且正在调用onDraw,但是没有应用缩放(我假设是因为布局本身没有任何图形信息?我假设它也会渲染它的子级,但我猜不会,除非我在这里也做了一些错误的事情)

我想我可以迭代每个图块并独立缩放它,但每次都需要重新定位每个图块

我认为有一种方法可以缩放父视图(ViewGroup?),这样它的所有子视图都可以缩放(就像其他负责管理GUI的语言一样)。我错过了什么


感谢您的参考,上述方法(使用父视图组的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);
    }

}

哇,真是大开眼界,谢谢你!但我想这是有道理的(知道答案更容易得出结论)。我们不希望保存画布并将其恢复到以前的状态,因为这是我们想要的更改,直接在同一层上进行。再一次,干杯:)关于canvas.save()和canvas.restore(),我一直在做同样的事情。事实上,如果没有它们,它就会起作用。那么你能告诉我为什么他们要把这些台词放进去吗?@AsafK我不知道。太好了!这是自动缩放视图组的最佳解决方案type@AsafK只是想澄清一下:其目的是执行
canvas.save()然后
画布.缩放(缩放,缩放)
,然后执行所需的任何绘制操作,最后执行
canvas.restore()。这样,只有那些要受影响的绘制操作才会受到变换的影响。例如,如果超类或父类打算在画布上进一步绘制,则不会无意中将缩放操作泄露给这些人。在保存和恢复之间执行的图形受比例的影响,调用“恢复”不会追溯应用于该比例,只会应用于以后的图形