高级UI具体自定义控件自定义控件

Android贝塞尔曲线动画

2020-03-20  本文已影响0人  爱写代码的小王子
image.png
前言:

利用贝塞尔曲线绘制类似波浪效果的优美曲线

概述:
展示:
Record_20200321181828(1).gif

原理:首先利用利用画板canvas绘制出贝塞尔曲线路径path,然后使用值动画改变曲线 path的起点,完成动态曲线的绘制

贝塞尔曲线方法

方法 参数 含义
path.move(x,y) (x,y)表示曲线起点 设置曲线起点
path.cubic(x1,y1,x2,y2,x3,y3) (x1,y1,x2,y2,x3,y3)分别表示曲线的起点,顶点,终点 三次贝塞尔曲线
path.cubic(x1,y1,x2,y2) (x1,y1,x2,y2)分别表示曲线的顶点,终点 二次贝塞尔曲线

二次贝塞尔曲线需要设置起点,三次贝塞尔曲线不需要

代码详解

自定义view

public class WaveView extends View {

初始化画板

    //初始化画笔
    private void initPaint(){
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DITHER_FLAG);
        mPaint.setStrokeWidth(mLineSize);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.BLACK);
    }

初始化路径(贝塞尔曲线路径)

 //初始化路径
    private void initPath(){
        mPath = new Path();
        centerY = getPivotY() + (float) getHeight()/2;
        mPath.moveTo(-waveLength,centerY);
        //贝塞尔曲线路径
        for (int start = -waveLength+speed;start<getWidth();start+=waveLength){
            mPath.cubicTo(start,centerY,start+waveLength/4,centerY-waveCrest,start+waveLength/2,centerY);
            mPath.cubicTo(start+waveLength/2,centerY,start+waveLength*3/4,centerY+waveCrest,start+waveLength,centerY);
        }
    }

初始化值动画(注意,这里并没有开启动画)

  //开启值动画,获取变化值
    private void startAnimator(){
        //变化长度
        va = ValueAnimator.ofInt(0,waveLength);
        //每0.5秒改变一次
        va.setDuration(500);
        //设置变化模式为反转
        va.setRepeatMode(ValueAnimator.REVERSE);
        //设置重复次数为无线循环
        va.setRepeatCount(ValueAnimator.INFINITE);
        //匀速变化
        va.setInterpolator(new LinearInterpolator());
        va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //获取变化值
                speed = (int) animation.getAnimatedValue();
                //刷新
                invalidate();
            }
        });
    }

开启动画

 //调用动画
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //开启动画
        //开起
        va.start();
    }

绘制曲线

 @Override
    protected void onDraw(Canvas canvas) {
        initPath();
        canvas.drawPath(mPath,mPaint);
    }

关闭动画(并未调用)

  //关闭动画
    private void closeAnimation(){
        if (va != null){
            va.cancel();
        }
    }

总结:简单了解了一下Android绘制动态曲线的方法,以后做一些安卓没有的控件也会有帮助。谢谢大家,写的不好的地方多包含~。

上一篇下一篇

猜你喜欢

热点阅读