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;
}
}
水波纹效果----单环波纹
最新推荐文章于 2024-03-01 11:00:35 发布