【问题标题】:Understanding a support multiply screens了解支持多屏
【发布时间】:2013-12-17 02:46:29
【问题描述】:

我知道关于我的问题有很多千兆字节的信息,我几乎已经阅读了所有信息 - developer.android.com 上的官方文档,XDA-Developers 和此处的帖子,以及许多其他但仍然有有问题,我希望你能向我解释。所以我有一个主屏幕上有仪表板图标的应用程序,我需要让这个屏幕在所有现有屏幕上看起来都一样,这是一个纵向和陆地标准:: p>

为此,我已将下一个文件夹添加到我的项目中:

以及我在 dimens.xml 中为每个屏幕分辨率设置的所有尺寸,例如图像大小、文本大小和边距,我认为这足以在不同设备上看到相同的图片。但我错了,在相同的分辨率下,不同的屏幕尺寸看起来会有所不同。这是带有 mdpi 的 3.2" 和 5.1" 屏幕:

我不知道应该添加诸如“values-mdpi-sw320dp”之类的文件夹,还是我应该知道其他方法可以在所有屏幕上看到相同的图片?以尺寸设置所有尺寸是否正确?请给我解释一下。问候。

【问题讨论】:

  • @KanwaljitSingh 我已经在该链接中阅读了您的答案,看来您不明白我的要求。是的,您使用“设备分辨率”尺寸是完全正确的,但是如果您获得具有相同屏幕分辨率但屏幕尺寸不同的设备,您会怎么做?这很复杂,因为我对所有尺寸(图像、按钮等)都使用了尺寸。
  • @KanwaljitSingh 对我来说仍然有用,因为我不想创建很多布局,例如 layout-hdpi-sw320dp layout-hdpi-sw480dp 等,我认为更好的方式使用一个布局但不同它的维度。似乎 stackOverflow 上没有人知道如何正确地支持多屏。

标签: android android-screen-support multiplication


【解决方案1】:

您无需指定所有这些不同的尺寸即可实现如此简单的屏幕。 简单地玩一下布局。 例如,让我们以您的第一个屏幕为例。您可以使用 TableLayout 甚至是内部带有 N LinearLayout 的垂直 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);

}

}

现在只需提供正确密度的图像,一切都会完全符合您的要求

【讨论】:

  • 感谢您的回答,但在 3.2" 和 5.1" mdpi 屏幕中的不同屏幕图片仍然存在问题,导致图标(来自 drawable-mdpi)对于 5.1" 来说太小了,当我增加时它的尺寸看起来非常糟糕和丑陋(在屏幕上可以看到很多像素)
  • 对于这个问题,你可以使用不同的drawables(这里是不同文件夹真正有帮助的地方)只需将一个更大的mdpi图像放入一个名为drawables-swXXdp-mdpi的文件夹中,用dp中最小尺寸的XX替换应该使用该drawable的地方
【解决方案2】:

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

我最近在我正在处理的应用程序上做了同样的事情,我发现Galaxy S2 读取了values-sw320dp-hdpiGalaxy S4 读取了values-sw320dp-xxhdpiGalaxy Note 读取了values-sw320dp-xhdpi。所以是的,声明这些东西是必要的。

如果您愿意,可以参考this 作为快速阅读。 this 应用程序真的很有帮助,因为它揭示了大多数设备保存完好的秘密。

【讨论】:

  • 感谢您的回答,但有没有办法避免创建大量“克隆文件夹”,我错过了什么?
  • 这太糟糕了,不管它是什么都得到 +1 的回答。
【解决方案3】:
  1. 最小宽度限定符仅适用于 Android 3.2 及更高版本,如果您的 5.1" 屏幕运行 3.2 之前的操作系统版本,它将与正确的布局不匹配。

  2. 如果两个 android 版本都 >= 3.2,则 layout_sw600dp 或 layout_sw720dp 的布局文件不是“真正”为它优化的。从您提供的屏幕截图来看,某些 ui 元素的布局大小未正确优化。

【讨论】:

    【解决方案4】:

    首先,您的屏幕尺寸(以英寸为单位)并不重要。你必须弄清楚你的屏幕密度,例如我的 Sony Xperia Z 为 240+dpi。之后,您可以将它们与 Android 定义的壁橱桶匹配,例如240dpi - hdpi。

    在您的情况下,存储桶是 mdpi。 drawable-mdpi 中只有一组可绘制对象将适用于您的两个设备。

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

    【讨论】:

    • 谢谢,但问题是图标在 3.2" mdpi 中看起来不错,但对于 5.1" mdpi 来说太小了,当我尝试增加它的大小时,它看起来非常糟糕和丑陋(我见过很多像素)。
    • 好的,如果它们都是 mdpi,从您的屏幕截图和 3.2" 和 5.1" 之间的巨大差异来看,我可以得出结论,两个设备的宽度和高度非常不同,例如一个宽度为 300dp,另一个宽度为 500dp。所以,你真的必须在这里精确计算宽度和高度,例如icon width = screen width/3 3.2" 设备为 100dp,5.1" 设备为 160dp。请记住使用尽可能高分辨率的图像
    • 请告诉我我的理解是否正确 - 我应该使用一个带有尽可能高分辨率图像的“drawable”文件夹,而不是许多可绘制 dpi 文件夹,对吗?
    • 1st,只有一组drawable (mdpi) 将适用于您的案例!第二,根据这些计算,我说的是您放置图像的框架/框
    【解决方案5】:

    在您的 res/ 中创建布局文件夹,并将它们命名为 layout、layout-large。现在它们应该适用于不同的屏幕尺寸

    【讨论】:

    • 伙计,我已经创建了这个文件夹,但它对我来说没用,因为我的所有布局项目的尺寸都是尺寸(values-xxxdpi->dimens.xml)
    【解决方案6】:

    如果权重对您来说还不够,请考虑在代码中动态设置维度。您可以通过以下方式获取当前屏幕对角线:

        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;
    

    然后您可以为您的视图动态创建LayoutParams 并根据此值应用大小。我知道这有点 hacky,而且权重方法更本地化,但这可能对你有用。

    【讨论】:

    • 谢谢,但我认为您的解决方案非常困难,但您的回答我应该将此代码添加到我所有的仪表板活动中,我认为这会过度和混乱。
    • 没问题。顺便说一句,您可以计算一次并存储在某个单例类中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多