1. 帧布局FrameLayout类
帧布局容器为每个加入其中的组件创建一个空白的区域(称为一帧),每个子组件占据一帧。
实例:利用帧布局制作霓虹灯效果
Xml程序清单
<?xmlversion="1.0"encoding="utf-8"?>
<FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!--依次定义6个TextView,先定义的TextView位于低层
后定义的TextView位于上层 -->
<TextViewandroid:id="@+id/view01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="320px"
android:height="320px"
android:background="#000"
/>
<TextViewandroid:id="@+id/view02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="280px"
android:height="280px"
android:background="#00f"
/>
<TextViewandroid:id="@+id/view03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="240px"
android:height="240px"
android:background="#0f0"
/>
<TextViewandroid:id="@+id/view04"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="200px"
android:height="200px"
android:background="#0ff"
/>
<TextViewandroid:id="@+id/view05"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="160px"
android:height="160px"
android:background="#f00"
/>
<TextViewandroid:id="@+id/view06"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="120px"
android:height="120px"
android:background="#f0f"
/>
<TextViewandroid:id="@+id/view07"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="80px"
android:height="80px"
android:background="#ff0"
/>
<TextViewandroid:id="@+id/view08"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="40px"
android:height="40px"
android:background="#fff"
/>
</FrameLayout>
JAVA程序清单
packagecom.hqsA.framelayouttext;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class FrameLayoutTextextends Activity {
private int currentColor = 0;
//定义一个颜色数组,需要在values文件夹中创建colors.xml颜色资源文件
final int[] colors = new int[] {
R.color.color1,
R.color.color2,
R.color.color3,
R.color.color4,
R.color.color5,
R.color.color6,
R.color.color7,
R.color.color8,
};
final int[] names = new int[] {
R.id.view01,
R.id.view02,
R.id.view03,
R.id.view04,
R.id.view05,
R.id.view06,
R.id.view07,
R.id.view08,
};
TextView[] views = new TextView[names.length];
Handler handler = newHandler()
{
@Override
//用来更新8个textView的背景色
public void handleMessage(Messagemsg)
{
//表明消息来自本程序所发送
if (msg.what == 0x123)
{
for (int i = 0; i< names.length; i++)
{
views[i].setBackgroundResource(colors[(i+ currentColor)
% names.length]);
}
currentColor++;
}
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.frame_layout_text);
for (int i = 0;i < names.length;i++)
{
views[i] = (TextView) findViewById(names[i]);
}
//定义每0.4秒执行一次任务,该任务是向Handle发送一条信息
//定义一个线程周期性地改变currentColor变量值
new Timer().schedule(new TimerTask()
{
@Override
public void run()
{
//发送一条空消息通知系统改变8个TextView组件的背景色
handler.sendEmptyMessage(0x123);
}
}, 0, 400);
}
}
PS:以为android的View与UI不是线程安全的,所以android不允许开发者启动线程访问用户界面的UI组件。所以不能直接在run()方法里直接更新TextView的背景色。
线性安全:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
效果:
2. 相对布局RelativeLayout类
相对布局内的子组件的位置总是相对于兄弟组件、父容器来决定。如果A的位置由B的位置来决定,android需先定义B组件,再定义A组件。
Xml程序清单
<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<!--定义该组件位于父容器中间 -->
<TextView
android:id="@+id/view01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/android"
android:layout_centerInParent="true"
/>
<!--定义该组件位于view01组件的上方,左边界对齐 -->
<TextView
android:id="@+id/view02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/android"
android:layout_above="@id/view01"
android:layout_alignLeft="@id/view01"
/>
<!--定义该组件位于view01组件的下方,左边界对齐 -->
<TextView
android:id="@+id/view03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/android"
android:layout_below="@id/view01"
android:layout_alignLeft="@id/view01"
/>
<!--定义该组件位于view01组件的左边,上边界对齐 -->
<TextView
android:id="@+id/view04"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/android"
android:layout_toLeftOf="@id/view01"
android:layout_alignTop="@id/view01"
/>
<!--定义该组件位于view01组件的右边,上边界对齐 -->
<TextView
android:id="@+id/view05"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/android"
android:layout_toRightOf="@id/view01"
android:layout_alignTop="@id/view01"
/>
</RelativeLayout>
Java程序清单
packagecom.hqsA.relativelayouttext;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.view.Menu;
publicclass RelativeLayoutTextextends Activity {
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.relative_layout_text);
findViewById(R.id.view01).setPadding(5, 5 , 5 , 5);//setPadding()设置填充
findViewById(R.id.view02).setPadding(5, 5 , 5 , 5);
findViewById(R.id.view03).setPadding(5, 5 , 5 , 5);
findViewById(R.id.view04).setPadding(5, 5 , 5 , 5);
findViewById(R.id.view05).setPadding(5, 5 , 5 , 5);
}
}