Android 特效View第三弹之闪烁View

来源:互联网 发布:内锥形螺纹编程实例 编辑:程序博客网 时间:2024/05/23 12:11

Android  特效View第三弹之闪烁View

动态效果图我只做了半天还是失败了,给一个截图,剩下的全靠想象了

[html] view plaincopy
  1. <FrameLayout  
  2.         android:layout_width="match_parent"  
  3.         android:layout_height="match_parent" >  
  4.   
  5.         <com.example.empty.FlickerTextView  
  6.             android:id="@+id/flicker"  
  7.             android:layout_width="wrap_content"  
  8.             android:layout_height="wrap_content"  
  9.             android:layout_gravity="top|left"  
  10.             android:text="Happy"  
  11.             android:textColor="#00FF00"  
  12.             android:textSize="24dp" />  
  13.   
  14.         <com.example.empty.FlickerText  
  15.             android:layout_width="wrap_content"  
  16.             android:layout_height="wrap_content"  
  17.             android:layout_gravity="bottom|right"  
  18.             android:alpha="1"  
  19.             android:text="Today"  
  20.             android:textColor="#0000FF"  
  21.             android:textSize="24dp" />  
  22.   
  23.         <com.example.empty.FlikerImageView  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content"  
  26.             android:layout_gravity="center"  
  27.             android:src="@drawable/ic_launcher"/>  
  28.     </FrameLayout>  


[java] view plaincopy
  1. package com.example.empty;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import android.annotation.SuppressLint;  
  7. import android.content.Context;  
  8. import android.graphics.Color;  
  9. import android.os.Handler;  
  10. import android.os.Message;  
  11. import android.util.AttributeSet;  
  12. import android.widget.TextView;  
  13.   
  14. public class FlickerTextView extends TextView{  
  15.     boolean change = false;  
  16.     private Handler handler = null;  
  17.    
  18.     public FlickerTextView(Context context, AttributeSet attrs) {  
  19.         super(context, attrs);          
  20.         // TODO Auto-generated constructor stub  
  21.         startFlicker();  
  22.     }  
  23.            
  24.        
  25.     @SuppressLint("HandlerLeak")  
  26.     public void startFlicker(){  
  27.         handler = new Handler(){  
  28.             @Override  
  29.             public void dispatchMessage(Message msg) {  
  30.                 if(change){  
  31.                     change = false;  
  32.                     setTextColor(Color.TRANSPARENT); //这个是透明,=看不到文字  
  33.                 }else{  
  34.                     change = true;  
  35.                     setTextColor(Color.RED);  
  36.                 }  
  37.             }  
  38.         };  
  39.            
  40.         Timer timer = new Timer();  
  41.         TimerTask task = new TimerTask() {  
  42.             @Override  
  43.             public void run() {  
  44.                 Message msg = new Message();  
  45.                 handler.sendMessage(msg);  
  46.             }  
  47.         };  
  48.         timer.schedule(task,1,300);  //参数分别是delay(多长时间后执行),duration(执行间隔)  
  49.     }  
  50.        
  51. }  

[java] view plaincopy
  1. package com.example.empty;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Canvas;  
  5. import android.util.AttributeSet;  
  6. import android.widget.TextView;  
  7.   
  8. public class FlickerText extends TextView{  
  9.   
  10.     public FlickerText(Context context, AttributeSet attrs) {  
  11.         super(context, attrs);  
  12.         // TODO Auto-generated constructor stub  
  13.     }  
  14.       
  15.     interface STATE{  
  16.         static final int VISIBLE = 1;  
  17.         static final int INVISIBLE = 0;  
  18.     }  
  19.     @Override   
  20.     protected void onDraw(Canvas canvas) {   
  21.         super.onDraw(canvas);  
  22.         switch(getAlphastate()){  
  23.         case STATE.VISIBLE:{  
  24.             setAlpha(STATE.INVISIBLE);  
  25.             break;  
  26.         }  
  27.         case STATE.INVISIBLE:{  
  28.             setAlpha(STATE.VISIBLE);  
  29.             break;  
  30.         }  
  31.         }                  
  32.         postInvalidateDelayed(300);  
  33.     }  
  34.       
  35.     public int getAlphastate(){  
  36.         return (int)getAlpha()== STATE.INVISIBLE ? STATE.INVISIBLE:STATE.VISIBLE;          
  37.     }  
  38.   
  39. }  

[java] view plaincopy
  1. package com.example.empty;  
  2.   
  3. import java.util.Timer;  
  4. import java.util.TimerTask;  
  5.   
  6. import android.content.Context;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.util.AttributeSet;  
  10. import android.widget.ImageView;  
  11.   
  12. public class FlikerImageView extends ImageView {  
  13.   
  14.     boolean change = false;  
  15.   
  16.     public FlikerImageView(Context context, AttributeSet attrs) {  
  17.         super(context, attrs);  
  18.         // TODO Auto-generated constructor stub  
  19.         startFlicker();  
  20.     }  
  21.   
  22.     interface STATE {  
  23.         static final int VISIBLE = 255;  
  24.         static final int INVISIBLE = 0;  
  25.     }  
  26.   
  27.     private Handler handler = new Handler() {  
  28.         @Override  
  29.         public void dispatchMessage(Message msg) {  
  30.             if (change) {  
  31.                 change = false;  
  32.                 setImageAlpha(STATE.INVISIBLE);  
  33.             } else {  
  34.                 change = true;  
  35.                 setImageAlpha(STATE.VISIBLE);  
  36.             }  
  37.         }  
  38.     };  
  39.   
  40.     public void startFlicker() {  
  41.   
  42.         Timer timer = new Timer();  
  43.         TimerTask task = new TimerTask() {  
  44.             @Override  
  45.             public void run() {  
  46.                 Message msg = new Message();  
  47.                 handler.sendMessage(msg);  
  48.             }  
  49.         };  
  50.         timer.schedule(task, 1300);  
  51.     }  
  52.   
  53. }  

我这里给出了3种实现方案(其实是两种)来实现达到View闪烁的效果。
这里简单说明一下2种方案的思路
第一种我们通过Timer定时改变View的状态
第二种通过postInvalidateDelayed来每隔一段时间进行一次重绘。

然后我们改变View也是通过2种方式
一、setColor 二、setAlpha
当然,我们还可以通过一段动画(anim)来实现。但是原理是相同的

这里我推荐的方式是postInvalidateDelayed + setAlpha来实现
但是在ImageVIew种当你调用setAlpha时系统会自动调用Invalidate(onDraw),这时你的图片就会一直处于闪烁状态
这里我们就只能采用Timer和动画来实现了
0 0
原创粉丝点击