Android 通过代码改变控件的布局方式

在很多情况下当我们在xml中布局的方式并不能满足我们的要求,而这时我们就需要通过在代码中控制控件的布局
根据不同的条件来控制布局。首先来了解一下安卓中的一些单位

dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。需要注意的是:当我们在XML布局文件中定义的单位是dp时,而我们通过
代码在获取其宽高的时候。系统会返回给你的是xp,例如通过getWidth(),所获得的大小为px。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。由此,根据 google 的建议,TextView 的
字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。
在 Android 中, 1pt 大概等于 2.22sp以上供参考,如果 UI 能够以 sp 为单位提供设计是最好的,如果设计中没有 sp的概念,则开发人员也可以通过适当的换算取近似值。
过去,程序员通常以像素为单位设计计算机用户界面。例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素 等。这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。在有些情况下,用户界面可能会小到难以看清 内容。
与分辨率无关的度量单位可以解决这一问题。Android支持下列所有单位。
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
分辨率:整个屏是多少点,比如800x480,它是对于软件来说的显示单位,以px为单位的点。 density(密度)值表示每英寸有多少个显示点,与分辨率是两个概念。apk的资源包中,

当屏幕density=240时使用hdpi标签的资源 
当屏幕density=160时,使用mdpi标签的资源 
当屏幕density=120时,使用ldpi标签的资源。 
一般android设置长度和宽度多用dip,设置字体大小多用sp. 在屏幕密度为160,1dp=1px=1dip, 1pt = 160/72 sp 1pt = 1/72 英寸.当屏幕密度为240时,1dp=1dip=1.5px.

为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。当然,也可以考虑使用矢量图形,而不是用位图。 
以上出自:http://blog.csdn.net/ouyangtianhan/article/details/7245843

那了解安卓中的一些单位后,我们应该怎么保证布局能够按照我们的要求来变化呢?
通过以上的解释可以看出,要想完整的适配屏幕。那么就要了解各个单位的转换。上面已经说出,在XML布局文件中的适配单位用的是dp。而通过代码获得是px,这样我们就需要知道
这两个单位之间的换算方式。而想要知道这两个单位的换算,就需要知道另一个值。那就是--屏幕密度(density)

当屏幕density=240时使用hdpi标签的资源 当屏幕密度为240时,1dp=1dip=1.5px.
当屏幕density=160时,使用mdpi标签的资源 在屏幕密度为160,1dp=1px=1dip
当屏幕density=120时,使用ldpi标签的资源。

设置宽高为100dp,然后我们在代码中获取它的宽高看看

这时我们通过代码获取
那怎样获得屏幕的密度呢?
其实安卓中已经提供好了相应的方法来供我们获取
DisplayMetrics metric = new DisplayMetrics(); 
this.getWindowManager().getDefaultDisplay().getMetrics(metric); 
metric.densityDpi-------->获取的是当前屏幕的密度值
metric.density----------->获取屏幕转换的倍数,主要是XML中的dp单位对sp的转换倍数
Log.i("metric", ""+metric.densityDpi+" "+metric.density);

其中2.0就是dp转换为px的倍数,320则是屏幕的密度值

现在我们来对xml布局中的控件进行控制,在安卓中,安卓提供了getLayoutParams()方法来控制布局中子控件的大小。
也就是说,getLayoutParams()获得的是父布局。然后通过父布局来控制子控件。
在这里我的控件父布局是RelativeLayout,所以RelativeLayout.LayoutParams
如果使用错误的父布局,则会报错。说类型转换异常

时间: 2024-12-29 22:42:44

Android 通过代码改变控件的布局方式的相关文章

通过代码改变控件的布局

在安卓代码编写过程中,一般都是通过xml的形式来规划界面组件的布局,然后在对应的activity的子类中通过id找到相对应的控件.但出于何种各样的需要,我们需要通过代码来改变控件的位置,可以通过如下的两种方式来改变: 一. 通过view的layout(left,right,top,down)来改变的.可以用view的getLeft,getRight,getTop,getBotton方法来获取Left,Right,Top,Botton的值,然后加上算出的偏移  (event.getRawX())得

tkinter控件的布局方式

在tkinter中控件布局的方法主要有三种: (1)pack布局 (2)grid布局 (3)place布局 pack布局采用块的方式组织控件,pack(options,......),options参数可以选择:side.fill.padx/pady.anchor等.21-设置三个标签,使用pack方法布局. from tkinter import * win=Tk() label1=Label(win,text="擎天柱" ,bg="blue") label2=L

Android开发之基本控件和详解四种布局方式

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

Android Studio 入门——002 控件篇

最近看的书是第一行代码老师推荐--感觉讲的很基础,很对小白的胃口.好了不罗嗦别的了,干货. ------------------------------------------------------------------------------------------------------------ 控件篇 1.TextView这是一个再简单不过的控件---用来在页面上显示一些文本信息[这个控件必须声明的属性--宽.高.内容.id] 2.Button是程序用于和用户进行交互的一个重要控件

WPF 中动态改变控件模板

在某些项目中,可能需要动态的改变控件的模板,例如软件中可以选择不同的主题,在不同的主题下软件界面.控件的样式都会有所不同,这时即可通过改变控件模板的方式实现期望的功能. 基本方法是当用户点击切换主题按钮是加载新的资源字典,并使用新加载的资源字典替代当前的资源字典这时要用到ResourceManager. 假设现有两个不同的资源字典文件Dictionary1.xaml和Dictionary2.xaml存在于Themes文件夹内: 在MainPage中使用其中一个资源字典作为默认样式文件: <Win

Android 手机卫士--自定义组合控件构件布局结构

由于设置中心条目中的布局都很类似,所以可以考虑使用自定义组合控件来简化实现 本文地址:http://www.cnblogs.com/wuyudong/p/5909043.html,转载请注明源地址. 自定义组合控件 1.将已经编写好的布局文件,抽取到一个类中去做管理,下次还需要使用此布局结构的时候,直接使用组合控件对应的对象. 2.将组合控件的布局,抽取到单独的一个xml中 新建布局文件:setting_item_view.xml,将上篇文章中布局文件中的代码放进去 <?xml version=

android 动态改变控件位置和大小 .

动态改变控件位置的方法: setPadding()的方法更改布局位置. 如我要把Imageview下移200px: ImageView.setPadding( ImageView.getPaddingLeft(),  ImageView.getPaddingTop()+200, ImageView.getPaddingRight(),  ImageView.getPaddingBottom()); 动态改变控件大小的方法: 1.声明控件参数获取对象 LayoutParams lp: 2.获取控件

Android UI-自定义日历控件

Android UI-自定义日历控件 本篇博客笔者给大家分享一个日历控件,这里有个需求:要求显示当前月的日期,左右可以切换月份来查看日期. 我们想一想会如何去实现这样的一个控件,有开源的,但可能不太满足我们的特定的需求,这里笔者自定义了一个,读者可以根据自己的需求来修改代码.下面来说一下实现的思路: 首先我们要显示当前月份,自然我们要计算出当前的日期,并且把每一天对应到具体的星期,我们会有以下效果: 我们先想一下这样的效果用什么控件可以实现?很自然可以想到用网格视图GridView,但这里笔者使

Android常用酷炫控件(开源项目)github地址汇总

转载一个很牛逼的控件收集贴... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style 等等. 一.ListView android-pulltorefresh一个强大的拉动