我有一堆构成单个图像的图块,可根据要求呈现(通过屏幕上可见的总图像部分)。合成图像明显大于屏幕。每个图块紧邻其邻居定位,以创建单个图像的错觉(单个图像,如果不是平铺,则会太大并且有OOM错误)。
这些是FrameLayout中的ImageViews,位于top / leftMargin。
目标API 2.2 / SDK 8
我正在尝试缩放整个图像以响应用户事件(按下按钮,捏合等)。
显然setScale在API 11之前不可用。我尝试在frameLayout的onDraw中使用canvas.scale和setWillNotDraw(false),并且正在调用onDraw,但是没有应用缩放(我假设因为布局本身没有没有任何图形信息?我曾经认为它也会渲染它的孩子,但我想不会,除非我在这里也做错了。)
我想我可以遍历每个图块并单独缩放它,但每次都需要重新定位每个图块。
我必须认为有一种方法可以扩展父视图(ViewGroup?),以便缩放所有子视图(就像负责管理GUI的所有其他语言一样)。我错过了什么?
由于
答案 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);
}
}