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

mom*_*omo 7 android

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

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

目标API 2.2/SDK 8

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

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

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

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

谢谢

mom*_*omo 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);
    }

}
Run Code Online (Sandbox Code Playgroud)