Android 当屏幕上有操作栏时,为什么我的视图组绘制不正确?

Android 当屏幕上有操作栏时,为什么我的视图组绘制不正确?,android,android-layout,android-view,Android,Android Layout,Android View,自从我开始尝试将ActionBar添加到我的活动中以来,我一直在努力理解为什么我的ViewGroup实现出现故障 我有一个自定义视图组,它根据与视图当前宽度和高度相关的比率来布局一组视图。视图组实现的布局算法有点像绝对布局,但它采用相对于视图组宽度和高度的坐标,而不是绝对坐标 我几乎忽略了布局的onMeasure过程,因为我只想告诉子视图它们的大小 onLayout执行如下操作: @Override protected void onLayout(boolean changed, int lef

自从我开始尝试将ActionBar添加到我的活动中以来,我一直在努力理解为什么我的ViewGroup实现出现故障

我有一个自定义视图组,它根据与视图当前宽度和高度相关的比率来布局一组视图。视图组实现的布局算法有点像绝对布局,但它采用相对于视图组宽度和高度的坐标,而不是绝对坐标

我几乎忽略了布局的onMeasure过程,因为我只想告诉子视图它们的大小

onLayout执行如下操作:

@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。如果您想了解更多有关自定义布局的信息,请观看我的主题演讲:很好,我会这样做。到目前为止,我的布局还不错,但更多关于这个主题的知识总是有帮助的。