美文网首页
自定义View之EMUI更新动画

自定义View之EMUI更新动画

作者: 普通上班族 | 来源:发表于2018-11-26 00:11 被阅读0次
update.gif

更新效果

因为view为圆型,我们需要在onMeasure中设置它长等于宽

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        setMeasuredDimension(width>height?height:width, width>height?height:width);
    }

思路:先绘制一圈灰色的圆环,蓝色圆弧动态覆盖

首先是灰色圆环

      //初始灰色底圈

       //创建一个Path
        Path originPath = new Path();
        RectF originRect = new RectF(0,0,getWidth(),getHeight());
        //圆环起点在第一象限与第四象限交界处,顺时针旋转270°后才是12点方向
        originPath.addArc(originRect,270,360);

        //虚线
        Path originRectPath = new Path();
       //设置虚线的长宽和排列方式
        originRectPath.addRect(0,0,4,24,Path.Direction.CCW);     
        PathEffect originPathEffect = new PathDashPathEffect(originRectPath, 14,8, PathDashPathEffect.Style.ROTATE);
        //填充虚线
        mOriginPaint.setPathEffect(originPathEffect);
        canvas.drawPath(originPath,mOriginPaint);

用同样方式绘制蓝色圆弧,通过动态修改progress实现蓝色圆弧变化

     Path changePath = new Path();  
     RectF changeRect = new RectF(0,0,getWidth(),getHeight());
     changePath.addArc(changeRect,270,progress*360);
     Path changeRectPath = new Path();
     changeRectPath.addRect(0,0,4,mBorderWidth,Path.Direction.CCW);
      PathEffect changePathEffect = new PathDashPathEffect(changeRectPath, 14,8, PathDashPathEffect.Style.ROTATE);
            mChangePaint.setPathEffect(changePathEffect);
     canvas.drawPath(changePath,mChangePaint);

在java代码中调用setProgress就可以控制蓝色圆环,如顶部图片效果

  public  void setProgress(float progress){
        this.progress = progress;
        invalidate();
    }

检查更新

完成更新效果后,再来看下检查更新的动画(图片为压缩采样后得效果,看着不太顺滑)


check.gif

思路依然是蓝色覆盖灰色

灰色圆环复用之前代码... 省略

蓝色圆弧,这里把圆弧设置为60度,通过修改startAngle起始角度实现动态效果

            Path changePath = new Path();
            //检查更新
            RectF updateRect = new RectF(0,0,getWidth(),getHeight());
             //                        圆弧起始角度,扫过角度
            changePath.addArc(updateRect,startAngle,60);
            Path updateRectPath = new Path();
            updateRectPath.addRect(0,0,4,mBorderWidth,Path.Direction.CCW);
            PathEffect changePathEffect = new PathDashPathEffect(updateRectPath, 14,8, PathDashPathEffect.Style.ROTATE);
            mChangePaint.setPathEffect(changePathEffect);
            canvas.drawPath(changePath,mChangePaint);

设置动画属性,同之前提过的初始角度在第一象限,第四象限交界处,这里的起始截至位置非0度-360度,而是270-630

  private void initCheckAnimator(){
      
        checkAnimator = ValueAnimator.ofFloat(270, 630);
        checkAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                startAngle = ((Float) animation.getAnimatedValue());
                invalidate();
            }
        });
        
        checkAnimator.setInterpolator(null);//去掉默认插值器
        checkAnimator.setDuration(1000);  //1s循环一次
        checkAnimator.setRepeatCount(-1);//无限重复
        checkAnimator.start();
    }

在java代码中调用check()和stopCheck()开始和停止动画

  public synchronized void check(){
        initCheckAnimator();
        invalidate();
    }
    public void stopCheck(){
        if (checkAnimator!=null&&checkAnimator.isStarted()){
            checkAnimator.end();
        }
    }

相关文章

  • 自定义View之EMUI更新动画

    更新效果 因为view为圆型,我们需要在onMeasure中设置它长等于宽 思路:先绘制一圈灰色的圆环,蓝色圆弧动...

  • 动画深入研究

    前言 分类 View动画,帧动画,自定义View动画,属性动画 View动画 平移,缩放,旋转,透明Transla...

  • Android自定义View之高仿QQ健康

    源码有更新:加入动画,动画由简书网友xsfelvis提供 我们都知道自定义View一般有三种直接继承View、继承...

  • iOS review系列之使用Segues

    iOS review系列之自定义转场动画iOS review系列之Presenting a View Contro...

  • 自定义View之app更新动画

    为了做一个有温度的IT男,我决定在以后的文章中给大家分享一些看到的,听到的一些东西,如果你不喜欢请留言让我知道,如...

  • 自定义控件三部曲

    启航的自定义控件三部曲文章索引 扔物线的自定义View(HenCoder) 动画篇 自定义控件三部曲之动画篇(一)...

  • Android中View的更新方法:invalidate()和r

    前言我们在自定义View时可能需要更新View的显示,比如为View添加动画等等,有两个方法是我们经常会用到的:i...

  • Android - 自定义View和属性动画 ValueAnim

    自定义View和属性动画ValueAnimator实现圆点指示器 自定义View和属性动画相结合实现支持动态修改指...

  • Android动画深入分析

    导语 本章学习内容:介绍View动画和自定义View动画,View动画一些特殊的使用场景,对属性动画全面性的介绍,...

  • Android开发之属性动画

    Android动画主要分为3种 View动画(Android开发之View动画) 帧动画(Android开发之帧动...

网友评论

      本文标题:自定义View之EMUI更新动画

      本文链接:https://www.haomeiwen.com/subject/sdnmqqtx.html