仿迅雷下载球

效果展示

这里写图片描述

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


    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值