Android 动态设置padding跟margin的问题
2017-06-07 12:33
4651 查看
最近要做到动态设置padding跟margin,设置它们四个参数都是int类型。比如这里设置了10,,可是这个数又是代表什么意思呢?一直很好奇它们的单位问题,所以这就造成了,在不同手机上的适配问题。有些间距大了,有些小了,表示很困惑,下面就来分析一下问题。
一、使用方式:
1、padding:
2、margin:
例如上面要对tv进行设置的话,应该是这样:
二、单位问题:
1、padding:
我们可以定位到setPadding所在的View.class可以看到上面单位的描述,这里就看看paddingLeft,其他三个方向同理
2、margin:
其实跟padding差不多,不过就是setMargin是在ViewGroup.class中,但是不一样的是,setMargin是属于MarginLayoutParams.class内部类的。所以我们定位到这个内部类看下leftMargin,其他三个方向同理
三、处理适配:
如果我们直接在代码中设置两者的话,估计就是px单位了,说实话确实没错。不过去到其他分辨率的手机估计就变形了。这是为什么呢?你想想我们在布局中设置两者的时候是dip单位,在其他分辨率却没有问题,那你估计就发现了问题了。
是的,你想的没错。一般设置dip单位的话,是比较好适配的。
如果你不行的话,可以在布局中设置为px去不同分辨率手机试试看,完全变形。
px设置布局当初是我做项目的一个大坑。当我开发测试的时候很舒服,
没问题。可是到了项目快完成的时候,去了其他分辨率的试了下,变形了,内心千万个草泥马在奔腾。
说了这么多,就来说说怎么适配。其实很简单就是你在设置的时候dip转换为px.
setPadding(int
left, int top, int right, int bottom);这里我们就当成left要设置的dp2px(context,dpval),margin也是同样的意思,最好都是设置dp转px。
一、使用方式:
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。
相关文章推荐
- android 如何动态设置View的margin和padding
- android 如何动态设置View的margin和padding
- android 如何动态设置View的margin和padding
- Android动态设置控件大小以及设定margin以及padding值
- Android动态设置控件大小以及设定margin以及padding值
- 动态添加ImageView 设置setPadding不起作用问题
- 动态添加ImageView 设置setPadding不起作用问题
- Android之根布局动态加载子布局时边距设置无效问题
- Android程序中代码动态设置Textview文字的大小解决px转dp的问题
- Android兼容性问题 -- FrameLayout中View设置margin无效
- 解决Android开发中ViewPager动态设置PagerAdapter时第二次进入Fragment内容不显示的问题
- [Android疑难杂症]动态改变Background后Padding无效的问题
- 动态添加ImageView 设置setPadding不起作用问题
- android 在代码中动态设置字体颜色需要注意的问题
- 【Android】android:padding属性设置对ImageButton无效问题
- 关于android 动态设置view 样式 问题(默认style)
- Android疑难杂症 动态改变Background后Padding无效的问题
- [积累]GridView未设置margin、padding容器内出现空隙有关问题
- [Android疑难杂症]动态改变Background后Padding无效的问题
- Android AlertDialog动态添加组件和padding靠边问题