缩放自定义布局
问题描述:
我有一个从RelativeLayout派生的自定义布局。我希望自定义布局根据放置的容器布局的大小进行缩放。缩放自定义布局
这是我到目前为止有我的自定义布局:
public class ScaledRelativeLayout extends RelativeLayout {
private static final float HEIGHT = 460;
private static final float WIDTH = 380;
private float scale = 1.0f;
private float pivotX = 0.0f;
private float pivotY = 0.0f;
Matrix matrix = new Matrix();
public ScaledRelativeLayout(Context cxt, AttributeSet attrs) {
super(cxt, attrs);
}
@Override
public void dispatchDraw(Canvas canvas) {
canvas.save();
View parent = (View)getParent();
int parentHeight = parent.getHeight();
int parentWidth = parent.getWidth();
float scaleX = (float)parentWidth/WIDTH;
float scaleY = (float)parentHeight/HEIGHT;
scale = Math.min(scaleX, scaleY);
pivotX = (float)parentWidth/2;
pivotY = 0;
canvas.scale(scale, scale, pivotX, pivotY);
super.dispatchDraw(canvas);
canvas.restore();
}
}
这几乎工程。问题是自定义视图由于某种原因在底部被裁剪。就好像裁剪区域在绘制视图时太小。
答
这是因为您的统一比例为scale = Math.min(scaleX, scaleY);
,这可能会导致宽度和高度方面的问题,因为它取决于两个中的最小值。
尝试不均匀的比例缩放画布以适应屏幕
canvas.scale(scaleX, scaleY, pivotX, pivotY);
+0
但我需要自定义布局的规模均匀,以便它的内容不会向一个方向或另一个方向伸展。不能保证容器的尺寸。 – Rooster242 2012-08-01 01:17:38
你为你的最后'HEIGHT'和'WIDTH'领域指定固定的值,然后调整你的事实'Canvas'相应手段有效地,您正在制定“绝对”布局原则。你确定你想这么做吗?为什么不希望操作系统根据屏幕大小和密度自动调整,是否有特殊原因? – Squonk 2012-07-31 22:46:48
当我让操作系统决定时,只要容器的高度大于自定义布局,它就会按照宽度缩放自定义布局。如果容器比自定义布局短,它会从底部开始收割。 – Rooster242 2012-08-01 01:21:26