了解支持乘法屏幕

我知道有很多关于我的问题的信息千兆字节,我几乎读了所有 – 在developer.android.com上的官方文档,在XDA开发人员的post和这里,以及许多其他,但仍然有问题我希望你能向我解释。 所以我有一个主屏幕上的仪表板图标的应用程序,我需要使这个屏幕将在所有现有的屏幕上看起来是一样的, 这里是一个肖像和土地standarts

MAIN_PORTRAIT大陆

为了使我已经添加到我的项目下一个文件夹:

在这里输入图像说明

还有所有的尺寸,比如图片尺寸,文本尺寸和边距,我已经在dimens.xml中为每个屏幕分辨率设置了,我想这足以在不同的设备上看到相同的图片。 但我错了,在相同的分辨率,但不同的屏幕尺寸,它看起来不同。 这里是一个3.2“和5.1”屏幕与mdpi:

屏幕3.2“屏幕5.1“

我没有得到我应该添加像“ values-mdpi-sw320dp ”等文件夹或有另一种方式,我应该知道在所有屏幕上看到相同的图片? 这是一个正确的方法来设置尺寸的所有尺寸? 请给我解释一下。 问候。

Solutions Collecting From Web of "了解支持乘法屏幕"

你不需要指定所有这些不同的大小来实现一个简单的屏幕。 简单地玩一下布局。 例如,让我们把你的第一个屏幕。 你可以使用一个TableLayout,甚至是一个垂直LinearLayout和N个LinearLayout。 在这一点上,简单地使用重量! 例如:每行需要两行三格的图像:

<?xml version="1.0" encoding="utf-8"?> 

 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight=".33" /> <ImageView android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight=".33" /> <ImageView android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight=".33" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight=".33" /> <ImageView android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight=".33" /> <ImageView android:layout_width="0px" android:layout_height="wrap_content" android:layout_weight=".33" /> </LinearLayout> 

不幸的是,这还不够。 你可能想要完成的另一件事是仍然有你的图像有一个方形的比例。 为了达到这个目的,简单地扩展一下图像视图

 public class SquaredImageView extends ImageView { public SquaredImageView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ int width = MeasureSpec.getSize(widthMeasureSpec); int height = width; setMeasuredDimension(width, height); } 

}

现在只需提供正确密度的图像,一切都将完全按照您的要求

我觉得这个话题也是很麻烦的。 正如你所说的,你应该在应用程序中使用values-sw320dp-hdpivalues-sw320dp-xhdpivalues-sw320dp-xxhdpi等等。

我最近在一个正在处理的应用程序上做了同样的工作,我发现Galaxy S2读取values-sw320dp-hdpiGalaxy S4使用values-sw320dp-xxhdpiGalaxy Notevalues-sw320dp-xhdpi 。 所以是的,宣称这些事情是必要的。

如果你愿意的话,你可以把它称为快速阅读。 而这个应用程序是非常有用的,因为它揭示了大多数设备保存完好的秘密。

  1. 最小宽度限定符仅适用于Android 3.2及更高版本,如果您的5.1“屏幕运行的是早于3.2版本的操作系统版本,则它将不匹配正确的布局。

  2. 如果android版本都是> = 3.2,则layout_sw600dp或layout_sw720dp的布局文件不是“真正”优化的。 从你提供的屏幕截图中,一些UI元素的布局大小没有被优化。

首先,根本就不重要你的屏幕尺寸。 你必须找出你的屏幕密度,例如我的索尼Xperia Z的240 + dpi。之后,你可以将它们匹配到由Android定义的壁橱桶,例如240dpi – hdpi。

在你的情况下,桶是mdpi。 drawable-mdpi只有一组drawable将适用于你的两个设备。

你所看到的是正确的行为。 您可能需要重新布局您的东西,以适应更大的屏幕,例如有5行而不是3。或者,您可以绘制更大的帧(每个图标160dp,而不是100dp;您需要使用DisplayMetrics并做一些计算),并使用更高分辨率的图像,以适应这些帧(这些图像需要在同一个文件夹drawable-mdpi但!)

在您的res /中创build布局文件夹,并将它们命名为layout,layout-large。 现在他们应该为不同的屏幕尺寸工作

如果加权不够,可以考虑在代码中dynamic设置维度。 你可以通过这个获得当前的屏幕对angular线:

  Display display = ((WindowManager) c.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); display.getMetrics(displayMetrics); screenRect = new Rect(0, 0, width, height); screenDiagonal = Math.sqrt(width * width + height * height) / displayMetrics.densityDpi; 

然后,您可以为您的视图dynamic创buildLayoutParams ,并根据此值应用大小。 我知道这是一个有点哈克和权重的方法是更原生的,但这可能会为你工作。