欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android自定义控件实现圆形进度条

程序员文章站 2024-02-15 20:43:23
项目中常用到的圆形进度条有好多个,从网上搜到的自定义进度条多是封装的比较好的代码,但是不利于初学者,现在本博客就教给大家如何一步步实现自定义进度条的效果: 先看效果如...

项目中常用到的圆形进度条有好多个,从网上搜到的自定义进度条多是封装的比较好的代码,但是不利于初学者,现在本博客就教给大家如何一步步实现自定义进度条的效果:

先看效果如图…

Android自定义控件实现圆形进度条

代码实现过程–main布局

这个布局中就是一个简单的引用

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >

 <button
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:text="开始下载"
 android:onclick="start" />

 <com.example.pb.progressview
 android:id="@+id/circleview"
 android:layout_width="100dp"
 android:layout_height="100dp" />

</linearlayout>

自定义progressview-默认是图中第一种效果

package com.example.pb;

import android.content.context;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.matrix;
import android.graphics.paint;
import android.graphics.paint.style;
import android.graphics.rect;
import android.graphics.rectf;
import android.os.handler;
import android.util.attributeset;
import android.view.view;

public class progressview extends view {
 int progress = 0;
 private string text="0%";
 private int max = 100;

 public progressview(context context, attributeset attrs, int defstyleattr) {
 super(context, attrs, defstyleattr);
 }

 public progressview(context context, attributeset attrs) {
 super(context, attrs);
 }

 public progressview(context context) {
 super(context);
 }

 @override
 protected void ondraw(canvas canvas) {
 super.ondraw(canvas);
 // 对于画笔
 paint paint = new paint();
 // 设置抗锯齿
 paint.setantialias(true);
 // 设置画笔颜色

 // 三种样式--stroke 只要描边 fill 填充 fill_and_stroke和既有描边又有填充
 paint.setstyle(style.stroke);
 //设置描边宽度
 paint.setstrokewidth(2);
 //定义外圈员的颜色
 paint.setcolor(color.red);
 //绘制圆形进度条--获取当前控件多大,正好让进度条在这个控件区间内
 canvas.drawcircle(getmeasuredwidth()/2, getmeasuredwidth()/2, getmeasuredwidth()/2, paint);
 //重新设置描边宽度,这个宽度最好能完全盖过圆形
 paint.setstrokewidth(3);

 //定义限制圆弧的矩形,当前这样定义正好让圆弧和圆重合
 rectf oval = new rectf(0, 0, getmeasuredwidth(), getmeasuredwidth());
 //设置进度条(圆弧的颜色)
 paint.setcolor(color.green);
 //绘制,设置进度条的度数从0开始,结束值是个变量,可以自己*设置,来设置进度 
 //true和false 代表是否使用中心点,如果true,代表连接中心点,会出现扇形的效果
 canvas.drawarc(oval, 0, 360 * progress / max, false, paint);
 //文字的绘制
 paint.settextsize(40);
 //设置文字宽度
 paint.setstrokewidth(1.0f);
 //测量文字大小-提前准备个矩形
 rect bounds = new rect();
 //测量文字的宽和高,测量的值可以根据矩形获取
 paint.gettextbounds(text, 0, text.length(), bounds);
 paint.setcolor(color.black);
 paint.setstyle(style.fill);
 //绘制文字,计算文字的宽高进行设置
 canvas.drawtext(text, getmeasuredwidth()/2 - bounds.width() / 2,
  getmeasuredwidth()/2 + bounds.height() / 2, paint);

 }
 /**
 * 初始设置当前进度的最大值-默认100
 * @param max
 */
 public void setmax(int max) {
 this.max = max;
 }
 /**
 * 更新进度和文字
 * @param progress
 * @param text
 */
 public void setprogressandtext(int progress, string text) {
 this.progress = progress;
 this.text = text;
 //重新绘制
 postinvalidate();
 }

}

如果想要实现第二种效果

//设置填充模式
paint.setstyle(style.fill);
//绘制,设置进度条的度数从0开始,结束值是个变量,可以自己*设置,来设置进度 
 //true和false 代表是否使用中心点,如果true,代表连接中心点,会出现扇形的效果
 canvas.drawarc(oval, 0, 360 * progress / max, false, paint);

activity中代码–模拟一下下载的过程,效果随便定义

package com.example.pb;

import android.app.activity;
import android.os.bundle;
import android.view.view;

public class mainactivity extends activity {

 private progressview circleview;

 @override
 protected void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.activity_main);

 circleview = (progressview) findviewbyid(r.id.circleview);

 }

 int progress = 0;

 public void start(view v) {
 // 1000公里
 circleview.setmax(100);
 progress=0;
 new thread() {
  public void run() {
  while (true) {
   progress = progress + 1;
   string text = progress + "%";
   circleview.setprogressandtext(progress, text);
   try {
   sleep(30);
   } catch (interruptedexception e) {
   // todo auto-generated catch block
   e.printstacktrace();
   }
   if (progress == 100) {
   break;
   }
  }
  };
 }.start();
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。