第一组UI组件:布局管理器(以ViewGroup为基类派生的布局管理器)
1.线性布局 LinearLayout类
16 11 16 21 26 31
效果图如下
如果将android:gravity="bottom|center_horizontal"改为android:gravity="right|center_vertical",效果图如下
2.表格布局 TableLayout(继承自LinearLayout,本质是线性布局管理器,采用行列形式管理UI组件)
单元格的三种行为方式Shrinkable/Stretchable/Collapsed见名知意分别为可收缩/可拉伸/被隐藏
下面是一个范例
15 6 12 13 18 19 38 3920 21 26 31 36 3744 49 67 6850 55 60 65 6673 78 10879 84 89 94 9596 101 107106
效果图如下,第一行不见了,具体原因我感觉是被蓝条遮住了,后期学到再进行修改。
3.帧布局 FrameLayout
帧布局容器为每个加入其中的组件创建一个空白的区域(称为一帧),每个子组件占据一帧,这些帧会根据gravity属性执行自动对齐
下面的例子示范了用法,上面的TextView遮住下面的TextView,后添加的遮住先添加的
14 5 13 21 29 37 45 53
效果图如下
如果在程序中启动一个线程来控制周期性地改变这6个TextView的背景色,可以实现乡村杀马特非主流霓虹灯效果,源码如下,具体效果自行脑补。。精神污染
1 public class FrameLayout extends AppCompatActivity { 2 private int currentColor = 0; 3 //定义一个颜色数组 4 final int[] colors = new int[]{ 5 R.color.color1, 6 R.color.color2, 7 R.color.color3, 8 R.color.color4, 9 R.color.color5,10 R.color.color611 };12 public final int[] names = new int[]{13 R.id.view01,14 R.id.view02,15 R.id.view03,16 R.id.view04,17 R.id.view05,18 R.id.view0619 };20 TextView[] views = new TextView[names.length];21 Handler handler = new Handler()22 {23 @Override24 public void handleMessage(Message msg) {25 //表明消息来自本程序所发送的26 if (msg.what == 0x123) {27 for (int i = 0; i < names.length; i++) {28 views[i].setBackgroundResource(colors[(i + currentColor) % names.length]);29 }30 currentColor++;31 }32 super.handleMessage(msg);33 }34 };35 /**36 * ATTENTION: This was auto-generated to implement the App Indexing API.37 * See https://g.co/AppIndexing/AndroidStudio for more information.38 */39 private GoogleApiClient client;40 41 @Override42 protected void onCreate(Bundle savedInstanceState) {43 super.onCreate(savedInstanceState);44 setContentView(R.layout.activity_frame_layout);45 for (int i = 0; i < names.length; i++) {46 views[i] = (TextView) findViewById(names[i]);47 }48 //定义一个线程周期性地改变currentColor变量值49 new Timer().schedule(new TimerTask() {50 @Override51 public void run() {52 //发送一条空消息通知系统改变6个TextView组件的背景色53 handler.sendEmptyMessage(0x123);54 }55 }, 0, 200);56 }57 }
4.相对布局
相对布局容器内子组件的位置总是相对兄弟组件/父容器来决定。下面是梅花布局的效果。。
15 6 12 13 20 21 28 29 36 37 44
5.网格布局 GridLayout(4.0版本后才能使用)
下面是一个计算器界面
首先在布局管理器中定义一个GridLayout,并在该GridLayout中依次定义文本框/按钮,该文本框/按钮各横跨4列。
18 9 22 23 28
然后再java代码中采用循环控制添加16个按钮
1 public class GridLayout_index extends AppCompatActivity { 2 GridLayout gridLayout; 3 //定义16个按钮的文本 4 String[] chars=new String[] 5 { 6 "7","8","9","/", 7 "4","5","6","*", 8 "1","2","3","-", 9 ".","0","=","+"10 };11 @Override12 protected void onCreate(Bundle savedInstanceState) {13 super.onCreate(savedInstanceState);14 setContentView(R.layout.activity_grid_layout_index);15 gridLayout=(GridLayout)findViewById(R.id.root);16 for(int i=0;i
效果图如下,我承认丑哭了
所以我改了参数,感觉以后这个地方得用一个全能的办法阿。。不然不同的手机不同的分辨率都歪掉了---
bn.setPadding(65,65,65,65);
新的效果图,依旧丑但是整齐了。。。
6.绝对布局
因为手机的屏幕大小/分辨率存在较大差异,绝对布局不是一个好思路,我就跳过了
下一篇是第二组UI组件:TextView及其子类(我看的是疯狂Android讲义,李刚老师的)