3

我有一个自定义视图,我在画布上绘制了一个网格。我希望绘制网格,使网格的外边缘与设备屏幕的边缘重合。我使用getWidth()andgetHeight()方法来确定网格的尺寸,然后绘制它,但是出现的网格总是在屏幕外绘制单元格。

如果我得到显示器的宽度和高度并使用它们进行绘图,那么我的网格宽度将是我想要的,但高度仍然关闭,因为某些显示器的高度被电池和 wifi 指示器占用,等等。另外,我不想使用这些值,因为我希望能够将我的视图嵌入到更大的 xml 布局中。

下面是我在自定义视图中找到视图宽度和高度的代码:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
    cellWidth = w/nCols;
    cellHeight = h/nRows;
    //find view dimensions
    viewWidth = getWidth();     //this is just equal to w
    viewHeight = getHeight();   //this is just equal to h
    super.onSizeChanged(w,h,oldw,oldh);
}

和我的自定义视图的 onDraw:

@Override 
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);

    canvas.drawRect(0,0,viewWidth,viewHeight, background);    

    for(int i=0; i <= nRows; i++){
        canvas.drawLine(0,i*cellHeight, nCols*cellWidth,i*cellHeight,lines);
        canvas.drawLine(i*cellWidth, 0, i*cellWidth, nRows*cellHeight, lines);
    }
}       

}

我遵循的方法与类似,但没有奏效。如何获得视图宽度和高度的真实值?谢谢阅读!

4

3 回答 3

1

我猜你已经看过这个了?

自定义视图高度和宽度

或者也许这是一个不同的问题。

于 2013-06-06T19:10:35.997 回答
0

我会通过减去状态栏的高度来做到这一点。

你看过这个帖子吗?

作者建议:

Rect rectangle = new Rect();
Window window = getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rectangle);
int statusBarHeight = rectangle.top;
int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
int titleBarHeight= contentViewTop - statusBarHeight;

或者,

public int getStatusBarHeight()
{
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height","dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}
于 2013-06-06T19:11:21.670 回答
0

当涉及到画布时,有几件事可能会导致问题,但乍一看,我可以注意到您正在尝试在 onSizeChanged 传递给超类之前使用 getWidth 来进行正确的计算,而不是调用super.onSizeChanged(w,h,oldw,oldh);在方法结束时,尝试这样做:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
    super.onSizeChanged(w,h,oldw,oldh);
    cellWidth = w/nCols;
    cellHeight = h/nRows;
    //find view dimensions
    viewWidth = getWidth();     //this is just equal to w
    viewHeight = getHeight();   //this is just equal to h
}

这是我第一眼看到的,但事实是,当涉及到画布时,你必须非常明确自己的尺寸,并且不要指望父母根据你的画来处理任何尺寸......

问候!

于 2013-06-06T19:14:20.430 回答