效果展示

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(200400&&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);        /*画波浪线*/    }}

更多相关文章

  1. Android中View,SurfaceView和GLSurfaceView绘图的区别
  2. 【Android】View类详解 (游戏开发必备)
  3. Android(安卓)自定义控件一 带圆形进度的按钮 ControlButton2
  4. 自定义圆形ProgressBar
  5. Android圆形图片控件RoundedImageView
  6. Android中SurfaceView的使用
  7. Android(安卓)L 沉浸式状态栏和圆形动画实现炫酷效果
  8. Android(安卓)自定义签字板
  9. bitmap与canvas android

随机推荐

  1. 教你如何开关Android的APN网络
  2. Android中使用WebView, WebChromeClient
  3. Android中Message机制的灵活应用(一)
  4. Android(安卓)下的 bolts tasks
  5. Android之硬件加速
  6. Android(安卓)输入法/ 软键盘 显示模式
  7. Android中Activity启动模式详解
  8. Android之网络连接判断
  9. Android判断ListView滚动到最顶部第0条it
  10. Android日常整理(三)---intent打开浏览器、