Android自定义漂亮的圆形进度条

 更新时间:2017年1月22日 11:04  点击:1538
本文介绍了Android自定义漂亮的圆形进度条的教程,实现后效果很棒,大家可以动手尝试一下哦!

这几天对Android中实现画圆弧及圆弧效果中所实现的效果进行了修改,改为进度圆心进度条,效果如图所示

TasksCompletedView.java 代码如下

 

 代码如下复制代码

importandroid.content.Context;

importandroid.content.res.TypedArray;

importandroid.graphics.Canvas;

importandroid.graphics.Paint;

importandroid.graphics.RectF;

importandroid.graphics.Paint.FontMetrics;

importandroid.util.AttributeSet;

importandroid.view.View;

  

importcom.snailws.taskscompleted.R;

  

/**

* @author naiyu(http://snailws.com)

* @version 1.0

*/

publicclassTasksCompletedViewextendsView {

  

    // 画实心圆的画笔

    privatePaint mCirclePaint;

    // 画圆环的画笔

    privatePaint mRingPaint;

    // 画字体的画笔

    privatePaint mTextPaint;

    // 圆形颜色

    privateintmCircleColor;

    // 圆环颜色

    privateintmRingColor;

    // 半径

    privatefloatmRadius;

    // 圆环半径

    privatefloatmRingRadius;

    // 圆环宽度

    privatefloatmStrokeWidth;

    // 圆心x坐标

    privateintmXCenter;

    // 圆心y坐标

    privateintmYCenter;

    // 字的长度

    privatefloatmTxtWidth;

    // 字的高度

    privatefloatmTxtHeight;

    // 总进度

    privateintmTotalProgress =100;

    // 当前进度

    privateintmProgress;

  

    publicTasksCompletedView(Context context, AttributeSet attrs) {

        super(context, attrs);

        // 获取自定义的属性

        initAttrs(context, attrs);

        initVariable();

    }

  

    privatevoidinitAttrs(Context context, AttributeSet attrs) {

        TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,

                R.styleable.TasksCompletedView,0,0);

        mRadius = typeArray.getDimension(R.styleable.TasksCompletedView_radius,80);

        mStrokeWidth = typeArray.getDimension(R.styleable.TasksCompletedView_strokeWidth,10);

        mCircleColor = typeArray.getColor(R.styleable.TasksCompletedView_circleColor,0xFFFFFFFF);

        mRingColor = typeArray.getColor(R.styleable.TasksCompletedView_ringColor,0xFFFFFFFF);

          

        mRingRadius = mRadius + mStrokeWidth /2;

    }

  

    privatevoidinitVariable() {

        mCirclePaint =newPaint();

        mCirclePaint.setAntiAlias(true);

        mCirclePaint.setColor(mCircleColor);

        mCirclePaint.setStyle(Paint.Style.FILL);

        mRingPaint =newPaint();

        mRingPaint.setAntiAlias(true);

        mRingPaint.setColor(mRingColor);

        mRingPaint.setStyle(Paint.Style.STROKE);

        mRingPaint.setStrokeWidth(mStrokeWidth);

        mTextPaint =newPaint();

        mTextPaint.setAntiAlias(true);

        mTextPaint.setStyle(Paint.Style.FILL);

        mTextPaint.setARGB(255,255,255,255);

        mTextPaint.setTextSize(mRadius /2);

        FontMetrics fm = mTextPaint.getFontMetrics();

        mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);

          

    }

  

    @Override

    protectedvoidonDraw(Canvas canvas) {

  

        mXCenter = getWidth() /2;

        mYCenter = getHeight() /2;

          

        canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint);

          

        if(mProgress >0) {

            RectF oval =newRectF();

            oval.left = (mXCenter - mRingRadius);

            oval.top = (mYCenter - mRingRadius);

            oval.right = mRingRadius *2+ (mXCenter - mRingRadius);

            oval.bottom = mRingRadius *2+ (mYCenter - mRingRadius);

            canvas.drawArc(oval, -90, ((float)mProgress / mTotalProgress) *360,false, mRingPaint);//

//            canvas.drawCircle(mXCenter, mYCenter, mRadius + mStrokeWidth / 2, mRingPaint);

            String txt = mProgress +"%";

            mTxtWidth = mTextPaint.measureText(txt,0, txt.length());

            canvas.drawText(txt, mXCenter - mTxtWidth /2, mYCenter + mTxtHeight /4, mTextPaint);

        }

    }

      

    publicvoidsetProgress(intprogress) {

        mProgress = progress;

//        invalidate();

        postInvalidate();

    }

}

 

attrs.xml

 

 代码如下复制代码

    

  

    

    

    

    

  

 

本文介绍了Android实现环形进度条代码,实现后效果非常酷炫,大家可以试着把这个环形进度条加进自己的网页。

先上效果图:

自定义控件:AttendanceProgressBar

代码如下:

 

 代码如下复制代码

publicclassAttendanceProgressBarextendsView {

 // 画圆环底部的画笔

 privatePaint mCirclePaint;

 // 画圆环的画笔

 privatePaint mRingPaint;

 // 画字体的画笔

 privatePaint mTextPaint;

 // 圆形颜色

 privateintmCircleColor;

 // 圆环颜色

 privateintmRingColor;

 // 半径

 privatefloatmRadius;

 // 圆环半径

 privatefloatmRingRadius;

 // 圆环宽度

 privatefloatmStrokeWidth;

 // 圆心x坐标

 privateintmXCenter;

 // 圆心y坐标

 privateintmYCenter;

 // 字的长度

 privatefloatmTxtWidth;

 // 字的高度

 privatefloatmTxtHeight;

 // 总进度

 privateintmTotalProgress =100;

 // 当前进度

 privateintmProgress =80;

 //字体颜色

 privateintmTextColor;

 // 字体大小

 privatefloatmTextSize;

 

 publicAttendanceProgressBar(Context context, AttributeSet attrs) {

 super(context, attrs);

 // 获取自定义的属性

 initAttrs(context, attrs);

 initVariable();

 }

 

 privatevoidinitAttrs(Context context, AttributeSet attrs) {

 TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,

  R.styleable.AttendanceProgressBar,0,0);

 mRadius = typeArray.getDimension(R.styleable.AttendanceProgressBar_radius,80);

 mStrokeWidth = typeArray.getDimension(R.styleable.AttendanceProgressBar_strokeWidth,10);

 mCircleColor = typeArray.getColor(R.styleable.AttendanceProgressBar_circleColor,0xFFFFFFFF);

 mRingColor = typeArray.getColor(R.styleable.AttendanceProgressBar_ringColor,0xFFFFFFFF);

 mTextColor = typeArray.getColor(R.styleable.AttendanceProgressBar_textColor,0xFF000000);

 mTextSize = typeArray.getDimension(R.styleable.AttendanceProgressBar_textSize,80);

 

 mRingRadius = mRadius + mStrokeWidth /2;

 }

 

 privatevoidinitVariable() {

 mCirclePaint =newPaint();

 mCirclePaint.setAntiAlias(true);

 mCirclePaint.setColor(mCircleColor);

// mCirclePaint.setStyle(Paint.Style.FILL);

 mCirclePaint.setStyle(Paint.Style.STROKE);

 mCirclePaint.setStrokeWidth(mStrokeWidth);

 

 mRingPaint =newPaint();

 mRingPaint.setAntiAlias(true);

 mRingPaint.setColor(mRingColor);

 mRingPaint.setStyle(Paint.Style.STROKE);

 mRingPaint.setStrokeWidth(mStrokeWidth);

 

 mTextPaint =newPaint();

 mTextPaint.setAntiAlias(true);

 mTextPaint.setStyle(Paint.Style.FILL);

 mTextPaint.setColor(mTextColor);

// mTextPaint.setARGB(255, 255, 255, 255);

// mTextPaint.setTextSize(mRadius / 2);

 mTextPaint.setTextSize(mTextSize);

 Paint.FontMetrics fm = mTextPaint.getFontMetrics();

 mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);

 

 }

 

 @Override

 protectedvoidonDraw(Canvas canvas) {

 

 mXCenter = getWidth() /2;

 mYCenter = getHeight() /2;

 

// canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint);

 

 canvas.drawCircle(mXCenter, mYCenter, mRingRadius, mCirclePaint);

 RectF oval =newRectF();

 oval.left = (mXCenter - mRingRadius);

 oval.top = (mYCenter - mRingRadius);

 oval.right = mRingRadius *2+ (mXCenter - mRingRadius);

 oval.bottom = mRingRadius *2+ (mYCenter - mRingRadius);

 canvas.drawArc(oval, -90, ((float) mProgress / mTotalProgress) *360,false, mRingPaint);//

//   canvas.drawCircle(mXCenter, mYCenter, mRadius + mStrokeWidth / 2, mRingPaint);

//  String txt = mProgress + "%";

 String txt ="16/18";

 mTxtWidth = mTextPaint.measureText(txt,0, txt.length());

//  canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint);

 canvas.drawText(txt, mXCenter - mTxtWidth /2, mYCenter + mTxtHeight /4- dipToPx(10), mTextPaint);

 txt ="出勤人数";

 mTxtWidth = mTextPaint.measureText(txt,0, txt.length());

 canvas.drawText(txt, mXCenter - mTxtWidth /2, mYCenter + mTxtHeight /4+ dipToPx(10), mTextPaint);

 }

 

 publicvoidsetProgress(intprogress) {

 mProgress = progress;

 postInvalidate();

 }

 privateintdipToPx(intdip) {

 floatscale = getContext().getResources().getDisplayMetrics().density;

 return(int) (dip * scale +0.5f * (dip >=0?1: -1));

 }

}

 

因为是自定义控件,所以在attr.xml文件定义了一些控件属性,以便在xml文件中设置这些属性

代码如下:

 

 代码如下复制代码

 <?xml version="1.0" encoding="utf-8"?>

<resources>
 <declare-styleable name="AttendanceProgressBar">
 <attr name="radius" format="dimension"/>
 <attr name="strokeWidth" format="dimension"/>
 <attr name="circleColor" format="color"/>
 <attr name="ringColor" format="color"/>
 <attr name="textColor" format="color"/>
 <attr name="textSize" format="dimension"/>
 </declare-styleable>
</resources>

 

最后,在xml文件中,可以这样使用

 

 代码如下复制代码

<com.ztd.lieyi.widget.AttendanceProgressBar

 android:layout_gravity="center"

 android:layout_width="100dp"

 android:layout_height="100dp"

 app:radius="45dp"

 app:strokeWidth="5dp"

 app:textSize="@dimen/text_16"

 app:textColor="@color/color_333333"

 app:circleColor="@color/color_d5ebfd"

 app:ringColor="@color/color_2c9df7"/>

 

这只是初步处理,使用时可以根据需求酌情处理。

安卓系统大家都知道各种手机有个子的更新安卓系统的时间,并不像苹果一样统一,那么小编今天就带来了各家厂商跟新Android 7.0的速度比较。感兴趣的朋友戳进来了解一下吧。

安卓的开放性,决定了它更新不可能像iOS那样及时,现在外媒汇总了2016年一些安卓手机厂商更新的速度,而这是以Android  7.0为考虑依据的。

哪家安卓手机厂商升级7.0快? 三联

升级最快的当属LG,这恐怕是很多人没想到的,谷歌推出Nougat后的78天,他们就给G5进行了升级,在Android  6.0的更新中,LG也是最迅速的,不到2个月就为Sprint版的G4升级了Marshmallow。

其次摩托罗拉的表现也是不错的,Verizon Moto Z和Moto Z Force   11月18日升级到了Nougat,只比谷歌发布Nougat晚了88天,而HTC的表现是,在谷歌发布Nougat 95天后,率先为HTC   10带来了升级,之后的是M9等机型,索尼跟进谷歌的速度也还可以(99天),11月29日将Xperia X   Performance升级到了Nougat,随后是Xperia XZ、Xperia X和X Compact。

中国厂商中,小米的表现最迅速,12月26日他们为小米5发布了中文版MIUI  8,比谷歌发布Nougat晚了126天,小米官方表示对于新系统除了要及时跟进外,还要确保发布稳定认真的更新包。

或许是机型太多的缘故,三星在安卓7.0的跟进上慢了不少,历时143天才发布了面向Galaxy S7和S7  Edge的正式版Nougat,而一加比谷歌发布Nougat晚131天,12月31日为一加3、3T发布了稳定版本Nougat更新包。

从更新升级速度上来说,LG、摩托罗拉、HTC和索尼表现都不错,它们都在100天内为设备升级了Nougat,当然小米的跟进速度也很快,毕竟要做更多的本地化适配。除了性价比高外,更新系统更快也是大家入手小米的一个重要原因...

对于刚刚学习开发微信小程序的同学来说,传参可能不好理解,这篇文章介绍了微信小程序中页面之间传参实例详解,希望能帮助到大家。

微信小程序 传参:

实现效果图:

微信小程序在两个之间传参类似js传递url拼接参数,举个例子来说吧

input自己设置参数

 代码如下 复制代码

//index.wxml

<form bindsubmit="formSubmit"bindreset="formReset"class="myform">

 <text class="prompt">给自己起个名字吧</text>

 <input placeholder="给自己起个名字吧"name="uesrname"/>

 <!--<navigator url="../logs/logs?title=我是index">跳转到新页面</navigator>   之间传参-->

 <!--<navigator url="../logs/logs?title=我是index"redirect>在当前页打开</navigator>   -->

 <button form-type="submit"type="primary"size="mini">确定</button>

 <button form-type="reset"type="warn"size="mini">重置</button>

 </form>

formSubmit:function(e){

  varda = e.detail.value;

  varqu = da.uesrname;

  this.setData({

   username:qu

  }),

  wx.navigateTo({

   url:'../logs/logs?uesrname='+qu//qu是上面input输入的值

  })

 },

logs.js

 代码如下 复制代码

//logs.js

  

Page({

 data: {

  motto:'Hello',

  userInfo: {},

  answer: stringAns,

  uesrname:'' //设置一下接收的变量

 },

 onLoad:function(option) {

  this.setData({

   uesrname:option.uesrname

  })

 },

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • C#创建自定义控件及添加自定义属性和事件使用实例详解

    这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • 解决echarts 一条柱状图显示两个值,类似进度条的问题

    这篇文章主要介绍了解决echarts 一条柱状图显示两个值,类似进度条的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-20
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • jQuery实现简单的文件上传进度条效果

    本文实例讲述了jQuery实现文件上传进度条效果的代码。分享给大家供大家参考。具体如下: 运行效果截图如下:具体代码如下:<!DOCTYPE html><html><head><meta charset="utf-8"><title>upload</title><link rel="stylesheet...2015-11-24
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • jquery实现模拟百分比进度条渐变效果代码

    本文实例讲述了jquery实现模拟百分比进度条渐变效果代码。分享给大家供大家参考,具体如下:这里为了便于看到加载百分比,对代码进行了处理,实际使用时并不需要这样。运行效果截图如下:在线演示地址如下:http://demo.jb51.net...2015-10-30
  • ant design中upload组件上传大文件,显示进度条进度的实例

    这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Vue 组件复用多次自定义参数操作

    这篇文章主要介绍了Vue 组件复用多次自定义参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • 自定义jquery模态窗口插件无法在顶层窗口显示问题

    自定义一个jquery模态窗口插件,将它集成到现有平台框架中时,它只能在mainFrame窗口中显示,无法在顶层窗口显示. 解决这个问题的办法: 通过以下代码就可能实现在顶层窗口弹窗 复制代码 代码如下: $(window.top.documen...2014-05-31
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • 自定义feignClient的常见坑及解决

    这篇文章主要介绍了自定义feignClient的常见坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-20
  • pytorch 自定义卷积核进行卷积操作方式

    今天小编就为大家分享一篇pytorch 自定义卷积核进行卷积操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-06