【问题标题】:What units are applied when declaring a view programmatically?以编程方式声明视图时应用了哪些单位?
【发布时间】:2019-06-30 09:00:59
【问题描述】:

在 axml 文件中添加视图时,可以简单地指定视图属性的大小和单位,例如:

<TextView
    android:TextSize = "10sp"
    android:layout_marginTop = "10dp" />

正如this answer中所说,有特定用途的特定单位。

我的主要问题是,当以动态方式以编程方式(通过代码)应用尺寸时,尺寸应用的单位是什么?

例如,当像这样声明 TextSize 时:

TextView tv = new TextView();
tv.TextSize = 10;

文本大小的单位是什么? sp? DP?像素?

最重要的是,我该如何更改它们以满足我的需求?

【问题讨论】:

  • 你读过doc吗?此方法使用sp更改大小,您可以为特定单位使用其他重载。
  • @Pawel 这只是一个例子。其他属性呢?它是如何工作的?
  • 我认为大多数(尤其是布局参数)都将原始像素大小作为参数,但您应该始终查看文档。
  • @Pawel 所以我可能想更改它以便在其他设备上顺利运行程序,对吧?

标签: java c# android view pixel


【解决方案1】:

嗨@Daniel,如果你以编程方式生成如下代码的文本视图

TextView tv = new TextView();
tv.setTextSize(10); // Sets text in sp (Scaled Pixel).

如果你想用其他单位设置文本大小,那么你可以通过以下方式实现。

TextView tv = new TextView();
tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, 10); // Sets text in px (Pixel).
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10); // Sets text in dip (Device Independent Pixels).
tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10); // Sets text in sp (Scaled Pixel).
tv.setTextSize(TypedValue.COMPLEX_UNIT_PT, 10); // Sets text in pt (Points).
tv.setTextSize(TypedValue.COMPLEX_UNIT_IN, 10); // Sets text in in (inches).
tv.setTextSize(TypedValue.COMPLEX_UNIT_MM, 10); // Sets text in mm (millimeters).

默认情况下,Android 使用“sp”作为文本大小,使用“px”作为视图大小。

对于其他视图尺寸,我们可以设置为 px(像素),但如果您想自定义单位,您可以使用自定义方法

/**
     * Converts dip to px.
     *
     * @param context -  Context of calling class.
     * @param dip     - Value in dip to convert.
     * @return - Converted px value.
     */
    public static int convertDipToPixels(Context context, int dip) {
        if (context == null)
            return 0;
        Resources resources = context.getResources();
        float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dip, resources.getDisplayMetrics());
        return (int) px;
    }

通过上述方法,您可以将 YOUR_DESIRED_UNIT 转换为像素,然后设置为视图。你可以替换

TypedValue.COMPLEX_UNIT_DIP

根据您的用例使用上述单位。您也可以反之亦然,让 px 下降,但我们不能分配给自定义单位来查看,所以这就是我这样使用它的原因。

我希望我解释得很好。

【讨论】:

  • 谢谢,您确实做到了,但 TextSize 只是一个示例。它如何适用于其他 View 属性?设置单位的方法是针对java的,是吗?如何在 C# 中做到这一点?
  • 我根据您的评论编辑了我的问题,我不关心 C#。 :)
  • 为什么要将 dp 转换为 px?我认为不建议使用 px ,因为每个设备的比例都会变化。
  • 是的,您是对的,不建议在 android 中使用 px,而是以编程方式设置边距、填充、高度和宽度等属性,因此我们以像素为单位分配,因为没有内置方法可以转换为特定单位在运行时。因此,我们将所需的单位转换为像素并分配给它。请记住,我们只能在 XML 中分配单元,而不能在 JAVA 中。
【解决方案2】:

第一:

我认为您应该尽可能避免以编程方式设置大小。

第二:

像素 像素: 对应于屏幕上的实际像素。

dp 或 dip Density-independent Pixels-:一个基于屏幕物理密度的抽象单位。这些单位是相对于 160 dpi 屏幕的,因此 1 dp 是 160 dpi 屏幕上的一个像素

sp Scale-independent Pixels- :这就像 dp 单位,但它也被用户的字体大小偏好缩放

关于你的第三个问题,我认为:

例如:

对于编辑文本,您不应该像这样对宽度使用常量:

  <TextView
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:text="@string/banklist_firstselectbank"
        style="@style/TextAppearanceHeadline2"
        android:gravity="center"/>

我认为最好像这样使用边距开始和边距结束:

 <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:text="@string/banklist_firstselectbank"
        style="@style/TextAppearanceHeadline2"
        android:layout_marginEnd="50dp"
        android:layout_marginStart="50dp"
        android:gravity="center"
        />

并尽可能多地使用:重力等字段,而不是常数。

【讨论】:

  • 谢谢,但我没有问EditText的设置大小,但是如果已经在谈论它,当设置EditText视图的android:layout_width="match_parent"时,当用户超过时它会扩展边距?
  • 顺便说一句,我为什么要尽可能避免以编程方式设置大小?
  • 欢迎您,我认为这取决于设计师的想法,但是当我们使用 match_parent 时,它将与大多数设备兼容,而且我知道大多数公司使用 2 设计来兼容手机的 UI/UX和平板电脑
  • 关于你的第二个问题,我们必须尝试将 UI 任务与 java 类分开,以获得更大的凝聚力和更少的依赖。
  • 为什么?还有其他选择吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多