淘先锋技术网

首页 1 2 3 4 5 6 7

最终目的:

使用帧布局实现霓虹灯效果,要求用到线程,能显示变换不同的颜色的霓虹灯动画效果。

效果图

在这里插入图片描述

布局文件

主布局文件运用了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()方法。

参考:帧布局实现霓虹灯效果