自定义视图的getWidth()和getHeight()给出错误的值[重复]
Posted
技术标签:
【中文标题】自定义视图的getWidth()和getHeight()给出错误的值[重复]【英文标题】:getWidth() and getHeight() for custom view give wrong values [duplicate] 【发布时间】:2013-06-06 18:47:24 【问题描述】:我有一个自定义视图,我在画布上绘制了一个网格。我希望绘制网格,使网格的外边缘与设备屏幕的边缘重合。我使用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,但没有奏效。 如何获得视图宽度和高度的真实值? 感谢阅读!
【问题讨论】:
【参考方案1】:我猜你已经看过了?
Custom View Height and Width
或许这是一个不同的问题。
【讨论】:
是的,我看到了那个帖子。事实上,我给出的链接来自那个帖子。但是我相信答案就在 onMeasure 函数的某个地方。我还没有尝试该帖子中建议的所有内容。我现在会 它现在正在工作(或多或少)。感谢您指点我回到那里,很抱歉我上次没有完全阅读它。干杯!【参考方案2】:当涉及到画布时,有几件事可能会导致问题,但乍一看,我注意到您正在尝试在 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
这是我第一眼看到的,但事实是,当涉及到画布时,你必须非常清楚自己的尺寸,并且不要指望父母根据你的画来处理任何尺寸......
问候!
【讨论】:
不幸的是,这没有帮助。不过谢谢【参考方案3】:我会通过减去状态栏的高度来做到这一点。
你见过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;
【讨论】:
好吧,问题是即使自定义视图嵌入到更大的 xml 布局中,我也希望它能够工作。例如,我可能想在顶部包含按钮或在侧面包含边框。真正的问题是我似乎无法获得视图本身的高度和宽度。谢谢以上是关于自定义视图的getWidth()和getHeight()给出错误的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
查看 getHeight() 和 getWidth() 返回值太大