效果展示
package com.example.administrator.mydrawpath.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
/**
* Created by Administrator on 2015/9/17.
*/
public class MyPath extends View {
private int width;
private int height;
private Paint mPaintPath;
private Path mPath;
private int range=5;
private Paint mPaintPoint;
private Bitmap mBitmap;
private Paint mPaintText;//用于记录水高占圆直径的百分比
private int size;//通过size的改变来让“流水的高度上涨”
private int count;//通过count的改变实现贝塞尔曲线的移动,以达到流动的效果
private static final int NEED_UPDATA = 0X22;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case NEED_UPDATA:
if (count < 80) {
count += 5;
} else {
count = 0;
}
if (size < 300) {
size++;
}
invalidate();
handler.sendEmptyMessageDelayed(NEED_UPDATA, 100);
break;
}
}
};
public MyPath(Context context) {
super(context);
}
public MyPath(Context context, AttributeSet attrs) {
super(context, attrs);
mPaintPath = new Paint();
mPaintPath.setColor(Color.BLUE);
mPaintPath.setAntiAlias(true);
mPaintPath.setStyle(Paint.Style.FILL);
mPaintPath.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//设置重叠方式
mPath = new Path();
mPaintPoint = new Paint();
mPaintPoint.setColor(Color.RED);
mPaintPoint.setStyle(Paint.Style.FILL);
mPaintText = new Paint();
mPaintText.setColor(Color.WHITE);
mPaintText.setTextSize(50);
mPaintText.setTextAlign(Paint.Align.CENTER);
handler.sendEmptyMessage(NEED_UPDATA);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
private Canvas mCanvas;
float x;
float y;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_DOWN:
x=event.getX();
y=event.getY();
if(200<x&&x<400&&y>200&&y<400){
range=15;//按下或移动时将水波的幅度变大
}
invalidate();
return true;
case MotionEvent.ACTION_UP:
range=5;//抬起时回复正常幅度
return true;
}
return super.onTouchEvent(event);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// mPath.moveTo(100,100);
canvas.drawColor(Color.GREEN);//设置画布的背景色
mPath.reset();
//用以下方法画一个上段是移动的贝塞尔曲线的长方形
mPath.moveTo(500, 450 - size);
mPath.lineTo(500, 500);
mPath.lineTo(count, 500);
mPath.lineTo(count, 450 - size);
for (int i = 0; i < 20; i++) {
mPath.rQuadTo(20, range, 40, 0);
mPath.rQuadTo(20, -range, 40, 0);
}
mPath.close();
mCanvas.drawCircle(300, 300, 150, mPaintPoint);//在Bitmap上画一个圆形外框
mCanvas.drawPath(mPath, mPaintPath);//在Bitmap上画上路径
mCanvas.drawText((float) (Math.round(size * 100 / 3f)) / 100 + "%", 300, 300, mPaintText);
canvas.drawBitmap(mBitmap, 0, 0, null);//将bitmap画到画布上
/**
* Canvas基本画图
* */
/*画三角形*/
// mPath.lineTo(0,200);
// mPath.lineTo(200,200);
// mPath.close();
/*画圆形,并在在圆形路径上写字*/
// mPath.addCircle(width/2,height/2,200, Path.Direction.CW);
// canvas.drawTextOnPath("写一写而已",mPath,0,0,mPaintPath);
// canvas.drawPath(mPath,mPaintPath);
/*贝塞尔曲线*/
// mPath.quadTo(100,400,300,300);
// canvas.drawPath(mPath,mPaintPath);
// canvas.drawPoint(100,100,mPaintPoint);
// canvas.drawPoint(100,400,mPaintPoint);
// canvas.drawPoint(300,300,mPaintPoint);
/*画波浪线*/
}
}