Android 进度条按钮ProgressButton的实现代码

有些App在点击下载按钮的时候,可以在按钮上显示进度,我们可以通过继承原生Button,重写onDraw来实现带进度条的按钮。

Github:https://github.com/imcloudfloating/ProgressBar

1.效果:

2.原理:

创建三个GradientDrawable作为按钮背景、进度条背景和进度条前景,通过计算进度条的百分比来设置宽度,然后调用invalidate()重绘。GradientDrawable设置颜色、圆角等参数,当然你也可以直接加载xml作为背景。

3.自定义参数:

在values目录建一个attrs.xml文件

 <?xml version="." encoding="utf-"?>
 <resources>
  <attr name="progressColor" format="color" />
  <attr name="progressBackColor" format="color" />
  <attr name="progress" format="integer" />
  <attr name="minProgress" format="integer" />
  <attr name="maxProgress" format="integer" />
  <declare-styleable name="ProgressButton">
   <attr name="progressColor" />
   <attr name="progressBackColor" />
   <attr name="buttonColor" format="color" />
   <attr name="cornerRadius" format="dimension" />
   <attr name="progress" />
   <attr name="minProgress" />
   <attr name="maxProgress" />
   <attr name="progressMargin" format="dimension" />
  </declare-styleable>
 </resources>

3.按钮类:

在setProgress方法中改变mProgress的值,然后调用invalidate()重绘,因为我这里定义了一个minProgress(默认为0),所以在计算进度条宽度的时候,当前进度和最大进度都要先减去minProgress再做除法。

if (progressWidth < mCornerRadius * 2) {
 progressWidth = mCornerRadius * 2;
}

当进度条宽度小于2倍圆角半径的时候,进度条的圆角就和背景的圆角不一致,所以加上了上面这段代码。
获取宽度和高度其实用getWidth()和getHeight()也可以,只不过在设计器中没法看到效果,所以我用了getMeasuredWidth()和getMeasuredHeight()。

 package com.cloud.customviews;
 import android.content.Context;
 import android.content.res.TypedArray;
 import android.graphics.Canvas;
 import android.graphics.drawable.GradientDrawable;
 import android.support.v.widget.AppCompatButton;
 import android.util.AttributeSet;
 public class ProgressButton extends AppCompatButton {
  private float mCornerRadius = ;
  private float mProgressMargin = ;
  private boolean mFinish;
  private int mProgress;
  private int mMaxProgress = ;
  private int mMinProgress = ;
  private GradientDrawable mDrawableButton;
  private GradientDrawable mDrawableProgressBackground;
  private GradientDrawable mDrawableProgress;
  public ProgressButton(Context context, AttributeSet attrs) {
   super(context, attrs);
   initialize(context, attrs);
  }
  public ProgressButton(Context context, AttributeSet attrs, int defStyle) {
   super(context, attrs, defStyle);
   initialize(context, attrs);
  }
  private void initialize(Context context, AttributeSet attrs) {
   //Progress background drawable
   mDrawableProgressBackground = new GradientDrawable();
   //Progress drawable
   mDrawableProgress = new GradientDrawable();
   //Normal drawable
   mDrawableButton = new GradientDrawable();
   //Get default normal color
   int defaultButtonColor = getResources().getColor(R.color.colorGray, null);
   //Get default progress color
   int defaultProgressColor = getResources().getColor(R.color.colorGreen, null);
   //Get default progress background color
   int defaultBackColor = getResources().getColor(R.color.colorGray, null);
   TypedArray attr = context.obtainStyledAttributes(attrs, R.styleable.ProgressButton);
   try {
    mProgressMargin = attr.getDimension(R.styleable.ProgressButton_progressMargin, mProgressMargin);
    mCornerRadius = attr.getDimension(R.styleable.ProgressButton_cornerRadius, mCornerRadius);
    //Get custom normal color
    int buttonColor = attr.getColor(R.styleable.ProgressButton_buttonColor, defaultButtonColor);
    //Set normal color
    mDrawableButton.setColor(buttonColor);
    //Get custom progress background color
    int progressBackColor = attr.getColor(R.styleable.ProgressButton_progressBackColor, defaultBackColor);
    //Set progress background drawable color
    mDrawableProgressBackground.setColor(progressBackColor);
    //Get custom progress color
    int progressColor = attr.getColor(R.styleable.ProgressButton_progressColor, defaultProgressColor);
    //Set progress drawable color
    mDrawableProgress.setColor(progressColor);
    //Get default progress
    mProgress = attr.getInteger(R.styleable.ProgressButton_progress, mProgress);
    //Get minimum progress
    mMinProgress = attr.getInteger(R.styleable.ProgressButton_minProgress, mMinProgress);
    //Get maximize progress
    mMaxProgress = attr.getInteger(R.styleable.ProgressButton_maxProgress, mMaxProgress);
   } finally {
    attr.recycle();
   }
   //Set corner radius
   mDrawableButton.setCornerRadius(mCornerRadius);
   mDrawableProgressBackground.setCornerRadius(mCornerRadius);
   mDrawableProgress.setCornerRadius(mCornerRadius - mProgressMargin);
   setBackgroundDrawable(mDrawableButton);
   mFinish = false;
  }
  @Override
  protected void onDraw(Canvas canvas) {
   if (mProgress > mMinProgress && mProgress <= mMaxProgress && !mFinish) {
    //Calculate the width of progress
    float progressWidth =
      (float) getMeasuredWidth() * ((float) (mProgress - mMinProgress) / mMaxProgress - mMinProgress);
    //If progress width less than x corner radius, the radius of progress will be wrong
    if (progressWidth < mCornerRadius * ) {
     progressWidth = mCornerRadius * ;
    }
    //Set rect of progress
    mDrawableProgress.setBounds((int) mProgressMargin, (int) mProgressMargin,
      (int) (progressWidth - mProgressMargin), getMeasuredHeight() - (int) mProgressMargin);
    //Draw progress
    mDrawableProgress.draw(canvas);
    if (mProgress == mMaxProgress) {
     setBackgroundDrawable(mDrawableButton);
     mFinish = true;
    }
   }
   super.onDraw(canvas);
  }
  /**
  * Set current progress
  */
  public void setProgress(int progress) {
   if (!mFinish) {
    mProgress = progress;
    setBackgroundDrawable(mDrawableProgressBackground);
    invalidate();
   }
  }
  public void setMaxProgress(int maxProgress) {
   mMaxProgress = maxProgress;
  }
  public void setMinProgress(int minProgress) {
   mMinProgress = minProgress;
  }
  public void reset() {
   mFinish = false;
   mProgress = mMinProgress;
  }
 }

使用:

 <com.cloud.customviews.ProgressButton
    android:id="@+id/button_progress_green"
    android:layout_width="dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="dp"
    android:textAllCaps="false"
    android:textColor="@color/colorWhite"
    android:text="@string/button_progress"
    app:cornerRadius="dp"
    app:progressMargin="dp"
    app:progressColor="@color/colorGreen"
    app:buttonColor="@color/colorGreen" />

总结

以上所述是小编给大家介绍的Android 进度条按钮ProgressButton的实现代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言小编会及时回复大家的!

(0)

相关推荐

  • Android实现简洁的APP更新dialog数字进度条

    前言:现在一般的Android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新.当有更新时,会弹出一个提示框,点击下载,则在通知来创建一个数字进度条进行下载,下载成功后才到安装界面. 效果:  开发环境:AndroidStudio2.2.1+gradle-2.14.1 涉及知识: 1.Handler机制 2.自定义控件+Canvas绘画 3.自定义dialog 部分代码: public class NumberProgressBar extends V

  • Android studio圆形进度条 百分数跟随变化

    本文实例为大家分享了Android studio圆形进度条展示的具体代码,供大家参考,具体内容如下 MainActivity import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity impl

  • Android自定义View之圆形进度条式按钮

    介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

  • android中实现OkHttp下载文件并带进度条

    OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作.下面我们用OkHttp来下载文件并带进度条! 相关资料: 官网地址:http://square.github.io/okhttp/ github源码地址:https://github.com/square/okhttp 一.服务器端简单搭建 可以参考搭建本地Tomcat服务器及相关配置这篇文章. 新建项目OkHttpServer,在WebContent目录下新建downloadfile目录

  • Android 进度条按钮ProgressButton的实现代码

    有些App在点击下载按钮的时候,可以在按钮上显示进度,我们可以通过继承原生Button,重写onDraw来实现带进度条的按钮. Github:https://github.com/imcloudfloating/ProgressBar 1.效果: 2.原理: 创建三个GradientDrawable作为按钮背景.进度条背景和进度条前景,通过计算进度条的百分比来设置宽度,然后调用invalidate()重绘.GradientDrawable设置颜色.圆角等参数,当然你也可以直接加载xml作为背景.

  • Android 进度条 ProgressBar的实现代码(隐藏、出现、加载进度)

    初识进度条ProgressBar 软件:Android Studio 实现: 1.点击按钮,进度条隐藏:再次点击,进度条出现.循环 2.点击按钮,水平进度条进度呈现并+10,此处进度条max为100.循环 1.圆形进度条 练习 <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progress_b

  • Android 进度条使用详解及示例代码

    在这里,总结一下loading进度条的使用简单总结一下. 一.说起进度条,必须说说条形进度条,经常都会使用到嘛,特别是下载文件进度等等,还有像腾讯QQ安装进度条一样,有个进度总给人良好的用户体验. 先来找图看看,做这个图完成不用图片就可以做到了. 看下xml布局文件,其实就是直接用xml写的在加两个属性设置一下就好了,一个style,另一个是background. <ProgressBar android:id="@+id/pb_progressbar" style="

  • Android 自定义view实现进度条加载效果实例代码

    这个其实很简单,思路是这样的,就是拿view的宽度,除以点的点的宽度+二个点 之间的间距,就可以算出大概能画出几个点出来,然后就通过canvas画出点,再然后就是每隔多少时间把上面移动的点不断的去改变它的坐标就可以, 效果如下: 分析图: 代码如下: package com.example.dotloadview; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bit

  • Android 进度条自动前进效果的实现代码

    今天给大家分享进度条自动前进功能的实现,先给大家分享实现效果图,感觉不错可以参考实现代码. 效果如下图: 首先布局要设置进度条最大值: <ProgressBar android:id="@+id/pro1" style="@android:style/Widget.ProgressBar.Horizontal" android:layout_width="400dp" android:layout_centerHorizontal=&quo

  • Android环形进度条(安卓默认形式)实例代码

    Android开发中,有很多的功能在实际应用中都起了很大的作用,比如android进度条的实现方式,下面给大家介绍Android环形进度条(安卓默认形式),具体内容如下所示: .xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_widt

  • android 进度条组件ProgressBar

    首先是main.xml文件 代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="fill_parent" androi

  • PHP+AjaxForm异步带进度条上传文件实例代码

    在使用ajaxForm方法之前,首先需要安装form.js的插件,网上有: 一.首先说用法,ajaxForm可以接收0或1个参数,该参数可以是一个变量.一个对象或回调函数,这个对象主要有以下参数: var object= { url:url, //form提交数据的地址 type:type, //form提交的方式(method:post/get) target:target, //服务器返回的响应数据显示的元素(Id)号 beforeSerialize:function(){} //序列化提交

  • Android 进度条显示在标题栏的实现方法

    好吧,先给大家展示效果图: xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" > <Butt

  • android自定义进度条渐变色View的实例代码

    最近在公司,项目不是很忙了,偶尔看见一个兄台在CSDN求助,帮忙要一个自定义的渐变色进度条,我当时看了一下进度条,感觉挺漂亮的,就尝试的去自定义view实现了一个,废话不说,先上图吧! 这个自定义的view,完全脱离了android自带的ProgressView,并且没使用一张图片,这样就能更好的降低程序代码上的耦合性! 下面我贴出代码  ,大概讲解一下实现思路吧! 复制代码 代码如下: package com.spring.progressview; import android.conten

随机推荐