1. 程式人生 > >Android 動態設定padding跟margin的問題

Android 動態設定padding跟margin的問題

最近要做到動態設定padding跟margin,設定它們四個引數都是int型別。比如這裡設定了10,,可是這個數又是代表什麼意思呢?一直很好奇它們的單位問題,所以這就造成了,在不同手機上的適配問題。有些間距大了,有些小了,表示很困惑,下面就來分析一下問題。

一、使用方式:

1、padding:

view.setPadding(int left, int top, int right, int bottom);

2、margin:

LayoutParams lp = (LayoutParams) view.getLayoutParams();
lp.setMargins(int left, int top, int right, int bottom);
舉個例子:
 <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="例子文字" />
    </LinearLayout>
如果是margin的話,要注意view.getLayoutParams()是需要強制轉換的,個人覺得是要看view的父元素是什麼容器。

例如上面要對tv進行設定的話,應該是這樣:

LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tv.getLayoutParams();
lp.setMargins(int left, int top, int right, int bottom)
如果tv外面是RelativeLayout,那相應的(RelativeLayout.LayoutParams) tv.getLayoutParams();

二、單位問題:

1、padding:

我們可以定位到setPadding所在的View.class可以看到上面單位的描述,這裡就看看paddingLeft,其他三個方向同理

 /**
     * The left padding in pixels, that is the distance in pixels between the
     * left edge of this view and the left edge of its content.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "padding")
    protected int mPaddingLeft = 0;
看到原始碼中的註解pixels?這裡表示的就是單位為px

2、margin:

其實跟padding差不多,不過就是setMargin是在ViewGroup.class中,但是不一樣的是,setMargin是屬於MarginLayoutParams.class內部類的。所以我們定位到這個內部類看下leftMargin其他三個方向同理

/**
         * The left margin in pixels of the child. Margin values should be positive.
         * Call {@link ViewGroup#setLayoutParams(LayoutParams)} after reassigning a new value
         * to this field.
         */
        @ViewDebug.ExportedProperty(category = "layout")
        public int leftMargin;
看到原始碼中的註解pixels?這裡表示的也是單位為px

三、處理適配:

如果我們直接在程式碼中設定兩者的話,估計就是px單位了,說實話確實沒錯。不過去到其他解析度的手機估計就變形了。這是為什麼呢?你想想我們在佈局中設定兩者的時候是dip單位,在其他解析度卻沒有問題,那你估計就發現了問題了。

是的,你想的沒錯。一般設定dip單位的話,是比較好適配的。

如果你不行的話,可以在佈局中設定為px去不同解析度手機試試看,完全變形。

px設定佈局當初是我做專案的一個大坑。當我開發測試的時候很舒服, 沒問題。可是到了專案快完成的時候,去了其他解析度的試了下,變形了,內心千萬個草泥馬在奔騰。

說了這麼多,就來說說怎麼適配。其實很簡單就是你在設定的時候dip轉換為px.

/**
     * dp轉px
     *
     * @param context
     * @param dpVal
     * @return
     */
    public static int dp2px(Context context, float dpVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                dpVal, context.getResources().getDisplayMetrics());
    }
用法:

setPadding(int left, int top, int right, int bottom);這裡我們就當成left要設定的dp2px(context,dpval),margin也是同樣的意思,最好都是設定dp轉px。