Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1501059
  • 博文数量: 218
  • 博客积分: 6394
  • 博客等级: 准将
  • 技术积分: 2563
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-08 15:33
个人简介

持之以恒

文章分类

全部博文(218)

文章存档

2013年(8)

2012年(2)

2011年(21)

2010年(55)

2009年(116)

2008年(16)

分类: 嵌入式

2012-12-08 12:54:20


Android Layout
Android对用五大布局对象,它们分别是FrameLayout(框架布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局),TableLayout(表格布局).
(1) FrameLayout 是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。
(2)LinearLayout 以你为它设置的垂直或水平的属性值,来排列所有的子元素。所有的子元素都被堆放在其它元素之后,因此一个垂直列表的每一行只会有一个元素(或者是一个组合元素(一个水平的LinearLayout)),而不管他们有多宽,而一个水平列表将会只有一个行高(高度为最高子元素的高度加上边框高度)。LinearLayout保持子元素之间的间隔以及互相对齐(相对一个元素的右对齐、中间对齐或者左对齐)。 
LinearLayout还支持为单独的子元素指定weight 。好处就是允许子元素可以填充屏幕上的剩余空间。这也避免了在一个大屏幕中,一串小对象挤成一堆的情况,而是允许他们放大填充空白。子元素指定一个 weight 值,剩余的空间就会按这些子元素指定的weight 比例分配给这些子元素。默认的 weight 值为0。例如,如果有三个文本框,其中两个指定了weight 值为1,那么,这两个文本框将等比例地放大,并填满剩余的空间,而第三个文本框不会放大
(3)
RelativeLayout 允许子元素指定他们相对于其它元素或父元素的位置(通过ID 指定)。因此,你可以以右对齐,或上下,或置于屏幕中央的形式来排列两个元素。元素按顺序排列,因此如果第一个元素在屏幕的中央,那么相对于这个元素的其它元素将以屏幕中央的相对位置来排列。如果使用XML 来指定这个 layout ,在你定义它之前,被关联的元素必须定义。
(4)
TableLayout 将子元素的位置分配到行或列中。一个TableLayout 由许多的TableRow 组成,每个TableRow 都会定义一个 row (事实上,你可以定义其它的子对象,这在下面会解释到)。TableLayout 容器不会显示row 、cloumns 或cell 的边框线。每个 row 拥有0个或多个的cell ;每个cell 拥有一个View 对象。表格由列和行组成许多的单元格。表格允许单元格为空。单元格不能跨列,这与HTML 中的不一样。
(5)AbsoluteLayout 可以让子元素指定准确的x/y坐标值,并显示在屏幕上。(0, 0)为左上角,当向下或向右移动时,坐标值将变大。AbsoluteLayout 没有页边框,允许元素之间互相重叠(尽管不推荐)。我们通常不推荐使用 AbsoluteLayout ,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至于在不同的设备上可能不能很好地工作。

4种Layout:FrameLayout,LinearLayout,TableLayout,RelativeLayout。

放入Layout中进行排布的View的XML属性:
4种Layout中Item所共有的XML属性:
(1)layout_width
(2)layout_height
(3)layout_marginLeft
(4)layout_marginTop
(5)layout_marginRight
(6)layout_marginBottom
(7)layout_gravity

FrameLayout中的Item就具有这些属性。
对于LinearLayout还会有
(8)layout_weight

TableLayout的行TableRow是一个横向的(horizontal)的LinearLayout。

RelativeLayout有16个align相关的XML属性。
(9)layout_above
(10)layout_alignBaseline
(11)layout_alignBottom
(12)layout_alignLeft
(13)layout_alignParentBottom
(14)layout_alignParentLeft
(15)layout_alignParentRight
(16)layout_alignParentTop
(17)layout_alignRight
(18)layout_alignTop
(19)layout_below
(20)layout_centerHorizontal
(21)layout_centerInParent
(22)layout_centerVertical
(23)layout_toLeftOf
(24)layout_toRightOf

(1)和(2)用来确定放入Layout中的View的宽度和高度:它们的可能取值为fill_parent,wrap_content或者固定的像素值。
(3)(4)(5)(6)是放入Layout中的View期望它能够和Layout的边界或者其他View之间能够相距一段距离。
(7)用来确定View在Layout中的停靠位置。
(8)用于在LinearLayout中把所有子View排布之后的剩余空间按照它们的layout_weight分配给各个拥有这个属性的View。
(9)到(24)用来确定RelativeLayout中的View相对于Layout或者Layout中的其他View的位置。

 注意:

android:layout_marginLeft指该控件距离边父控件的边距,android:paddingLeft指该控件内部内容,如文本距离该控件的边距

如:

当按钮分别设置以上两个属性时,得到的效果是不一样的。

android:paddingLeft="30px":

按钮上设置的内容(例如图片)离按钮左边边界30个像素。

android:layout_marginLeft="30px"

整个按钮离左边设置的内容30个像素

这二个属性是相对的,假设B是A的子控件,设置B的margin和设置A的padding能达到相同的效果。

DPI

术语

说明

备注

Screen size(屏幕尺寸)

指的是手机实际的物理尺寸,比如常用的2.8英寸,3.2英寸,3.5英寸,3.7英寸
1英寸=0.0254米

摩托罗拉milestone手机是3.7英寸

Aspect Ratio(宽高比率)

指的是实际的物理尺寸宽高比率,分为longnolong

Milestone169,属于long

Resolution(分辨率)

和电脑的分辨率概念一样,指手机屏幕纵、横方向像素个数 通过settings->开发人员选项-->指针位置 查看

Milestone854*480

DPI(dot per inch)
density

每英寸像素数,如120dpi,160dpi,假设QVGA(320*240)分辨率的屏幕物理尺寸是(2英寸*1.5英寸),dpi=160

可以反映屏幕的清晰度,用于缩放UI

Density(密度)

屏幕里像素值浓度,resolution/Screen size可以反映出手机密度,

 

Density-independent pixel (dip) layout文件中使用

指的是逻辑密度计算单位,dip和具体像素值的对应公式是dip/pixel=dpi/160,也就是px = dp * (dpi / 160)

 


当屏幕density=240时使用hdpi标签的资源;

当屏幕density=160时,使用mdpi标签的资源 ;

当屏幕density=120时,使用ldpi标签的资源

根据google的推荐,像素统一使用dip,字体统一使用sp
比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。

View 和View Group
(1)View 和View Group之间的关系
      ViewGroup继承自View,ViewGroup中包含多个View,Layout继承自ViewGroup
     两种获得View的方式
(1) 一种是Layout中声明,然后通过setContentView(int) 创建,通过findViewById(获得
(2)一种是通过Inflate

点击(此处)折叠或打开

  1. View view;
  2. LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  3. view = inflater.inflate(R.layout.mylayout, null);
  4. RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);
LayoutParams继承于Android.View.ViewGroup.LayoutParams.
  LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉Layout用户期望的布局方式,也就是将一个认可的layoutParams传递进去。

点击(此处)折叠或打开

  1. container = (RelativeLayout) findViewById(R.id.lay_container);
  2. myview = new MyView(this);

  3. RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutPparams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
  4. myview.setLayoutParams(params);
  5. container.addView(myview);

     通过ViewGroup.addView() 的方式将View 加入到ViewGroup,通过重写onMeasure() 确定子控件的大小(参考layout.xml 中的属性和父控件要求的measurespec),最后通过setMeasuredDimension(int, int) 进行设定,通过重写ViewGroup的onLayout() 确定子View在ViewGroup中的位置

自定义View 重写onDraw() 方法,在XML 中做如下声明:

点击(此处)折叠或打开

  1. <LinearLayout>
  2. <packageName.myView android:id="@+id/myView" />
  3. </LinearLayout>
  4. (MyView) myView = (MyView) findViewById(R.id.myView);

ListView Adapter data

在layout中使用
Android 性能优化
ListView/ConvertView/ViewHolder
异步线程加载数据,刷新UI
FPS
内存泄漏
生命周期短的引用指向周期长的引用Activity-->static 变量
cursor没有close
bitmap没有recyle
对象不用的时候,引用没有设置为null
listener没有unregister()
View切换和动画
ViewPager/ViewFlow/ViewSwitcher
Android 事件处理
HTTP/TCP/UDP

TraceView
Android Test Case Monkey
NDK JNI
android mk文件

阅读(1926) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~