利用贝塞尔曲线绘制水波纹动态图案

贝塞尔曲线可以通过设置很少的控制点,来绘制想要的平滑的曲线。下面是我使用贝塞尔曲线实现的水波纹效果,直接贴出关键代码

public class BezierView extends View {

    private static final String TAG = "BezierView";

    private Paint mPaint;

    private Path mBezierPath;

    private ValueAnimator valueAnimator;

    private static final int waveWidth = 160;

    private static final int waveHeight = 80;

    int offset = 0;
    public BezierView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(Color.YELLOW);

        mBezierPath = new Path();

        valueAnimator = ValueAnimator.ofInt(0,waveWidth*2); //这里需要设置两个波形的长度,这样上旋和下旋才能完整显示
        valueAnimator.setDuration(1200);
        valueAnimator.setRepeatCount(-1); //设置一直重复
        valueAnimator.setInterpolator(new LinearInterpolator()); //这里设置线性插值器,保证平滑不卡顿
         valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                int value = (int) valueAnimator.getAnimatedValue();
                offset = value;
                Log.d(TAG,"offset:" + offset);
                postInvalidate();
            }
        });
        valueAnimator.start();

    }
    

然后在ondraw里面去绘制贝塞尔曲线

 @Override
    protected void onDraw(Canvas canvas) {

        mBezierPath.reset();

        int startx = offset - waveWidth*2;
        //设置起始点
        mBezierPath.moveTo(startx,getHeight()/2 -100);

//        //获取贝塞尔曲线路径,这里传入的是控制点和终点,都是绝对的坐标值
//        mBezierPath.quadTo(startx + waveWidth/2 ,mControlPoint.y,offset,mEndPoint.y);


        for (int i = -waveWidth ; i <= getWidth() ; i += waveWidth*2){
            //这里是相对于上一个曲线的终点位置,添加控制点和终点,值都是相对坐标值。这是一个完整的波形
            mBezierPath.rQuadTo(waveWidth/2,waveHeight/2,waveWidth,0);

            mBezierPath.rQuadTo(waveWidth/2,-waveHeight/2,waveWidth,0);
        }
       //封闭曲线
        mBezierPath.lineTo(getWidth(),getHeight());
        mBezierPath.lineTo(0,getHeight());
        mBezierPath.close();

        //绘制贝塞尔曲线
        canvas.drawPath(mBezierPath,mPaint);

    }

实现的效果如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值