我有一个自定义视图,我在画布上绘制网格。我希望绘制网格,以便网格的外边缘与设备屏幕的边缘重合。我使用getWidth()
和getHeight()
方法确定网格的尺寸然后绘制它,但出现的网格总是在屏幕外绘制单元格。
如果我得到显示器的宽度和高度而不是用于绘图,那么我的网格宽度将是我想要的,但高度仍然是关闭的,因为显示器的某些高度被电池和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);
}
}
}
我遵循的方法类似于this,但没有奏效。 如何获得视图宽度和高度的真实值? 谢谢你的阅读!
答案 0 :(得分:1)
答案 1 :(得分:0)
我会通过减去状态栏的高度来实现。
你见过this post吗?
作者建议:
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;
}
答案 2 :(得分: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
}
这是我第一眼看到的,但事实是,当谈到画布时,你必须非常明确自己的尺寸,并且不要指望父母根据你的绘画来处理任何尺寸......
问候!