android自定义view 模仿win10进度条

本文详细介绍了如何在Android中创建一个模仿Win10风格的进度条,通过使用PathMeasure和ValueAnimator实现动画效果。流程包括从单个点的匀速圆周运动到多个点按特定速度变化、间距线性减小,最终合并为一个点的平滑动画。文章提供了关键步骤的思路和代码示例。
摘要由CSDN通过智能技术生成

android自定义view 模仿win10进度条

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。


PS:有朋友反映动画无法播放,那是因为PathMeasure.getLength()只在KITKAT以上版本有效,而对于以下版本一定要关闭硬件加速才有效。

先上预览图:

预览图

流程

  • 1.一个匀速圆周运动的点
  • 2.多个匀速圆周运动的点
  • 3.多个圆周运动的点,速度由快到慢
  • 4.点与点之间的间距线性减少,动画的最后合为一个点
  • 5.为了让动画看起来更加流畅,需要在动画即将结束的时候手动绘制点

核心控件

  • PathMeasure:截取Path中的一部分并显示
  • ValueAnimator:完成动画从初始值平滑的过度到结束值的效果,同时还负责管理动画的播放次数、播放模式、以及对动画设置监听器等

流程一

思路

  1. 先用path画一个圆
  2. ValueAnimator设置为0f-1f的平滑
  3. 用PathMeasure根据ValueAnimator返回的值截取path上的一个点
    private Paint mPaint;
    private Path mPath;
    private PathMeasure mPathMeasure;
    private int mWidth,mHeight;
    private ValueAnimator valueAnimator;
    //用这个来接受ValueAnimator的返回值,代表整个动画的进度
    private float t;
  • 初始化画笔
    mPaint = new Paint();
    mPaint.setStyle(Paint.Style.STROKE);
    mPaint.setStrokeWidth(15);
    mPaint.setColor(Color.WHITE);
    //设置画笔为园笔
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    //抗锯齿
    mPaint.setAntiAlias(true);
  • 初始化Path和mPathMeasure
    这里角度不能选360,否则会测量失误,具体原因和android的内部优化有关
    mPath = new Path();
    RectF rect = new RectF(-150,-150,150,150);
    mPath.addArc(rect,-90,359.9f);
    mPathMeasure = new PathMeasure(mPath,false);
  • 初始化ValueAnimator
        valueAnimator = ValueAnimator.ofFloat(0f,1f).setDuration(3000);
        valueAnimator.setRepeatCount(-1);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                t = (float) animation.getAnimatedValue();
                invalidate();
            }
        });

这里的ValueAnimator设置的是一个时长3秒的动画,再这3秒中,ValueAnimator会返回一个由0f-1f平滑的数字
ValueAnimator.ofFloat(0f,1f).setDuration(3000)
在这里我们用t来接受返回值,同时刷新视图

t = (float) animation.getAnimatedValue();
invalidate();

这里写图片描述
这里可以看出t的值,有0到1࿰

评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值