为什么横向 UI 绘制正确而纵向绘制错误,而这两个选项都是基于几行 java 代码自动绘制的(两种模式相同)?
这是 IDE 的屏幕预览
这是预览信息
这是自动调整 UI 元素大小的代码
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
//размеры выбранной версии превью, на основе которого я собрал нужный UI для программы
int testedWidth = 1200;
int testedHeight = 1920;
//получаем размер экрана устройства/дисплея
metrics = Resources.getSystem().getDisplayMetrics();
displayWidth = metrics.widthPixels;
displayHeight = metrics.heightPixels;
widthMultiplier = ((double) displayWidth) / ((double) testedWidth);
heightMultiplier = ((double) displayHeight) / ((double) testedHeight);
...
for (TextView textView : textViews) {
viewWidth = textView.getWidth();
viewHeight = textView.getHeight();
RelativeLayout.LayoutParams lp = copyLp((RelativeLayout.LayoutParams) textView.getLayoutParams());
lp.width = (int) (viewWidth * widthMultiplier);
lp.height = (int) (viewHeight * heightMultiplier);
// Setting the parameters on the TextView
textView.setLayoutParams(lp);
}
...
这是设备的结果(我做了一个屏幕截图)
景观
肖像
问题的本质:如果结果正确,在纵向时,ViewGroup 的宽度(包含循环形式的元素)应该等于设备屏幕的宽度,即 ViewGroup 的左侧应该触摸屏幕的左侧,以及 ViewGroup 的右侧 - 到右侧屏幕。但结果如你所见,LSES-LSV之间和ESEU-PSV之间有空位,说明ViewGroup的宽度不等于设备的宽度。
澄清:LSEU是“设备屏幕的左侧”,LSV是“视图组的左侧”,PSEU-PSV分别是“设备屏幕的右侧”-“视图的右侧”。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/pokemon_background"
tools:context=".MainActivity">
<RelativeLayout
android:id="@+id/relative_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true">
<TextView
android:id="@+id/tv1"
android:layout_width="@dimen/tvWidthSmallBoard"
android:layout_height="@dimen/tvHeightSmallBoard"
android:background="@drawable/search_icon_for_searchboard_cell"
android:gravity="center"
android:text="@string/click_me"
android:textColor="@android:color/black"
android:visibility="visible" />
...
</RelativeLayout>
...
</RelativeLayout>
拉伸不正确。理论上,它应该被拉伸,使得给定 ViewGroup 的宽度与 displayWidth 的大小(运行程序的设备的宽度)一致。
正如你从上面的代码中知道的
int testedWidth = 1200;
int testedHeight = 1920;
以及程序为设备屏幕找到的屏幕尺寸
宽度=1080 高度=2131
奇怪的是,横向 - 没有问题,宽度按预期拉伸,但出于某种原因,纵向,而不是充分拉伸,程序决定在右侧绘制小的所有循环,但是为什么会发生这种情况,如果包含循环的 ViewGroup 没有硬边框,但是 wrap_content 很重要吗?
我自己找不到这种情况的合乎逻辑的解释。
添加。信息:
xml中的size值不是传给“dp”而是传给“px”的。为什么?这是因为减少了尺寸测量和计算过程中的麻烦。我最近做了一个带有“dp”值的程序,问题的数量让我很生气,我不得不切换到“px”。对于动态调整 UI 元素的大小,这绝对是正确的解决方案,所以请不要建议去“dp”。
这是复制粘贴dimens.xml(只有必要的行):
<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<dimen name="tvWidthSmallBoard">400px</dimen>
<dimen name="tvHeightSmallBoard">200px</dimen>
...
</resources>
好东西我记起来了。忘记指定这个方法了,程序中使用的
private RelativeLayout.LayoutParams copyLp(RelativeLayout.LayoutParams source){
return new RelativeLayout.LayoutParams(source);
}


















