一、作用
布局
二、概念
1.简介
帧布局。帧布局容器为个加入其中的组件创建一个空白的区域(称为一帧),所有每个子组件占据一帧,这些帧会根据gravity
属性自动对齐。
这种布局没有丰富的定位方式,所有控件默认摆放在布局的左上角。
2.常用属性
layout_gravity
三、使用
【实现霓虹灯效果】
(1)布局
一个 FrameLayout 中放7个TextView
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv1"
android:layout_width="200dp"
android:layout_height="50dp"
android:background="#ff0000" />
<TextView
android:id="@+id/tv2"
android:layout_width="180dp"
android:layout_height="50dp"
android:background="#dd0000" />
<TextView
android:id="@+id/tv3"
android:layout_width="150dp"
android:layout_height="50dp"
android:background="#bb0000" />
<TextView
android:id="@+id/tv4"
android:layout_width="120dp"
android:layout_height="50dp"
android:background="#990000" />
<TextView
android:id="@+id/tv5"
android:layout_width="90dp"
android:layout_height="50dp"
android:background="#770000" />
<TextView
android:id="@+id/tv6"
android:layout_width="60dp"
android:layout_height="50dp"
android:background="#550000" />
<TextView
android:id="@+id/tv7"
android:layout_width="30dp"
android:layout_height="50dp"
android:background="#330000" />
</FrameLayout>
显示效果
(2)代码逻辑
准备好一组颜色,colors=[C0,C1,C2,C3,C4,C5,C6],每隔1秒,TextView 换一次颜色。
// 颜色数组
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 };
初始化控件
// 控件数组:存放控件id
final int[] names = new int[] {
R.id.tv1, R.id.tv2, R.id.tv3, R.id.tv4, R.id.tv5, R.id.tv6, R.id.tv7
};
TextView[] mViews = new TextView[7];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化控件
for (int i = 0; i < 7; i++) {
mViews[i] = findViewById(names[i]);
}
}
开启一个定时器,每隔1000ms换一次颜色。每次换颜色时:确定下来第一个 TextView 要显示的颜色为 C,之后的 TextView 从 colors 中按列表循环顺序读取自己应该显示的颜色
public class FrameLayoutActivity extends AppCompatActivity {
private static final String TAG = "FrameLayoutActivity";
// 颜色数组
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
};
// 控件数组:存放控件id
final int[] names = new int[] {
R.id.tv1, R.id.tv2, R.id.tv3, R.id.tv4, R.id.tv5, R.id.tv6, R.id.tv7
};
TextView[] mViews = new TextView[7];
// 第一个TextView要显示的颜色,在colors数组中的下标
int firstColor;
private MyHandler mMyHandler;
private class MyHandler extends Handler {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == 0x1122) {
// 为TextView设置响应颜色
for (int i = 0; i < mViews.length; i++) {
TextView textView = mViews[i];
Log.i(TAG, "textView" + i + ",color=" + (i + firstColor) % 7);
textView.setBackgroundResource(colors[(i + firstColor) % 7]);
}
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame_layout);
mMyHandler = new MyHandler();
// 初始化控件
for (int i = 0; i < 7; i++) {
mViews[i] = findViewById(names[i]);
}
// 开启定时任务,每隔100ms更换一次颜色
new Timer().schedule(new TimerTask() {
@Override
public void run() {
firstColor++;
if (firstColor == 7) {
firstColor = 0;
}
// 发送消息
Message msg = new Message();
msg.what = 0x1122;
mMyHandler.sendMessage(msg);
}
}, 0, 1000);
}
}
网友评论