Android开发一款优美的加载控件

最近抽了点时间学习了Android自定义view,然后花了大概几天时间搞了个自己的一个款开源。让我们先来看看效果:

总体效果

本开源主要实现了一款精美、优雅的加载控件。她目前有两种类型:弧形加载(CircleProgressView)和水平加载(HorizontalProgressView),同时,你可以为她设置颜色渐变效果。

传送门地址:https://github.com/Moosphan/Material-ProgressView

欢迎大家献上宝贵的star和issue,我将继续努力完善它,也欢迎大家和我一起来优化它的功能,刚学习自定义view,有很多处理不当的地方希望指出来,谢谢,后续将提升它的定制性和动画等效果。

再来看看细节的效果图:

细节效果

下面我们来看看该如何使用这款控件。

快速开始

  • Gradle:

    build.gradle:

    compile 'com.moos:Material-ProgressView:1.0.4'
    

  • Maven:

    <dependency>
      <groupId>com.moos</groupId>
      <artifactId>Material-ProgressView</artifactId>
      <version>1.0.4</version>
      <type>pom</type>
    </dependency>
    
  • 通过xml文件来设置:

    <com.moos.library.CircleProgressView
            android:id="@+id/progressView_circle"
            android:layout_width="240dp"
            android:layout_height="240dp"
            android:layout_marginTop="12dp"
            app:start_progress="0"
            app:end_progress="60"
            app:start_color="@color/purple_end"
            app:end_color="@color/purple_start"
            app:circleBroken="true"
            app:isTracked="true"
            app:track_width="26dp"/>
    
    <com.moos.library.HorizontalProgressView
          android:id="@+id/progressView_horizontal"
          android:layout_width="320dp"
          android:layout_height="100dp"
          android:layout_marginBottom="40dp"
          android:layout_marginTop="36dp"
          app:start_color="@color/red_start"
          app:end_color="@color/red_end"
          app:track_width="12dp"
          app:end_progress="60"
          app:progressTextColor="#696969"
          app:corner_radius="12dp"
          app:isTracked="true"
          app:trackColor="#f4f4f4"/>
    

  • 通过java代码动态初始化属性:

    
            //CircleProgressView
            CircleProgressView circleProgressView = (CircleProgressView) view.findViewById(R.id.progressView_circle);
            circleProgressView.setStartProgress(0);
            circleProgressView.setEndProgress(80);
            circleProgressView.setStartColor(Color.parseColor("#FF8F5D"));
            circleProgressView.setEndColor(Color.parseColor("#F54EA2"));
            circleProgressView.setCircleBroken(true);
            circleProgressView.setTrackWidth(20);
            circleProgressView.setProgressDuration(2000);
            circleProgressView.setTrackEnabled(true);
            circleProgressView.setFillEnabled(false);
            circleProgressView.startProgressAnimation();
           
            //HorizontalProgressView
            HorizontalProgressView circleProgressView = (HorizontalProgressView)              view.findViewById(R.id.progressView_horizontal);
            horizontalProgressView.setStartProgress(0);
            horizontalProgressView.setEndProgress(80);
            horizontalProgressView.setStartColor(Color.parseColor("#FF8F5D"));
            horizontalProgressView.setEndColor(Color.parseColor("#F54EA2"));
            horizontalProgressView.setTrackWidth(30);
            horizontalProgressView.setProgressDuration(2000);
            horizontalProgressView.setTrackEnabled(true);
            horizontalProgressView.setProgressCornerRadius(20);
            horizontalProgressView.setProgressTextPaddingBottom(12);
            horizontalProgressView.startProgressAnimation();
    
    
  • 此外,如果你想要让水平加载控件上方的百分比数值跟随其运动,可以这样设置:

    1. 通过xml设置:
            app:textMovedEnable="true"
    
    1. 通过java代码:
            horizontalProgressView.setProgressTextMoved(true);
    

    然后你会看到如下效果:

    文字跟随
  • 如果想要根据给定值来动态设置加载控件的进度值(如加载进度和上传进度等),可以通过方法setProgress,如:

    
    ......
          //上传或者下载的回调
          @Override
          public void onDownloading(float progress) {
              // 由于是动态设置进度值,无需再调用`startProgressAnimation`方法来启动进度的刷新了
              horizontalProgressView.setProgress(progress);
          }
    
    ......
    

相关文档

  • 控件属性
  1. 共有属性:

    Attribute Description
    start_progress 起始进度
    end_progress 终止进度
    start_color 渐变效果的起始颜色
    end_color 渐变效果的终止颜色
    isTracked 是否显示轨迹背景
    track_width 进度条的宽度(边界宽度)
    trackColor 轨迹背景的颜色
    progressTextVisibility 是否显示进度值文本
    progressTextColor 进度值的颜色
    progressTextSize 进度值的文本字体大小
    progressDuration 动画时长
    animateType 动画类型(可以参考属性动画的TimeInterpolator)
  2. CircleProgressView的特有属性:

    Attribute Description
    isFilled 是否内部填充
    circleBroken 是选择圆形还是弧形进度条
  3. HorizontalProgressView的特有属性:

    Attribute Description
    corner_radius 圆角半径
    text_padding_bottom 文字距离view的padding
    textMovedEnable 设置进度值是否跟随控件动画移动
  • 回调

        /**
         * 你可以利用该回调来定制自己的progress值的UI展示
         */
    
        circleProgressView.setProgressViewUpdateListener(new CircleProgressView.CircleProgressUpdateListener() {
        
        @Override
        public void onCircleProgressStart(View view) {
    
        }
    
        @Override
        public void onCircleProgressUpdate(View view,float progress) {
     
            int progressInt = (int) progress;
            textView.setText(String.valueOf(progress)+"%");
        }
    
        @Override
        public void onCircleProgressFinished(View view) {
    
        }
    });
    
    horizontalProgressView.setProgressViewUpdateListener(new HorizontalProgressView.HorizontalProgressUpdateListener() {
        
        @Override
        public void onHorizontalProgressStart(View view) {
    
        }
    
        @Override
        public void onHorizontalProgressUpdate(View view,float progress) {
         
            int progressInt = (int) progress;
            textView.setText(String.valueOf(progress)+"%");
        }
    
        @Override
        public void onHorizontalProgressFinished(View view) {
    
        }
    });
    
  • Methods

    //共有的方法
    void setAnimateType(@AnimateType int type);
    void setStartProgress(float startProgress);
    void setEndProgress(float endProgress);
    void setStartColor(@ColorInt int startColor);
    void setEndColor(@ColorInt int endColor);
    void setTrackWidth(int width);
    void setProgressTextSize(int size);
    void setProgressTextColor(@ColorInt int textColor);
    void setProgressDuration(int duration);
    void setTrackEnabled(boolean trackAble);
    void setTrackColor(@ColorInt int color);
    void setProgressTextVisibility(boolean visibility);
    void startProgressAnimation();
    void stopProgressAnimation();
    
    //CircleProgressView的特有方法
    void setCircleBroken(boolean isBroken);
    void setFillEnabled(boolean fillEnabled);
    
    //HorizontalProgressView的特有方法
    void setProgressCornerRadius(int radius);
    void setProgressTextPaddingBottom(int offset);
    
    

demo下载地址

ProgressView-sample.apk

更新记录

  • V1.0.1(2018-03-16):为加载控件提供进度回调
  • V1.0.2(2018-03-22):为水平进度条提供进度值的跟随动画
  • V1.0.3(2018-04-12):增加弧形加载控件的刻度效果
  • V1.0.4(2018-05-03):支持动态设置加载控件的进度值(下载/上传进度等)

特别感谢

HenCoder

VisualCC

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容