当前位置: 代码迷 >> Android >> Android 奇效View第三弹之闪烁View
  详细解决方案

Android 奇效View第三弹之闪烁View

热度:68   发布时间:2016-04-28 01:08:28.0
Android 特效View第三弹之闪烁View

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

  相关解决方案