我已经在其他几个设备上测试了,我的UI看起来很好。
然而,在三星Note 3上,UI从底部被切断了。
我已经记录了系统规格并做了计算。我把设备的屏幕高度设置为1920。
我有一个按钮,大小为108 × 108。
我想要那个按钮在屏幕的底部休息(我不使用XML,我使用Java)。
_button.setMinimumHeight(buttonDimension);
_button.setMaxHeight(buttonDimension);
_button.setY(1920 - 108);
然而,这导致(仅在三星Note 3上)按钮底部被切断。另外,如果我尝试右对齐,那里也有一个轻微的切断。看起来它的底部有25个像素的偏差
这是怎么回事?
看起来三星认为实际渲染窗口下方和右侧的较小区域是"屏幕高度"的一部分。
你知道我怎么能得到屏幕的实际显示高度的情况下,它从报告值关闭?
如果我使用layoutparams和align to bottom,它确实工作得很好,但我需要它与像素数据工作
为什么要硬编码尺寸呢?仅仅因为屏幕高度是1920x1080并不意味着你的应用程序实际上有那么多像素可用(除非你使用沉浸式全屏模式)。
你的按钮是什么类型的布局?如果它在FrameLayout
中,只需将按钮的layout_gravity设置为bottom|center_horizontal
。在Java中,它看起来像:
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) _button.getLayoutParams();
params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
_button.requestLayout();
RelativeLayout
?只使用layout_centerHorizontal
和layout_alignParentBottom
:
RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) _button.getLayoutParams();
params.addRule(RelativeLayout.CENTER_HORIZONTAL);
params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
_button.requestLayout();
编辑:看看你最近的编辑,你应该只使用父元素的实际尺寸来确定定位。您可以添加OnGlobalLayoutListener
到父布局,以确定其大小:
parent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
parent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int parentHeight = parent.getHeight();
// do your positioning
}
}
我的按钮高度没有调整其视图边界,因此有错误的高度。设置setAdjustViewBounds(true)
解决了这个问题。
它只"似乎"发生在一些手机上而不是其他手机上的原因是上下采样。如果资源的密度能够容纳按钮,那么它看起来就会很正常。但在三星3上(在这个特殊的例子中),可绘制资产的大小是136 x 136,而按钮无法将其调整到更小的大小。当我将adjustsBounds设置为true时,它可以将其缩小到合适的大小。