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

时间:2012-01-22 11:15:32

标签: android

我有一堆构成单个图像的图块,可根据要求呈现(通过屏幕上可见的总图像部分)。合成图像明显大于屏幕。每个图块紧邻其邻居定位,以创建单个图像的错觉(单个图像,如果不是平铺,则会太大并且有OOM错误)。

这些是FrameLayout中的ImageViews,位于top / leftMargin。

目标API 2.2 / SDK 8

我正在尝试缩放整个图像以响应用户事件(按下按钮,捏合等)。

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

我想我可以遍历每个图块并单独缩放它,但每次都需要重新定位每个图块。

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

由于

1 个答案:

答案 0 :(得分: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);
    }

}
相关问题