Android 设置Padding和Margin(动态/静态)

Posted &岁月不待人&

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 设置Padding和Margin(动态/静态)相关的知识,希望对你有一定的参考价值。

一、什么是padding,什么是margin?

android界面开发时,为了布局更加合理好看,很多时候会用上Padding和Margin,

padding和margin是什么呢?即内边距和外边距;

某个View指定为padding是针对该View里面的子View距离该View距离而言的,或者是里面的内容距离容器的距离。

某个View指定为margin是针对该View本身距离别人或者父View而言的。

例如下图,输入框里面的文字内容,如果不设置内边距,那么就会紧挨左上角,这样看起来,就很不友好,合理的设置padding看起来会舒服很多。

如果,不设置外边距,会充满整个父布局,也不好看,这时候就需要margin属性(外边距)。

 类似于控件的基础属性,并且不会变化的,我们一般会直接在xml文件里直接设置,这是上图的布局代码

<androidx.appcompat.widget.AppCompatEditText
                android:id="@+id/chat_input_edit"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginStart="10dp"
                android:layout_marginTop="10dp"
                android:layout_marginEnd="10dp"
                android:layout_marginBottom="10dp"
                android:paddingHorizontal="12dp"
                android:paddingVertical="10dp"
                android:textColor="@color/white"
                android:textColorHint="#94ffffff"
                android:textSize="14sp" />

 二、动态设置边距

那么怎么动态设置padding和margin呢?其实也很简单。

1.设置padding

view.setPadding(int left, int top, int right, int bottom)//view为你要设置的控件

例子:在我点击搜索框后,搜索框获取焦点,准备输入内容的时候,图标消失,文本内边距修改,实现代码如下

editText.setOnFocusChangeListener  view, b ->
            if (b) //使用dp2px方法进行屏幕适配
                view.setPadding(DPUtils.dp2px(12f),DPUtils.dp2px(6f),DPUtils.dp2px(12f),DPUtils.dp2px(6f))
                searchIcon.visibility = View.GONE
            
        

实现效果:最开始文本里左边内边距32dp,点击后变成12dp

//这是dp转为px的方法
private fun dp2px(i: Int): Int 
    return (Resources.getSystem().displayMetrics.density * i + 0.5f).toInt() 

为什么会有dp2px这个方法来转一下呢?

android中px与sp,dp之间的转换_跑快点的博客-CSDN博客_android px sp由于Android手机厂商很多,导致了不同设备屏幕大小和分辨率都不一样,然而我们开发者要保持在不同设备上显示同样的视觉效果,就需要做一些适配效果。 相关名词解释 屏幕大小:通常指的是屏幕对角线的长度,使用“寸”为单位来衡量。 分辨率:指手机屏幕的像素点个数,例如:720*1280,指的是宽有720个像素点,高有1280个像素点。 dpi:指的是每英寸像素,是由对角线上的像素点数除以屏幕大小所https://blog.csdn.net/qidingquan/article/details/53714603?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-4-53714603-blog-91974773.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-4-53714603-blog-91974773.pc_relevant_default&utm_relevant_index=92.动态设置margin

android的view中有setPadding,但是没有直接的setMargin方法。如果要在代码中设置该怎么做呢?可以通过设置view里面的 LayoutParams 设置,而这个LayoutParams是根据该view在不同的GroupView而不同的。这儿用的是RelativeLayout是因为在他的父布局是RelativeLayout哦,用成其他的会报错哦~~

val lp = RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT)
lp.setMargins(0, 0, DPUtils.dp2px(7f), DPUtils.dp2px(7f))
//RelativeLayout可以通过LayoutParams的addRule来添加约束,其他的布局也有类似的一些方法
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM)
lp.addRule(RelativeLayout.ALIGN_PARENT_END)
textView.layoutParams = lp

Android之android:padding和android:layout_margin的区别

android:padding和android:layout_margin

技术图片

android:layout_margin就是设置view的上下左右边框的额外空间

android:padding是设置内容相对view的边框的距离

在LinearLayout、RelativeLayout、TableLayout中,这2个属性都是设置都是有效的

在FrameLayout中,android:layout_margin是无效的,因为FrameLayout里面的元素都是从左上角开始绘制的

在AbsoluteLayout中,没有android:layout_margin属性


技术图片

padding是站在父view的角度描述问题 [ ?p?d?? ]

它规定它里面的内容必须与这个父view边界的距离。

margin则是站在自己的角度描述问题 [?mɑ:d??n]

规定自己和其他(上下左右)的view 大专栏  Android之android:padding和android:layout_margin的区别之间的距离,如果同一级只有一个view,那么它的效果基本上就和padding一样了

gravity

属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.该属性就干了这个.

layout_gravity

是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左, 靠右等位置就可以通过该属性设置.

这样就解释了,有什么我们弄个最外布局,然后里面包了几个布局,如果要使这几个布局都靠底

就可以在最外布局的属性里设置gravity=”botton” 因为gravity是对里面的内容起作用.





以上是关于Android 设置Padding和Margin(动态/静态)的主要内容,如果未能解决你的问题,请参考以下文章

android:padding和android:margin的区别

android:drawableLeft margin 和/或 padding

Android 动态设置padding跟margin的问题

Android 通过配置,设置margin-Left和margin-Top相对的距离

Android TextView 文字周边的空白部分是多少

android布局中怎么设置外边距