在程序中声明视图时使用的单位是什么?

4

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

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

这个答案中所说,不同的用途有不同的单位。

我的主要问题是,当以编程方式动态地应用大小时,使用的单位是什么?

例如,当像这样声明TextSize:

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

文本大小使用哪些单位?sp?dp?px?

最重要的是,我如何更改它们以适应我的需求?


你读过这个文档了吗?这个方法使用sp来改变字体大小,你可以使用其他重载来指定单位。 - Pawel
@Pawel 这只是一个例子。其他属性怎么样?它是如何工作的? - Daniel Reyhanian
我认为大多数参数(特别是布局参数)都以原始像素大小作为参数,但您应该始终查看文档。 - Pawel
@Pawel,我可能需要进行更改以使程序在其他设备上平稳运行,对吗? - Daniel Reyhanian
2个回答

4

嗨,@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转换为dip,但是我们不能将自定义单位分配给视图,因此我这样使用它。我希望我解释得很清楚。

谢谢,你确实做到了,但TextSize只是一个例子。其他View属性如何工作?设置单位的方法是针对Java的,是吗?我该如何在C#中实现它? - Daniel Reyhanian
我根据您的评论编辑了我的问题,但是我不了解C#。:) - Arpit bandil
为什么我想要将dp转换为px?我认为不建议使用px,因为每个设备的比例会发生变化。 - Daniel Reyhanian
是的,你说得对,在Android中不推荐使用px,但是对于像边距、填充、高度和宽度这样的属性,如果需要在程序中进行设置,我们必须以像素为单位进行赋值,因为在运行时没有内置的方法可以将其转换为特定的单位。因此,我们将所需的单位转换为像素并分配给它。请记住,我们只能在XML中分配单位,而不能在JAVA中。 - Arpit bandil

2

首先:

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

其次:

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

dp 或 dip 密度无关像素:这是一种基于屏幕物理密度的抽象单位。这些单位相对于160dpi屏幕,因此在160dpi屏幕上,一个dp就是一个像素。

sp 缩放无关像素:这类似于dp单位,但它还受用户字体大小偏好的影响。

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

例如:

对于edittext,您不应该像这样使用常量来设置宽度:

"最初的回答"

  <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"/>

我认为最好这样使用margin-start和margin-end:

我认为这样使用margin-start和margin-end更好:

 <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"
        />

尽可能使用像重力等字段,而不是常数。

最初的回答


1
谢谢,但我并没有询问EditText的设置大小,只是如果已经在谈论它,当将EditText视图的android:layout_width="match_parent"设置为时,用户超出边距时它会扩展吗? - Daniel Reyhanian
1
顺便问一下,为什么我应该尽可能避免在程序中编程设置大小? - Daniel Reyhanian
不客气,我认为这取决于设计师的想法,但当我们使用match_parent时,它将兼容大多数设备,并且我知道在大多数公司中使用两种设计来兼容手机和平板电脑的UI/UX。 - milad salimi
关于你的第二个问题,我们必须尝试将UI任务与Java类分离,以实现更高的内聚性和更少的依赖性。 - milad salimi
为什么呢?有没有其他选择? - Daniel Reyhanian
有时候我们无路可走! - milad salimi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接