1. 说明
Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建筑里的砖瓦。组件按照布局的要求依次排列,就组成了用户所看见的界面。Android的五大布局分别是LinearLayout(线性布局)、FrameLayout(单帧布局)、RelativeLayout(相对布局)、AbsoluteLayout(绝对布局)和TableLayout(表格布局)。
LinearLayout按照垂直或者水平的顺序依次排列子元素,每一个子元素都位于前一个元素之后。如果是垂直排列,那么将是一个N行单列的结构,每一行只会有一个元素,而不论这个元素的宽度为多少;如果是水平排列,那么将是一个单行N列的结构。如果搭建两行两列的结构,通常的方式是先垂直排列两个元素,每一个元素里再包含一个LinearLayout进行水平排列。
2. android:paddingpadding是站在父view的角度描述问题,它规定它里面的内容(文字或组件)必须与这个父view边界的距离。
例如:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:paddingLeft="10dip" android:paddingTop="10dip" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="10dip" android:background="#FF0000" android:paddingBottom="50dip" android:paddingLeft="50dip" android:paddingRight="50dip" android:paddingTop="50dip" android:text="@string/app_name" /> </LinearLayout>
3. android:layout_margin
margin则是站在自己的角度描述问题,规定自己和其他(上下左右)的view之间的距离,如果同一级只有一个view,那么它的效果基本上就和padding一样了。
例子:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:paddingLeft="10dip" android:paddingTop="10dip" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#FF0000" android:paddingBottom="50dip" android:paddingLeft="50dip" android:paddingRight="50dip" android:paddingTop="50dip" android:text="@string/app_name" android:layout_marginBottom="20dip" android:layout_marginTop="20dip"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="#FF0000" android:paddingBottom="50dip" android:paddingRight="50dip" android:paddingTop="50dip" android:text="@string/app_name" /> </LinearLayout>
4. android:layout_gravity和android:gravity区别
点击打开链接
5. LinearLayout中的layout_weight属性FrameLayout是五大布局中最简单的一个布局,在这个布局中,整个界面被当成一块空白备用区域,所有的子元素都不能被指定放置的位置,它们统统放于这块区域的左上角,并且后面的子元素直接覆盖在前面的子元素之上,将前面的子元素部分和全部遮挡。显示效果如下,第一个TextView被第二个TextView完全遮挡,第三个TextView遮挡了第二个TextView的部分位置。
例子:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ff000000" android:gravity="center" android:text="1" /> <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ff654321" android:gravity="center" android:text="2" /> <TextView android:layout_width="50dp" android:layout_height="50dp" android:background="#fffedcba" android:gravity="center" android:text="3" /> </FrameLayout>
由于智能电视并不像手机那样支持手势划屏,所以在电视上展示多屏数据时,需要提示用户翻页还有更多内容。
一般使用较多的方法就是箭头提示,比如:
还有一种更好的做法就是将下一页的部分展现出来,直观提示用户还有更多的页面。这种展现方式结合metro风格,被越来越广泛的盒子和电视厂商采用,例如小米,乐视等。
下面我们就将动手实现一个类似风格的demo,省去若干查询资料,附代码。
在代码中,实现了一个显示部分周边子页面的viewpager ,这个控件可以独立使用。在使用的时候需要注意的是:设置viewpager的宽度。
这个宽度需要根据屏幕的宽度来计算,比如屏幕宽度1080像素,那么viewpager的宽度设置为960,那么viewpager的每个周边就可以露出60像素的宽度。
效果的实现重点在于viewgroup的setClipChildren(false),表示是否限制子View在其范围内,在animations动画以及本文的情况下可以发挥很大的作用,默认为true。
注意:setClipChildren(false)在3.0以上版本中,开启了硬件加速后将不能正常工作,所以需要将其设置为软件加速。
设置软硬件加速使用 setLayerType(View.LAYER_TYPE_SOFTWARE, null); 为了能够在2.2系统中使用,我们使用反射完成该函数的调用,如下:
try { Method setLayerTypeMethod = this.getClass().getMethod("setLayerType" , new Class[] {int.class , Paint.class}); setLayerTypeMethod.invoke( this, new Object[] {LAYER_TYPE_SOFTWARE , null}); } catch (NoSuchMethodException e) { // Older OS, no HW acceleration anyway } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); }
最终效果图,demo中为图片!
附demo下载地址:点我下载
参考资料:
http://commonsware.com/blog/2012/08/20/multiple-view-viewpager-options.html
https://gist.github.com/devunwired/8cbe094bb7a783e37ad1
http://www.trinea.cn/android/viewpager%E5%AE%9E%E7%8E%B0%E7%94%BB%E5%BB%8A%E4%B8%80%E5
%B1%8F%E5%A4%9A%E4%B8%AAfragment%E6%95%88%E6%9E%9C/
原文链接:http://www.67tgb.com/?p=623
转载注明:望月听涛