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和动画来实现了