水波纹效果----单环波纹

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Bitmap.Config;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

/**
 * 水波纹View
 * @author lixiao
 *
 */
public class WaterView extends View{
	
	/**
	 * 不透明度(完全透明:0)
	 */
	private int alpha;
	private int radius;
	
	private Paint mPaint;
	
	private int widthScreen;
	private int heightScreen;
	
	private Handler mHandler;
	/**
	 * 图片直径
	 */
	private  static final int MIN = 50; 
	
	public WaterView(Context context,Bitmap source) {
		super(context);
		init();
		
		//获取屏幕的宽高
		DisplayMetrics dm = getResources().getDisplayMetrics();
		widthScreen = dm.widthPixels;
		heightScreen = dm.heightPixels;
		
		mHandler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				switch (msg.what) {
				case 0:
					flushState();
					WaterView.this.invalidate();
					
					if(alpha !=0){
						mHandler.sendEmptyMessageDelayed(0, 50);
					}else{
						mHandler.sendEmptyMessage(1);
					}
					
					break;

				case 1:
					init();
					WaterView.this.invalidate();
					mHandler.sendEmptyMessage(0);
					
					break;
				
				default:
					break;
				}
			}
		};
		
		mHandler.sendEmptyMessage(0);
	}
	
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// TODO Auto-generated method stub
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}
	
	
	
	@Override
	protected void onDraw(Canvas canvas) {
		Log.i("TAG", "onDraw......");
		super.onDraw(canvas);		
		//画圆
		canvas.drawCircle(widthScreen/2, this.getHeight()/2, radius, mPaint);
	}
	
	
	private void init() {
		alpha = 255;
		radius = MIN/2 ;
		initPaint();
		
		
	}
	
	private void flushState() {
		radius  +=10;
		alpha  -=10;//控制速度,值越大,圆环扩大越快
		
		if(alpha <= 0){
			
			alpha = 0 ;
		}
		mPaint.setAlpha(alpha);

	}
	
	
	private void initPaint() {
		//新建一个画笔
		mPaint = new Paint();
		mPaint.setAntiAlias(true);//设置抗锯齿
		mPaint.setStrokeWidth((float) 1);//设置线宽10
		mPaint.setStyle(Paint.Style.STROKE);//设置空心画笔,环形方式绘制
		
		mPaint.setAlpha(alpha);
		mPaint.setColor(Color.BLUE);
	}
	
	
	/**
	 * 绘制圆形图片(暂时没用到)
	 * @param source 图片资源
	 * @param min 直径
	 * @return
	 */
	private Bitmap createCircleBitmap(Bitmap source,int min){
		Paint paint = new Paint();
		paint.setColor(Color.parseColor("#FFFFFF"));
		paint.setAntiAlias(true);//抗锯齿
		
		Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);
		/**
		 * 产生同样大小的画布
		 */
		Canvas canvas = new Canvas(target);
		
		/**
		 * 首先绘制圆形
		 */
		canvas.drawCircle(widthScreen/2, this.getHeight()/2, min/2, paint);
		/**
		 * 使用SRC_IN(关键代码)
		 */
		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
		/**
		 * 缩放图片
		 */
		 //获取这个图片的宽和高
        int width = source.getWidth();
        int height = source.getHeight();
		//计算缩放率,新尺寸除原始尺寸
        float scaleWidth = ((float) min) / width;
        float scaleHeight = ((float) min) / height;
        
        // 创建操作图片用的matrix对象
        Matrix matrix = new Matrix();
        
        // 缩放图片动作
        matrix.postScale(scaleWidth, scaleHeight);
        
        //旋转图片 动作
//        matrix.postRotate(45);
        
        // 创建新的图片
        Bitmap newBitmap = Bitmap.createBitmap(source, 0, 0,
        width, height, matrix, true);
		/**
		 * 绘制图片
		 */		
		canvas.drawBitmap(newBitmap, 0, 0, paint);
		
		
		return target;
	}

	

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值