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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。