热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自定义Android圆形进度条视图,支持显示数字和中心文字

本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。

这是一个自定义带数字的圆形进度条和中间是文字的圆形进度条View。自定义View的基本流程在这里就不多说了。(效果图在最后)

自定义View分好几种。我这个Demo主要用到了自己绘画的和组合的View。

首先看怎么自定义带数字的圆形进度条的View。注解读写在代码里了,在这里不多说。

类MyCirclePB自定义的View。具体代码如下:

package com.yehu.z01_circlepb;


import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.Toast;


import com.yehu.z01_circlepb.My_Cricle.My_CricleListern;


public class MainActivity extends Activity {


private My_Cricle my_Cricle;
private MyCirclePB myCirclePB;
String[] strs = { "从未超越", "超越自我", "旗鼓相当" };


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 圆形进条
myCirclePB = (MyCirclePB) findViewById(R.id.my_criclePB);
myCirclePB.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
myCirclePB.setEnabled(false);
new Thread() {
public void run() {
int n = 1000;
myCirclePB.setMax(n);
for (int i = 0; i <= n; i++) {
Log.e("TAG", "download i=" + i);
myCirclePB.setProgress(i);
if (myCirclePB.getProgress() == myCirclePB.getMax()) {
handler.sendEmptyMessage(2);
}
SystemClock.sleep(5);
}
};
}.start();
}
});
// 文本 圆形框
my_Cricle = (My_Cricle) findViewById(R.id.my_cricle);
my_Cricle.init_view();
my_Cricle.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View v) {
my_Cricle.setEnabled(false);
final MyCirclePB circlePB = (MyCirclePB) (((My_Cricle) v)
.getMyCirclePB());
new Thread() {
public void run() {
int n = 1000;
circlePB.setMax(n);
for (int i = 0; i <= n; i++) {
Log.e("TAG", "download i=" + i);
circlePB.setProgress(i);
String str = null;
Message msg = Message.obtain();
if (circlePB.getProgress() str = strs[0];


msg.what = 3;
} else if (circlePB.getProgress() .getMax() * 2 / 3) {
str = strs[1];
msg.what = 4;
} else {
str = strs[2];
msg.what = 5;
}
msg.obj = str;
handler.sendMessage(msg);
if (circlePB.getProgress() == circlePB.getMax()) {
handler.sendEmptyMessage(1);
}
SystemClock.sleep(5);
}
};
}.start();
}
});
}


private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
String str = (String) msg.obj;
int flag = msg.what;
if (flag == 1) {
my_Cricle.setEnabled(true);
} else if (flag == 2) {
myCirclePB.setEnabled(true);
} else if (flag == 3) {
my_Cricle.getText2().setText(str);
my_Cricle.getText2().setTextColor(0xffff0000);
} else if (flag == 4) {
my_Cricle.getText2().setText(str);
my_Cricle.getText2().setTextColor(0xff0000ff);
} else if (flag == 5) {
my_Cricle.getText2().setText(str);
my_Cricle.getText2().setTextColor(0xff00ff00);
}
};
};


}

自定义带数字的圆形进度条View基本就完事了。写一个XML布局就可以使用了。在这里就不单个写了,布局都整合在一起了,后面补上。

这个是一个组合View。

先写布局吧!my_cricle.xml布局如下:

    android:layout_
android:layout_ >

android:id="@+id/mycirlepb"
android:layout_
android:layout_
android:layout_margin="5dp" />

android:layout_
android:layout_
android:layout_centerInParent="true"
android:orientation="vertical" >

android:id="@+id/text1"
android:layout_
android:layout_
android:layout_gravity="center"
android:text="aaa" />

android:id="@+id/text2"
android:layout_
android:layout_
android:textSize="18sp"
android:text="aaaa" />

android:id="@+id/text3"
android:layout_
android:layout_
android:layout_gravity="center"
android:text="aaa" />


类My_Cricle具体代码如下:

package com.yehu.z01_circlepb;

import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class My_Cricle extends RelativeLayout {

private Context context;
private View v;
private TextView text2;
private MyCirclePB myCirclePB;

public MyCirclePB getMyCirclePB() {
return myCirclePB;
}

/**
* 这里写一些事件的回调
* @author sunmj
*
*/
public interface My_CricleListern {
public void back(String name);
}

public My_Cricle(Context context) {
this(context, null);
init(context);
}

public My_Cricle(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);

}

private void init(Context context) {
// TODO Auto-generated method stub
this.cOntext= context;
v = LayoutInflater.from(context).inflate(R.layout.my_cricle, this, true);
text2 = (TextView) v.findViewById(R.id.text2);
}

/**
* 这个方法里面写一些配置的文件例如
*/
public void init_view() {
myCirclePB = (MyCirclePB) v.findViewById(R.id.mycirlepb);
int n = 100;
myCirclePB.setMax(n);
myCirclePB.setRoundColor(Color.GRAY);
myCirclePB.setRoundProgressColor(Color.RED);
myCirclePB.setRoundWidth(40);
myCirclePB.setProgress(0);
myCirclePB.setShowProgress(false);

}

public TextView getText2() {
return text2;
}

//回调回去
public void set_listern(My_CricleListern nCricleListern)
{
nCricleListern.back("1111");
}
}
到这里基本就实现了带数字的圆形进度条,和中间是文字的圆形进度条。下面就是具体的使用了。

主布局activity_main.xml如下:

    xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:gravity="center_horizontal"
android:orientation="vertical" >

android:layout_
android:layout_
android:padding="10dp"
android:text="圆形进度条"
android:textSize="16sp" />

android:id="@+id/my_criclePB"
android:layout_
android:layout_ />

android:layout_
android:layout_
android:padding="10dp"
android:text="圆形文本框"
android:textSize="16sp" />

android:id="@+id/my_cricle"
android:layout_
android:layout_ />

类MainActivity具体代码如下:

package com.yehu.z01_circlepb;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.yehu.z01_circlepb.My_Cricle.My_CricleListern;

public class MainActivity extends Activity {

private My_Cricle my_Cricle;
private MyCirclePB myCirclePB;
String[] strs = { "从未超越", "超越自我", "旗鼓相当" };

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 圆形进条
myCirclePB = (MyCirclePB) findViewById(R.id.my_criclePB);
myCirclePB.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
myCirclePB.setEnabled(false);
new Thread() {
public void run() {
int n = 1000;
myCirclePB.setMax(n);
for (int i = 0; i <= n; i++) {
Log.e("TAG", "download i=" + i);
myCirclePB.setProgress(i);
if (myCirclePB.getProgress() == myCirclePB.getMax()) {
handler.sendEmptyMessage(2);
}
SystemClock.sleep(5);
}
};
}.start();
}
});
// 文本 圆形框
my_Cricle = (My_Cricle) findViewById(R.id.my_cricle);
my_Cricle.init_view();
my_Cricle.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
my_Cricle.setEnabled(false);
final MyCirclePB circlePB = (MyCirclePB) (((My_Cricle) v)
.getMyCirclePB());
new Thread() {
public void run() {
int n = 1000;
circlePB.setMax(n);
for (int i = 0; i <= n; i++) {
Log.e("TAG", "download i=" + i);
circlePB.setProgress(i);
String str = null;
Message msg = Message.obtain();
if (circlePB.getProgress() str = strs[0];

msg.what = 3;
} else if (circlePB.getProgress() .getMax() * 2 / 3) {
str = strs[1];
msg.what = 4;
} else {
str = strs[2];
msg.what = 5;
}
msg.obj = str;
handler.sendMessage(msg);
if (circlePB.getProgress() == circlePB.getMax()) {
handler.sendEmptyMessage(1);
}
SystemClock.sleep(5);
}
};
}.start();
}
});
}

private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
String str = (String) msg.obj;
int flag = msg.what;
if (flag == 1) {
my_Cricle.setEnabled(true);
} else if (flag == 2) {
myCirclePB.setEnabled(true);
} else if (flag == 3) {
my_Cricle.getText2().setText(str);
my_Cricle.getText2().setTextColor(0xffff0000);
} else if (flag == 4) {
my_Cricle.getText2().setText(str);
my_Cricle.getText2().setTextColor(0xff0000ff);
} else if (flag == 5) {
my_Cricle.getText2().setText(str);
my_Cricle.getText2().setTextColor(0xff00ff00);
}
};
};

}
代码的不怎么简洁,一直在努力中……

具体的效果图如下:










推荐阅读
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 实验九:使用SharedPreferences存储简单数据
    本实验旨在帮助学生理解和掌握使用SharedPreferences存储和读取简单数据的方法,包括程序参数和用户选项。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • C#编程指南:实现列表与WPF数据网格的高效绑定方法 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • Android ListView 自定义 CheckBox 实现列表项多选功能详解
    本文详细介绍了在Android开发中如何在ListView的每一行添加CheckBox,以实现列表项的多选功能。用户不仅可以通过点击复选框来选择项目,还可以通过点击列表的任意一行来完成选中操作,提升了用户体验和操作便捷性。同时,文章还探讨了相关的事件处理机制和布局优化技巧,帮助开发者更好地实现这一功能。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在尝试对从复杂 XSD 生成的类进行序列化时,遇到了 `NullReferenceException` 错误。尽管已经花费了数小时进行调试和搜索相关资料,但仍然无法找到问题的根源。希望社区能够提供一些指导和建议,帮助解决这一难题。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
author-avatar
mobiledu2502913173
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有