Android 当屏幕上有操作栏时,为什么我的视图组绘制不正确?
自从我开始尝试将ActionBar添加到我的活动中以来,我一直在努力理解为什么我的ViewGroup实现出现故障 我有一个自定义视图组,它根据与视图当前宽度和高度相关的比率来布局一组视图。视图组实现的布局算法有点像绝对布局,但它采用相对于视图组宽度和高度的坐标,而不是绝对坐标 我几乎忽略了布局的onMeasure过程,因为我只想告诉子视图它们的大小 onLayout执行如下操作:Android 当屏幕上有操作栏时,为什么我的视图组绘制不正确?,android,android-layout,android-view,Android,Android Layout,Android View,自从我开始尝试将ActionBar添加到我的活动中以来,我一直在努力理解为什么我的ViewGroup实现出现故障 我有一个自定义视图组,它根据与视图当前宽度和高度相关的比率来布局一组视图。视图组实现的布局算法有点像绝对布局,但它采用相对于视图组宽度和高度的坐标,而不是绝对坐标 我几乎忽略了布局的onMeasure过程,因为我只想告诉子视图它们的大小 onLayout执行如下操作: @Override protected void onLayout(boolean changed, int lef
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
if (isInEditMode()) return;
int height = getHeight();
int width = getWidth();
for (int i = 0; i < getChildCount(); i++)
{
View child = getChildAt(i);
ImageCell cell = cells.get(i);
int l = (int)(cell.getX0() * width);
int t = (int)(height - (cell.getY1() * height));
int r = (int)(cell.getX1() * width);
int b = (int)(height - (cell.getY0() * height));
child.layout(l, t, r, b);
child.setBackgroundColor(0xFFFF0000);
}
}
@Override
public void onDraw(Canvas canvas)
{
if (canvasMatrix == null)
{
canvasMatrix = new Matrix();
}
canvasMatrix.reset();
canvasMatrix.setScale(scaleX, scaleY);
canvasMatrix.postTranslate(getLeft() + translationX, getTop() + translationY);
canvas.setMatrix(canvasMatrix);
synchronized (renderBuffer)
{
/**
* We need to offset the renderBuffer, the scaling is done by the matrix
* on the canvas.
*/
canvas.drawBitmap(renderBuffer, offsetX, offsetY, null);
}
}
我正在设置一个矩阵,根据需要显示的图像的缩放和平移,对画布应用缩放和平移。然后在画布上以指定的x和y偏移量绘制图像
似乎正在发生的是,位图被绘制在ActionBar下面,在屏幕底部留下了一个很大的空白,而这个空白没有被绘制。如果我给offsetY添加一个常量因子,位图可以在屏幕上的正确位置绘制(取决于设备的旋转)。但我不确定这个常数因子应该计算在哪里
我对安卓绘图知之甚少。我希望画布相对于视图在屏幕上的位置,这样,如果我在(0,0)处绘制,绘制将显示在视图的原点,而不是屏幕的原点
这张图片就是我看到的一个例子。底部的红色区域是drawBitmap未绘制的子视图部分
知道我做错了什么吗?如果视图是全屏的,一切都很好,但是有了操作栏,我没有得到包含操作栏大小的坐标,所以我似乎在它下面画画。你的问题在这里:canvas.setMatrix(canvasMatrix) 通过调用此方法,您可以完成应用于画布的整个变换。整个窗口只有一个画布,因此您要删除应用于动作栏高度偏移的变换
您还应该始终在视图上调用measure()。有些观点认为这个电话能正常工作。谢谢,罗曼。我现在已经重写了我的代码,以确保我没有删除原始矩阵,而是在现有矩阵中添加适当的比例和翻译。这无疑解决了我的问题。我还将确保按照指示在所有子视图上调用measure。如果您想了解更多有关自定义布局的信息,请观看我的主题演讲:很好,我会这样做。到目前为止,我的布局还不错,但更多关于这个主题的知识总是有帮助的。