Android 特效View第三弹之闪烁View
动态效果图我只做了半天还是失败了,给一个截图,剩下的全靠想象了
- <FrameLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent" >
- <com.example.empty.FlickerTextView
- android:id="@+id/flicker"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="top|left"
- android:text="Happy"
- android:textColor="#00FF00"
- android:textSize="24dp" />
- <com.example.empty.FlickerText
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom|right"
- android:alpha="1"
- android:text="Today"
- android:textColor="#0000FF"
- android:textSize="24dp" />
- <com.example.empty.FlikerImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center"
- android:src="@drawable/ic_launcher"/>
- </FrameLayout>
- package com.example.empty;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.annotation.SuppressLint;
- import android.content.Context;
- import android.graphics.Color;
- import android.os.Handler;
- import android.os.Message;
- import android.util.AttributeSet;
- import android.widget.TextView;
- public class FlickerTextView extends TextView{
- boolean change = false;
- private Handler handler = null;
- public FlickerTextView(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- startFlicker();
- }
- @SuppressLint("HandlerLeak")
- public void startFlicker(){
- handler = new Handler(){
- @Override
- public void dispatchMessage(Message msg) {
- if(change){
- change = false;
- setTextColor(Color.TRANSPARENT); //这个是透明,=看不到文字
- }else{
- change = true;
- setTextColor(Color.RED);
- }
- }
- };
- Timer timer = new Timer();
- TimerTask task = new TimerTask() {
- @Override
- public void run() {
- Message msg = new Message();
- handler.sendMessage(msg);
- }
- };
- timer.schedule(task,1,300); //参数分别是delay(多长时间后执行),duration(执行间隔)
- }
- }
- package com.example.empty;
- import android.content.Context;
- import android.graphics.Canvas;
- import android.util.AttributeSet;
- import android.widget.TextView;
- public class FlickerText extends TextView{
- public FlickerText(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- }
- interface STATE{
- static final int VISIBLE = 1;
- static final int INVISIBLE = 0;
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- switch(getAlphastate()){
- case STATE.VISIBLE:{
- setAlpha(STATE.INVISIBLE);
- break;
- }
- case STATE.INVISIBLE:{
- setAlpha(STATE.VISIBLE);
- break;
- }
- }
- postInvalidateDelayed(300);
- }
- public int getAlphastate(){
- return (int)getAlpha()== STATE.INVISIBLE ? STATE.INVISIBLE:STATE.VISIBLE;
- }
- }
- package com.example.empty;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.content.Context;
- import android.os.Handler;
- import android.os.Message;
- import android.util.AttributeSet;
- import android.widget.ImageView;
- public class FlikerImageView extends ImageView {
- boolean change = false;
- public FlikerImageView(Context context, AttributeSet attrs) {
- super(context, attrs);
- // TODO Auto-generated constructor stub
- startFlicker();
- }
- interface STATE {
- static final int VISIBLE = 255;
- static final int INVISIBLE = 0;
- }
- private Handler handler = new Handler() {
- @Override
- public void dispatchMessage(Message msg) {
- if (change) {
- change = false;
- setImageAlpha(STATE.INVISIBLE);
- } else {
- change = true;
- setImageAlpha(STATE.VISIBLE);
- }
- }
- };
- public void startFlicker() {
- Timer timer = new Timer();
- TimerTask task = new TimerTask() {
- @Override
- public void run() {
- Message msg = new Message();
- handler.sendMessage(msg);
- }
- };
- timer.schedule(task, 1, 300);
- }
- }
我这里给出了3种实现方案(其实是两种)来实现达到View闪烁的效果。
这里简单说明一下2种方案的思路
第一种我们通过Timer定时改变View的状态
第二种通过postInvalidateDelayed来每隔一段时间进行一次重绘。
然后我们改变View也是通过2种方式
一、setColor 二、setAlpha
当然,我们还可以通过一段动画(anim)来实现。但是原理是相同的
这里我推荐的方式是postInvalidateDelayed + setAlpha来实现
但是在ImageVIew种当你调用setAlpha时系统会自动调用Invalidate(onDraw),这时你的图片就会一直处于闪烁状态
这里我们就只能采用Timer和动画来实现了