前面大概了解了两个常用的布局,线性布局和相对布局,接下来看看其他布局
一、TableLayout
TableLayout继承LinearLayout,其有个特殊的子节点TableRow,这个TableRow相当于一个orientation属性值为horizontal的LinearLayout,然后添加多个TableRow排成多行,形成一个类似表格的界面。
TableLayout常用的属性:
android:shrinkColumns 设置允许被收缩的列的序列号
android:stretchColumns设置允许被拉伸的列的序列号
android:collapseColumns设置需要被隐藏的序列号
序列号指TableRow里的子组件的从左至右的顺序,并且从0开始,选择多个序列号时可以用逗号隔开
基本使用:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:stretchColumns="1,2"
android:collapseColumns="0"
tools:context="com.example.yougel.otherlayoutdemo.TableLayoutActivity">
<TableRow>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮一"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮二"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮三"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮四"
/>
</TableRow>
<TableRow>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮五"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮六"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮七"
/>
</TableRow>
<TableRow>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮八"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮九"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="按钮十"
/>
</TableRow>
</TableLayout>
二、FrameLayout
FrameLayout(帧布局)也有的叫层布局,层布局的概念布局好理解,所以我就用层的概念来总结一下FrameLayout
我们从手机来看的FrameLayout:
其实它是层层布局的,从3D角度看:
(当然楼主画工差就不过多自槽)
基本使用:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.yougel.otherlayoutdemo.FrameLayoutActivity">
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color1"
android:width="320dp"
android:height="320dp"
/>
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color2"
android:width="280dp"
android:height="280dp"
/>
<TextView
android:id="@+id/text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color3"
android:width="240dp"
android:height="240dp"
/>
<TextView
android:id="@+id/text4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color4"
android:width="200dp"
android:height="200dp"
/>
<TextView
android:id="@+id/text5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color5"
android:width="160dp"
android:height="160dp"
/>
<TextView
android:id="@+id/text6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@color/color6"
android:width="120dp"
android:height="120dp"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/start"
android:layout_weight="1"
android:text="开始"/>
<Button
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/stop"
android:text="停止"/>
</LinearLayout>
</FrameLayout>
Activity:
package com.example.yougel.otherlayoutdemo;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.Timer;
import java.util.TimerTask;
public class FrameLayoutActivity extends AppCompatActivity {
Button start,stop;
//设置颜色数组
int[] colors={
R.color.color1,
R.color.color2,
R.color.color3,
R.color.color4,
R.color.color5,
R.color.color6
};
int changeColor=0;
//设置textView数组
int[] names={
R.id.text1,
R.id.text2,
R.id.text3,
R.id.text4,
R.id.text5,
R.id.text6
};
boolean isPause;
TextView[] views=new TextView[names.length];
//设置handler
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==110&&isPause==false){
for(int i=0;i<names.length;i++){
views[i].setBackgroundResource(colors[(i+changeColor)%colors.length]);
}
changeColor++;
}
super.handleMessage(msg);
}
};
Timer timer=new Timer();
//设置timer
public void setTimer(){
isPause=false;
TimerTask timerTask=new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(110);
}
};
timer.schedule(timerTask,0,500);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame_layout);
for(int i=0;i<names.length;i++){
views[i]= (TextView) findViewById(names[i]);
}
start= (Button) findViewById(R.id.start);
stop=(Button)findViewById(R.id.stop);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
setTimer();
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isPause=true;
}
});
}
}
上面代码通过设置一个定时器Timer类来定时更改FrameLayout中每个TextView的颜色,形成类似霓虹灯的效果。
在在这里有个常识就是Android中子线程是无法修改UI主线程界面的,由于Timer的使用需要新建子线程,这里就采用Handle的发送消息的方式对主线程界面进行修改。
至于AbsoluteLayout(绝对布局)就不多说了,我们可以将子组件放到布局中指定的坐标处,但不利于兼容不同尺寸的设备,所以在高版本的API是弃用的。