最终目的:
使用帧布局实现霓虹灯效果,要求用到线程,能显示变换不同的颜色的霓虹灯动画效果。
效果图
布局文件
主布局文件运用了FrameLayout布局和七个不同大小的TextView,内容居中显示,即layout_gravity=“center”
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.fang.zzti.layout.FrameLayout">
<TextView
android:id="@+id/view1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="280dp"
android:height="280dp"
android:background="#669933"/>
<TextView
android:id="@+id/view2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="240dp"
android:height="240dp"
android:background="#669966"/>
<TextView
android:id="@+id/view3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="200dp"
android:height="200dp"
android:background="#669999"/>
<TextView
android:id="@+id/view4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="160dp"
android:height="160dp"
android:background="#6699CC"/>
<TextView
android:id="@+id/view5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="120dp"
android:height="120dp"
android:background="#6699FF"/>
<TextView
android:id="@+id/view6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="80dp"
android:height="80dp"
android:background="#66CCFF"/>
<TextView
android:id="@+id/view7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:width="40dp"
android:height="40dp"
android:background="#66CC00"/>
</FrameLayout>
创建color变量(values目录下)
<resources>
<color name="color1">#660000</color>
<color name="color2">#660033</color>
<color name="color3">#660066</color>
<color name="color4">#660099</color>
<color name="color5">#6600CC</color>
<color name="color6">#6600FF</color>
<color name="color7">#3300CC</color>
</resources>
Activity中java代码
public class FrameLayout extends AppCompatActivity {
private int currentColor=0;
private int update=1;
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
};
final int []names=new int[]{
R.id.view1,
R.id.view2,
R.id.view3,
R.id.view4,
R.id.view5,
R.id.view6,
R.id.view7
};
TextView views[]=new TextView[7];
// 消息通讯类,实现非主线程更新UI组件
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==update){
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.activity_frame_layout);
for(int i=0;i<names.length;i++){
views[i]=(TextView)findViewById(names[i]);
}
new Timer().schedule(new TimerTask() {
@Override
public void run() {
//发送一条消息通知系统更新TextView的背景色
handler.sendEmptyMessage(update);
}
},0,200);
}
}
用到的知识点
1、Handle
主要接受子线程发送的数据,并用次数据配合主线程更新UI。当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程管理界面中UI控件,进行事件的分发。Android更新UI只能在子线程中更新,子线程中更新是危险的。Handle运行在主线程(UI线程)中,它与子线程可以通过Message对象来传递数据,Handle接受子线程传来的Message对象,把这些消息放入主线程队列中,更新UI。
2、定时器Timer
Timer是一种定时器工具,用来在一个后台线程计划执行任务,TimerTask是一个抽象类,它的子类代表一个可以被Timer计划的任务。TimeTask实现了Runnable接口,并实现了run()方法,类似线程中的run()方法,本例中的timer.schedule(Timertask,delay,period),第一个参数Timertask封装了具体的任务,第二个参数表示要等待一段时间delay才会执行run()方法,,第三个参数period表示间隔多长时间重复执行run()方法。