以编程方式声明视图时使用什么单位?

时间:2019-02-06 11:56:48

标签: java c# android view pixel

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

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

this answer中所述,有特定用途的特定单位。

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

例如,在声明这样的TextSize时:

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

应用于文本大小的单位是什么? sp? dp? px?

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

2 个答案:

答案 0 :(得分:3)

@Daniel,您好,如果您通过以下代码以编程方式生成textview

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浸入,但是我们无法分配给自定义单位进行查看,因此这就是我如此使用它的原因。

我希望我对此做了很好的解释。

答案 1 :(得分:2)

第一

我认为您应尽可能避免编程设置尺寸。

第二:

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

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

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:

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

并使用尽可能多的字段(例如:引力和其他字段)代替常数。