精华内容
下载资源
问答
  • 包裹住你想要闪烁的内容 2. (2.)给你之前的类写上样式,颜色,动画效果:延伸 3秒 动画速度(平行速度)无限循环 。-webkit-和-moz-还有-ms-是固定名字,不能改变的。后面改下时间就可以了。 3. (3.)最后是...

    在这里插入图片描述
    (1.)给他一个div。给他类名(个人喜好)。包裹住你想要闪烁的内容
    2.
    在这里插入图片描述
    (2.)给你之前的类写上样式,颜色,动画效果:延伸 3秒 动画速度(平行速度)无限循环 。-webkit-和-moz-还有-ms-是固定名字,不能改变的。后面改下时间就可以了。
    3.
    在这里插入图片描述
    (3.)最后是设置过程,选到之前给他的类。给他设置图片透明,从1到0,从0%到100%,之前给的固定都给他设置一遍。(速度可以修改固定名字后面的秒速)。

    展开全文
  • Android自定义组件系列【8】——遮罩文字动画

    千次阅读 多人点赞 2014-06-15 20:02:03
    这一篇文章我们来看看如何自定义一个ImageView来实现一张文字图片实现文字的遮罩闪烁效果,下面先来看看效果吧。(录屏幕延时导致效果看起来不是很好)一、实现原理 实现原理是重写View的onCreate方法,获取图片...

    遮罩文字的动画我们在Flash中非常常见,作为Android的应用开发者你是否也想将这种动画做到你的应用中去呢?这一篇文章我们来看看如何自定义一个ImageView来实现让一张文字图片实现文字的遮罩闪烁效果,下面先来看看效果吧。


    (录屏幕延时导致效果看起来不是很好)

    一、实现原理

      实现原理是重写View的onCreate方法,获取图片资源后对每个像素的透明度进行修改来实现,再启动一个线程来循环改变某个区域中的像素透明度。

    RGBA基础知识:(下面几段介绍文字引用自维基百科)

      RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。虽然它有的时候被描述为一个颜色空间,但是它其实仅仅是RGB模型的附加了额外的信息。采用的颜色是RGB,可以属于任何一种RGB颜色空间,但是CatmullSmith在1971至1972年间提出了这个不可或缺的alpha数值,使得alpha渲染alpha合成变得可能。提出者以alpha来命名是源于经典的线性插值方程αA + (1-α)B所用的就是这个希腊字母

      alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%则意味着一个完全不透明的像素(传统的数字图像)。在0%和100%之间的值则使得像素可以透过背景显示出来,就像透过玻璃(半透明性),这种效果是简单的二元透明性(透明或不透明)做不到的。它使数码合成变得容易。alpha通道值可以用百分比、整数或者像RGB参数那样用0到1的实数表示。

      有时它也被写成ARGB(像RGBA一样,但是第一个数据是alpha),是Macromedia的产品使用的术语。比如,0x80FFFF00是50%透明的黄色,因为所有的参数都在0到255的范围内表示。0x80是128,大约是255的一半。

    PNG是一种使用RGBA的图像格式。


    二、具体实现

    package com.example.helloworld;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.os.Handler;
    import android.os.Message;
    import android.os.SystemClock;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.ImageView;
    /**
     * @author 阳光小强
     *
     */
    public class SplashImageView extends ImageView{ 
        private Bitmap alterBitmap;  
        private Canvas canvas;  
        private Paint paint;  
    	private Handler handler;
    	private static int START_POSITION = 20;
    	private final int speed;
    	private int nowPosition = START_POSITION;
    	private static int SHOW_WIDTH = 20;
    	private boolean isFirst = true;
    	private boolean isStop = false;
    
        
    	private class MyHandler extends Handler {
    
    		private static final long SCALE = 10000;
    		private static final int MSG_PAINT = 1;
    
    		private final SplashImageView owner;
    		private final int speed;
    
    		private long angle;
    		private long lastTime;
    		public MyHandler(SplashImageView owner) {
    			this.owner = owner;
    			this.lastTime = SystemClock.elapsedRealtime();
    			this.speed = owner.speed;
    			sendEmptyMessage(MSG_PAINT);
    		}
    
    		@Override
    		public void handleMessage(Message msg) {
    			if (msg.what == MSG_PAINT) {
    				long now = SystemClock.elapsedRealtime();
    				long delta_time = now - lastTime;
    				System.out.println("delta_time = " + delta_time);
    				System.out.println("alterBitmap.Width = " + alterBitmap.getWidth());
    				if(nowPosition + speed >= alterBitmap.getWidth() - START_POSITION - SHOW_WIDTH){
    					if(isStop){
    						handler.removeCallbacksAndMessages(null);
    						handler = null;
    						isStop = false;
    						return;
    					}else{
    						nowPosition = START_POSITION;
    					}
    				}
    				nowPosition = nowPosition + speed;
    				if (delta_time > 0) {
    					if(!notifiDraw(nowPosition)){
    						return;
    					}
    				}
    				this.sendEmptyMessageDelayed(MSG_PAINT, 10);
    			}
    		}
    	}
    	
    	private boolean notifiDraw(long position) {
    		System.out.println("nofityDrawToatal = " + position);
    		if(position < alterBitmap.getWidth() - START_POSITION - SHOW_WIDTH){
    			this.invalidate();
    			return true;
    		}
    		if (handler != null) {
    			handler.removeCallbacksAndMessages(null);
    			handler = null;
    		}
    		return false;
    	}
    	
    	@Override
    	public void setVisibility(int visibility) {
    		super.setVisibility(visibility);
    		if(visibility == View.VISIBLE){
    			if(handler == null){
    	        	handler =  new MyHandler(this);
    	        }else{
    	        	handler.removeCallbacksAndMessages(null);
    	        	handler.sendEmptyMessage(MyHandler.MSG_PAINT);
    	        }
    		}else{
    			if(handler != null){
    				handler.removeCallbacksAndMessages(null);
    				handler = null;
    			}
    		}
    	}
    	
    	public void stopSplashAnimation(){
    		if(handler != null){
    			isStop = true;
    		}
    	}
    	
    	public SplashImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FuseImageView, 0, 0);
    		int resId = a.getResourceId(R.styleable.FuseImageView_imageSrc, 0);
    		int speed = a.getInt(R.styleable.FuseImageView_speed, 5);
    		this.speed = speed <= 0 ? 1 : speed;
    		Bitmap up = BitmapFactory.decodeResource(context.getResources(), resId);
            alterBitmap = Bitmap.createBitmap(up.getWidth(), up.getHeight(), up.getConfig());  
               
            canvas = new Canvas(alterBitmap);   
            paint = new Paint();  
            paint.setStrokeWidth(5);  
            paint.setColor(Color.BLACK);  
            canvas.drawBitmap(up, new Matrix(), paint);  
              
            setImageBitmap(alterBitmap);  
           
            if(getVisibility() == View.VISIBLE){
            	if(handler == null){
    	        	handler =  new MyHandler(this);
    	        }
            }
    	}
    	
    	@Override
    	protected void onDraw(Canvas canvas) {
    		
    		super.onDraw(canvas);
    		
    		if(isFirst){
    			isFirst = false;
    			 for(int i=nowPosition; i<alterBitmap.getWidth() ; i++){  
    	             for(int j=0; j<alterBitmap.getHeight(); j++){  
    	                 int color = alterBitmap.getPixel(i, j);  
    	                 int r = Color.red(color);  
    	                 int g = Color.green(color);  
    	                 int b = Color.blue(color);
    	                 int a = Color.alpha(color);
    	                 if( a > 200){
    	                	 color = Color.argb(80, r, g, b);
    	                 }else{
    	                	 color = Color.argb(a, r, g, b);
    	                 }
    	                 alterBitmap.setPixel(i, j, color);
    	             }  
    	             
    	         }  
    		}
    	   
    		 for(int i=nowPosition; i<nowPosition + SHOW_WIDTH ; i++){  
                 for(int j=0; j<alterBitmap.getHeight(); j++){  
                     int color = alterBitmap.getPixel(i, j);  
                     int r = Color.red(color);  
                     int g = Color.green(color);  
                     int b = Color.blue(color);
                     int a = Color.alpha(color);
                     if(a == 80){
                    	 color = Color.argb(255, r, g, b);
                     }else{
                    	 color = Color.argb(a, r, g, b);
                     }
                     alterBitmap.setPixel(i, j, color);
                 }  
                 
             }  
            
    		 if(nowPosition > START_POSITION){
    			 for(int i= nowPosition - SHOW_WIDTH; i<nowPosition; i++){  
    	             for(int j=0; j<alterBitmap.getHeight(); j++){  
    	                 int color = alterBitmap.getPixel(i, j);         
    	                 int r = Color.red(color);  
    	                 int g = Color.green(color);  
    	                 int b = Color.blue(color);
    	                 int a = Color.alpha(color);
    	                 if( a > 200){
    	                	 color = Color.argb(80, r, g, b);
    	                 }else{
    	                	 color = Color.argb(a, r, g, b);
    	                 }
    	                 alterBitmap.setPixel(i, j, color);
    	             }  
    	             
    	         }  
    		 }
            setImageBitmap(alterBitmap);
    	}
    
    }
    
    三、实现详解

    1、构造方法中进行初始化操作

    	public SplashImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		TypedArray a = context.obtainStyledAttributes(attrs,
    				R.styleable.FuseImageView, 0, 0);
    		int resId = a.getResourceId(R.styleable.FuseImageView_imageSrc, 0);
    		int speed = a.getInt(R.styleable.FuseImageView_speed, 5);
    		this.speed = speed <= 0 ? 1 : speed;
    		Bitmap up = BitmapFactory.decodeResource(context.getResources(), resId);
    		alterBitmap = Bitmap.createBitmap(up.getWidth(), up.getHeight(),
    				up.getConfig());
    
    		canvas = new Canvas(alterBitmap);
    		paint = new Paint();
    		paint.setStrokeWidth(5);
    		paint.setColor(Color.BLACK);
    		canvas.drawBitmap(up, new Matrix(), paint);
    
    		setImageBitmap(alterBitmap);
    
    		if (getVisibility() == View.VISIBLE) {
    			if (handler == null) {
    				handler = new MyHandler(this);
    			}
    		}
    	}
    上面的TypedArray是自定义的属性,在res/values目录下新建一个attrs.xml添加自定义属性

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="FuseImageView">
            <attr name="imageSrc" format="reference" />
            <attr name="speed" format="integer" />
        </declare-styleable>
    </resources>
    这里是自定义的两个属性,一个是图片资源ID另一个是遮罩移动速度(其实上面也可以继承自View来实现自定义,我这里是有特殊需要才继承自ImageView的)

    然后通过BitmapFactory获取图片资源,并通过createBitmap方法创建一个可写的Bitmap资源给画布(Canvas),将可写的Bitmap绘制到同样资源的背景上。

    底下的判读View是否可看见,是用来判读View是否可见,如果可见才开启线程进行动画的,不然的话开启线程绘制会浪费资源的(因为它根本就看不见)。

    2、如何改变透明度并且绘制(onDraw方法)

    		for (int i = nowPosition; i < nowPosition + SHOW_WIDTH; i++) {
    			for (int j = 0; j < alterBitmap.getHeight(); j++) {
    				int color = alterBitmap.getPixel(i, j);
    				int r = Color.red(color);
    				int g = Color.green(color);
    				int b = Color.blue(color);
    				int a = Color.alpha(color);
    				if (a == 80) {
    					color = Color.argb(255, r, g, b);
    				} else {
    					color = Color.argb(a, r, g, b);
    				}
    				alterBitmap.setPixel(i, j, color);
    			}
    
    		}
    
    		if (nowPosition > START_POSITION) {
    			for (int i = nowPosition - SHOW_WIDTH; i < nowPosition; i++) {
    				for (int j = 0; j < alterBitmap.getHeight(); j++) {
    					int color = alterBitmap.getPixel(i, j);
    					int r = Color.red(color);
    					int g = Color.green(color);
    					int b = Color.blue(color);
    					int a = Color.alpha(color);
    					if (a > 200) {
    						color = Color.argb(80, r, g, b);
    					} else {
    						color = Color.argb(a, r, g, b);
    					}
    					alterBitmap.setPixel(i, j, color);
    				}
    
    			}
    		}
    主要是上面两个循环来实现绘制的,上面的循环是绘制一块区域来将文字的透明度调为最小(255),这一部分的文字就显示为高亮了,其余部分的文字透明度调值调为80,就会显示背景颜色,文字的暗度就会下降。

    3、如何循环移动遮罩

    	private class MyHandler extends Handler {
    
    		private static final long SCALE = 10000;
    		private static final int MSG_PAINT = 1;
    
    		private final SplashImageView owner;
    		private final int speed;
    
    		private long angle;
    		private long lastTime;
    
    		public MyHandler(SplashImageView owner) {
    			this.owner = owner;
    			this.lastTime = SystemClock.elapsedRealtime();
    			this.speed = owner.speed;
    			sendEmptyMessage(MSG_PAINT);
    		}
    
    		@Override
    		public void handleMessage(Message msg) {
    			if (msg.what == MSG_PAINT) {
    				long now = SystemClock.elapsedRealtime();
    				long delta_time = now - lastTime;
    				System.out.println("delta_time = " + delta_time);
    				System.out.println("alterBitmap.Width = "
    						+ alterBitmap.getWidth());
    				if (nowPosition + speed >= alterBitmap.getWidth()
    						- START_POSITION - SHOW_WIDTH) {
    					if (isStop) {
    						handler.removeCallbacksAndMessages(null);
    						handler = null;
    						isStop = false;
    						return;
    					} else {
    						nowPosition = START_POSITION;
    					}
    				}
    				nowPosition = nowPosition + speed;
    				if (delta_time > 0) {
    					if (!notifiDraw(nowPosition)) {
    						return;
    					}
    				}
    				this.sendEmptyMessageDelayed(MSG_PAINT, 10);
    			}
    		}
    	}
    循环移动遮罩是写在一个线程中的,每隔10毫秒就去移动speed(配置的速度)的距离,来实现遮罩的移动效果,再取图片的宽度来判断是否已经到了最右边。


    总结:其实上面的实现原理并不难,要点是要知道RGBA的知识和如何去改变像素的透明度。这个只是个人暂时想到的一个方法,如果有什么更好的方式实现,希望能交流一下。

    另外“阳光小强”的另一篇博文《是男人就下100层【第三层】——高仿交通银行手机客户端界面》参加了CSDN举办的博文大赛,如果您觉得这些博文对您有帮助,希望您投出您宝贵的一票,投票地址:http://vote.blog.csdn.net/Article/Details?articleid=30101091


    展开全文
  • 本文中,我们看的是如何自己的定义ImageView来实现一张文字图片实现文字的遮罩闪烁效果,以下先来看看效果吧。(录屏幕延时导致效果看起来不是非常好)一、实现原理 实现原理是重写View的onCreate方法。获取图片...

    我们掩盖文字动画Flash中非经货共同体共同,由于Android应用程序开发人员做你想要做这个动画在应用程序中去?本文中,我们看的是如何自己的定义ImageView来实现让一张文字图片实现文字的遮罩闪烁效果,以下先来看看效果吧。


    (录屏幕延时导致效果看起来不是非常好)

    一、实现原理

      实现原理是重写View的onCreate方法。获取图片资源后对每一个像素的透明度进行改动来实现,再启动一个线程来循环改变某个区域中的像素透明度。

    RGBA基础知识:(以下几段介绍文字引用自维基百科)

      RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。尽管它有的时候被描写叙述为一个颜色空间,可是它事实上不过RGB模型的附加了额外的信息。

    採用的颜色是RGB,能够属于不论什么一种RGB颜色空间。可是CatmullSmith在1971至1972年间提出了这个不可或缺的alpha数值,使得alpha渲染alpha合成变得可能。

    提出者以alpha来命名是源于经典的线性插值方程αA + (1-α)B所用的就是这个希腊字母

      alpha通道一般用作不透明度參数。假设一个像素的alpha通道数值为0%,那它就是全然透明的(也就是看不见的),而数值为100%则意味着一个全然不透明的像素(传统的数字图像)。在0%和100%之间的值则使得像素能够透过背景显示出来,就像透过玻璃(半透明性),这样的效果是简单的二元透明性(透明或不透明)做不到的。它使数码合成变得easy。alpha通道值能够用百分比、整数或者像RGB參数那样用0到1的实数表示。

      有时它也被写成ARGB(像RGBA一样,可是第一个数据是alpha),是Macromedia的产品使用的术语。比方,0x80FFFF00是50%透明的黄色,由于全部的參数都在0到255的范围内表示。0x80是128,大约是255的一半。

    PNG是一种使用RGBA的图像格式。


    二、具体实现

    package com.example.helloworld;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.os.Handler;
    import android.os.Message;
    import android.os.SystemClock;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.ImageView;
    /**
     * @author 阳光小强
     *
     */
    public class SplashImageView extends ImageView{ 
        private Bitmap alterBitmap;  
        private Canvas canvas;  
        private Paint paint;  
    	private Handler handler;
    	private static int START_POSITION = 20;
    	private final int speed;
    	private int nowPosition = START_POSITION;
    	private static int SHOW_WIDTH = 20;
    	private boolean isFirst = true;
    	private boolean isStop = false;
    
        
    	private class MyHandler extends Handler {
    
    		private static final long SCALE = 10000;
    		private static final int MSG_PAINT = 1;
    
    		private final SplashImageView owner;
    		private final int speed;
    
    		private long angle;
    		private long lastTime;
    		public MyHandler(SplashImageView owner) {
    			this.owner = owner;
    			this.lastTime = SystemClock.elapsedRealtime();
    			this.speed = owner.speed;
    			sendEmptyMessage(MSG_PAINT);
    		}
    
    		@Override
    		public void handleMessage(Message msg) {
    			if (msg.what == MSG_PAINT) {
    				long now = SystemClock.elapsedRealtime();
    				long delta_time = now - lastTime;
    				System.out.println("delta_time = " + delta_time);
    				System.out.println("alterBitmap.Width = " + alterBitmap.getWidth());
    				if(nowPosition + speed >= alterBitmap.getWidth() - START_POSITION - SHOW_WIDTH){
    					if(isStop){
    						handler.removeCallbacksAndMessages(null);
    						handler = null;
    						isStop = false;
    						return;
    					}else{
    						nowPosition = START_POSITION;
    					}
    				}
    				nowPosition = nowPosition + speed;
    				if (delta_time > 0) {
    					if(!notifiDraw(nowPosition)){
    						return;
    					}
    				}
    				this.sendEmptyMessageDelayed(MSG_PAINT, 10);
    			}
    		}
    	}
    	
    	private boolean notifiDraw(long position) {
    		System.out.println("nofityDrawToatal = " + position);
    		if(position < alterBitmap.getWidth() - START_POSITION - SHOW_WIDTH){
    			this.invalidate();
    			return true;
    		}
    		if (handler != null) {
    			handler.removeCallbacksAndMessages(null);
    			handler = null;
    		}
    		return false;
    	}
    	
    	@Override
    	public void setVisibility(int visibility) {
    		super.setVisibility(visibility);
    		if(visibility == View.VISIBLE){
    			if(handler == null){
    	        	handler =  new MyHandler(this);
    	        }else{
    	        	handler.removeCallbacksAndMessages(null);
    	        	handler.sendEmptyMessage(MyHandler.MSG_PAINT);
    	        }
    		}else{
    			if(handler != null){
    				handler.removeCallbacksAndMessages(null);
    				handler = null;
    			}
    		}
    	}
    	
    	public void stopSplashAnimation(){
    		if(handler != null){
    			isStop = true;
    		}
    	}
    	
    	public SplashImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FuseImageView, 0, 0);
    		int resId = a.getResourceId(R.styleable.FuseImageView_imageSrc, 0);
    		int speed = a.getInt(R.styleable.FuseImageView_speed, 5);
    		this.speed = speed <= 0 ? 1 : speed;
    		Bitmap up = BitmapFactory.decodeResource(context.getResources(), resId);
            alterBitmap = Bitmap.createBitmap(up.getWidth(), up.getHeight(), up.getConfig());  
               
            canvas = new Canvas(alterBitmap);   
            paint = new Paint();  
            paint.setStrokeWidth(5);  
            paint.setColor(Color.BLACK);  
            canvas.drawBitmap(up, new Matrix(), paint);  
              
            setImageBitmap(alterBitmap);  
           
            if(getVisibility() == View.VISIBLE){
            	if(handler == null){
    	        	handler =  new MyHandler(this);
    	        }
            }
    	}
    	
    	@Override
    	protected void onDraw(Canvas canvas) {
    		
    		super.onDraw(canvas);
    		
    		if(isFirst){
    			isFirst = false;
    			 for(int i=nowPosition; i<alterBitmap.getWidth() ; i++){  
    	             for(int j=0; j<alterBitmap.getHeight(); j++){  
    	                 int color = alterBitmap.getPixel(i, j);  
    	                 int r = Color.red(color);  
    	                 int g = Color.green(color);  
    	                 int b = Color.blue(color);
    	                 int a = Color.alpha(color);
    	                 if( a > 200){
    	                	 color = Color.argb(80, r, g, b);
    	                 }else{
    	                	 color = Color.argb(a, r, g, b);
    	                 }
    	                 alterBitmap.setPixel(i, j, color);
    	             }  
    	             
    	         }  
    		}
    	   
    		 for(int i=nowPosition; i<nowPosition + SHOW_WIDTH ; i++){  
                 for(int j=0; j<alterBitmap.getHeight(); j++){  
                     int color = alterBitmap.getPixel(i, j);  
                     int r = Color.red(color);  
                     int g = Color.green(color);  
                     int b = Color.blue(color);
                     int a = Color.alpha(color);
                     if(a == 80){
                    	 color = Color.argb(255, r, g, b);
                     }else{
                    	 color = Color.argb(a, r, g, b);
                     }
                     alterBitmap.setPixel(i, j, color);
                 }  
                 
             }  
            
    		 if(nowPosition > START_POSITION){
    			 for(int i= nowPosition - SHOW_WIDTH; i<nowPosition; i++){  
    	             for(int j=0; j<alterBitmap.getHeight(); j++){  
    	                 int color = alterBitmap.getPixel(i, j);         
    	                 int r = Color.red(color);  
    	                 int g = Color.green(color);  
    	                 int b = Color.blue(color);
    	                 int a = Color.alpha(color);
    	                 if( a > 200){
    	                	 color = Color.argb(80, r, g, b);
    	                 }else{
    	                	 color = Color.argb(a, r, g, b);
    	                 }
    	                 alterBitmap.setPixel(i, j, color);
    	             }  
    	             
    	         }  
    		 }
            setImageBitmap(alterBitmap);
    	}
    
    }
    
    三、实现具体解释

    1、构造方法中进行初始化操作

    	public SplashImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		TypedArray a = context.obtainStyledAttributes(attrs,
    				R.styleable.FuseImageView, 0, 0);
    		int resId = a.getResourceId(R.styleable.FuseImageView_imageSrc, 0);
    		int speed = a.getInt(R.styleable.FuseImageView_speed, 5);
    		this.speed = speed <= 0 ? 1 : speed;
    		Bitmap up = BitmapFactory.decodeResource(context.getResources(), resId);
    		alterBitmap = Bitmap.createBitmap(up.getWidth(), up.getHeight(),
    				up.getConfig());
    
    		canvas = new Canvas(alterBitmap);
    		paint = new Paint();
    		paint.setStrokeWidth(5);
    		paint.setColor(Color.BLACK);
    		canvas.drawBitmap(up, new Matrix(), paint);
    
    		setImageBitmap(alterBitmap);
    
    		if (getVisibility() == View.VISIBLE) {
    			if (handler == null) {
    				handler = new MyHandler(this);
    			}
    		}
    	}
    上面的TypedArray是自己定义的属性,在res/values文件夹下新建一个attrs.xml加入自己定义属性

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="FuseImageView">
            <attr name="imageSrc" format="reference" />
            <attr name="speed" format="integer" />
        </declare-styleable>
    </resources>
    这里是自己定义的两个属性,一个是图片资源ID还有一个是遮罩移动速度(事实上上面也能够继承自View来实现自己定义。我这里是有特殊须要才继承自ImageView的)

    然后通过BitmapFactory获取图片资源。并通过createBitmap方法创建一个可写的Bitmap资源给画布(Canvas)。将可写的Bitmap绘制到相同资源的背景上。

    底下的判读View是否可看见,是用来判读View是否可见,假设可见才开启线程进行动画的。不然的话开启线程绘制会浪费资源的(由于它根本就看不见)。

    2、怎样改变透明度而且绘制(onDraw方法)

    		for (int i = nowPosition; i < nowPosition + SHOW_WIDTH; i++) {
    			for (int j = 0; j < alterBitmap.getHeight(); j++) {
    				int color = alterBitmap.getPixel(i, j);
    				int r = Color.red(color);
    				int g = Color.green(color);
    				int b = Color.blue(color);
    				int a = Color.alpha(color);
    				if (a == 80) {
    					color = Color.argb(255, r, g, b);
    				} else {
    					color = Color.argb(a, r, g, b);
    				}
    				alterBitmap.setPixel(i, j, color);
    			}
    
    		}
    
    		if (nowPosition > START_POSITION) {
    			for (int i = nowPosition - SHOW_WIDTH; i < nowPosition; i++) {
    				for (int j = 0; j < alterBitmap.getHeight(); j++) {
    					int color = alterBitmap.getPixel(i, j);
    					int r = Color.red(color);
    					int g = Color.green(color);
    					int b = Color.blue(color);
    					int a = Color.alpha(color);
    					if (a > 200) {
    						color = Color.argb(80, r, g, b);
    					} else {
    						color = Color.argb(a, r, g, b);
    					}
    					alterBitmap.setPixel(i, j, color);
    				}
    
    			}
    		}
    主要是上面两个循环来实现绘制的,上面的循环是绘制一块区域来将文字的透明度调为最小(255),这一部分的文字就显示为高亮了,其余部分的文字透明度调值调为80,就会显示背景颜色,文字的暗度就会下降。

    3、怎样循环移动遮罩

    	private class MyHandler extends Handler {
    
    		private static final long SCALE = 10000;
    		private static final int MSG_PAINT = 1;
    
    		private final SplashImageView owner;
    		private final int speed;
    
    		private long angle;
    		private long lastTime;
    
    		public MyHandler(SplashImageView owner) {
    			this.owner = owner;
    			this.lastTime = SystemClock.elapsedRealtime();
    			this.speed = owner.speed;
    			sendEmptyMessage(MSG_PAINT);
    		}
    
    		@Override
    		public void handleMessage(Message msg) {
    			if (msg.what == MSG_PAINT) {
    				long now = SystemClock.elapsedRealtime();
    				long delta_time = now - lastTime;
    				System.out.println("delta_time = " + delta_time);
    				System.out.println("alterBitmap.Width = "
    						+ alterBitmap.getWidth());
    				if (nowPosition + speed >= alterBitmap.getWidth()
    						- START_POSITION - SHOW_WIDTH) {
    					if (isStop) {
    						handler.removeCallbacksAndMessages(null);
    						handler = null;
    						isStop = false;
    						return;
    					} else {
    						nowPosition = START_POSITION;
    					}
    				}
    				nowPosition = nowPosition + speed;
    				if (delta_time > 0) {
    					if (!notifiDraw(nowPosition)) {
    						return;
    					}
    				}
    				this.sendEmptyMessageDelayed(MSG_PAINT, 10);
    			}
    		}
    	}
    循环移动遮罩是写在一个线程中的。每隔10毫秒就去移动speed(配置的速度)的距离。来实现遮罩的移动效果,再取图片的宽度来推断是否已经到了最右边。


    总结:事实上上面的实现原理并不难。要点是要知道RGBA的知识和怎样去改变像素的透明度。这个不过个人临时想到的一个方法,假设有什么更好的方式实现。希望能交流一下。

    另外“阳光小强”的还有一篇博文《是男人就下100层【第三层】——高仿交通银行手机client界面》參加了CSDN举办的博文大赛。假设您认为这些博文对您有帮助。希望您投出您宝贵的一票。投票地址:http://vote.blog.csdn.net/Article/Details?articleid=30101091


    版权声明:本文博主原创文章,博客,未经同意不得转载。

    展开全文
  • 语言的形式可能是文字图片,也可能是闪烁、变色、大小对比等,但不论采用什么形式的“语言”,一个基本的要求是,确保用户能够“听”得懂。例如,应该尽量避免使用用户不理解的专业术语、含义不明确的符号、表意不...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0251 如何实现标题栏闪烁的窗体 170 0252 如何实现不可移动的窗体 170 0253 如何在不使用标题栏的情况下移动窗体 170 0254 使窗体标题栏文字右对齐 170 0255 在窗体标题栏上添加按钮 171 0256 取消窗体...
  • 实例081 文字闪烁效果 实例082 文字的空心效果 实例083 文字的浮雕效果 实例084 文字的阳文效果 实例085 文字的雪雕效果 实例086 文字的火焰效果 实例087 文字的扭曲动画 实例088 输出文字 3.6 图片滤镜...
  • 实例271 窗体的标题栏不响应鼠标双击事件 实例272 无标题对话框的拖动方法 实例273 灰度最大化与最小化关闭按钮 6.1 对话框的资源共享 实例274 支持多国语言切换的应用程序 实例275 如何实现窗体继承 实例...
  • 实例271 窗体的标题栏不响应鼠标双击事件 实例272 无标题对话框的拖动方法 实例273 灰度最大化与最小化关闭按钮 6.1 对话框的资源共享 实例274 支持多国语言切换的应用程序 实例275 如何实现窗体继承 实例...
  • VB编程资源大全

    2007-10-17 20:47:23
    (5KB) 50,1x1.zip 模仿东方快车界面(5KB) 51,map.zip 不规则区域的填充(71KB) 52,menuchangefont.zip 改变菜单的字体(5KB) 53,movetext.zip 如何图片上移动文字,看看本程序就知道了....
  • 光标不再闪烁.reg 系统还原占用的磁盘空间更小.reg 如何提高软驱的性能.reg 删除文档菜单中的我的文档选项.reg 设定开始菜单中文档的显示数量.reg 设定蓝屏时自启动.reg 设置DOS下的自动填充命令.reg 设置...
  • VC6风格界面

    2013-07-11 19:38:49
    ...................\VC编程中如何在界面上实现3D文字.doc ...................\VC编程实现IE风格的界面.doc ...................\VC编程实现IE风格的界面之叙述.doc ...................\VC设计分割视图通用...
  • Delphi7应用编程150例

    2018-04-05 15:23:33
    实例4 使窗体的标题栏闪烁 11 实例5 分割窗体的实现 13 实例6 动态抓取屏幕 15 实例7 编写带参数的应用程序 19 实例8 在程序运行过程中动态添加菜单 20 实例9 在菜单中加入图标 25 实例10 在窗体的系统菜单中添加...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字图片文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
  • 多媒体教室

    2013-06-14 08:10:31
    学生可以在输入框中输入文字来同教师进行交流,输入文字后敲回车键即可。也可以通过下拉框选择系统提供的默认文字,并敲回车键。  3.5 自动接收 正常条件下,学生机软件只要运行,就会自动登录系统,同时自动检测...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字图片文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字图片文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字图片文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
  • vc++ 应用源码包_4

    热门讨论 2012-09-15 14:38:35
    如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字图片文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
  • vc++ 应用源码包_3

    热门讨论 2012-09-15 14:33:15
    如题,此实例非常适合学习,重载并自绘了Wnd类,效果是上下文字图片文字由大到小和星星闪烁等滚动效果。实例使用了加载类似xml文件读取信息,然后显示。 COM_ATL_Tutorial 简单的atl控件演示 COM接口挂钩及其...
  • 本书在向个人电脑用户,系统而详细地讲解了电脑的常见故障,同时读者更直接、更深刻地了解电脑故障产生原因和排除方法,从而达到能够自己解决电脑故障的目的。 本书分10章,共有1000多个实例,编写时从产生电脑...
  • -重新设计模拟树的下拉列表的实现,避免选中某项后的闪烁。 +2009-11-21 v2.1.5 +Tree优化。 -修正Expanded项和Checked项的状态在回发改变后不能保持的BUG。 -GetNodeById更名为FindNode,保持和...
  • ExtAspNet_v2.3.2_dll

    2010-09-29 14:37:08
    -重新设计模拟树的下拉列表的实现,避免选中某项后的闪烁。 +2009-11-21 v2.1.5 +Tree优化。 -修正Expanded项和Checked项的状态在回发改变后不能保持的BUG。 -GetNodeById更名为FindNode,保持和...

空空如也

空空如也

1 2
收藏数 25
精华内容 10
关键字:

如何让图片文字闪烁