android自定义环形对比图效果
作者:第4个苹果 发布时间:2023-06-15 19:49:19
标签:android,对比图
本文实例为大家分享了android自定义环形对比图的具体代码,供大家参考,具体内容如下
1.首先在res/values里创建一个attr.xml的文件。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="AnswerChartView">
<attr name="radius" format="dimension"/>
<attr name="strokeWidth" format="dimension"/>
<attr name="circleColor" format="color"/>
<attr name="innerringColor" format="color"/>
<attr name="outringColor" format="color"/>
<attr name="textSize" format="dimension"/>
</declare-styleable>
</resources>
2.然后为自定义对比图View
package com.jsle.ebag.answer.view;
import com.jsle.ebag.answer.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.view.View;
/**
* 弧线对比图
* @param
* @return
* @author LH
* @data 2016年1月25日 下午6:17:34
**/
public class AnswerChartView extends View {
// 圆画笔
private Paint mCirclePaint;
// 圆环画笔
private Paint mRingPaint;
// 百分数画笔
private Paint mTextPaint;
// 文本画笔
private Paint mTextPaint2;
// 里面圆颜色
private int mCircleColor;
// 里面弧颜色
private int mInnerRingColor;
// 外面弧颜色
private int mOutRingColor;
// 空白的圆半径
private float mRadius;
// 里面的弧半径
private float mRingRadius;
// 最外弧半径
private float mRingRadius2;
// 圆环的宽度
private float mStrokeWidth;
// 文本的中心x轴位置
private int mXCenter;
// 文本的中心y轴位置
private int mYCenter;
// 百分比文本的宽度
private float mTxtWidth;
// 描述文本的宽度
private float mTxtWidth2;
// 文本的高度
private float mTxtHeight;
// 百分数文本的大小
private float mTxtSize;
// 总成绩
private int mTotalProgress = 100;
// 个人的正确率
private double mInnerProgress;
// 班级的正确率
private double mOutProgress;
public AnswerChartView(Context context, AttributeSet attrs) {
super(context, attrs);
initAttrs(context, attrs);
initVariable();
}
private void initAttrs(Context context, AttributeSet attrs) {
TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.AnswerChartView, 0, 0);
mRadius = typeArray.getDimension(R.styleable.AnswerChartView_radius, 80);
mTxtSize=typeArray.getDimension(R.styleable.AnswerChartView_textSize, 20);
mStrokeWidth = typeArray.getDimension(R.styleable.AnswerChartView_strokeWidth, 10);
mCircleColor = typeArray.getColor(R.styleable.AnswerChartView_circleColor, 0xFFFFFFFF);
mOutRingColor = typeArray.getColor(R.styleable.AnswerChartView_innerringColor, 0xFFFFFFFF);
mInnerRingColor = typeArray.getColor(R.styleable.AnswerChartView_outringColor, 0xFFFFFFFF);
mRingRadius = mRadius + mStrokeWidth / 2;
mRingRadius2 = mRadius + mStrokeWidth/2*3;
}
private void initVariable() {
mCirclePaint = new Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setStyle(Paint.Style.FILL);
mRingPaint = new Paint();
mRingPaint.setAntiAlias(true);
mRingPaint.setColor(mInnerRingColor);
mRingPaint.setStyle(Paint.Style.STROKE);
mRingPaint.setStrokeWidth(mStrokeWidth);
mTextPaint = new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setARGB(255, 32, 207, 152);
mTextPaint.setTextSize(mTxtSize);
mTextPaint2 = new Paint();
mTextPaint2.setAntiAlias(true);
mTextPaint2.setStyle(Paint.Style.FILL);
mTextPaint2.setARGB(255, 0, 0, 0);
mTextPaint2.setTextSize(20);
FontMetrics fm = mTextPaint.getFontMetrics();
mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);
}
@Override
protected void onDraw(Canvas canvas) {
mXCenter = getWidth() / 2;
mYCenter = getHeight() / 2;
mCirclePaint.setColor(getResources().getColor(R.color.gray));
canvas.drawCircle(mXCenter,mYCenter, mRadius + mStrokeWidth*2, mCirclePaint);
RectF oval1 = new RectF();
oval1.left = (mXCenter - mRingRadius);
oval1.top = (mYCenter - mRingRadius);
oval1.right = mRingRadius * 2 + (mXCenter - mRingRadius);
oval1.bottom = mRingRadius * 2 + (mYCenter - mRingRadius);
mRingPaint.setColor(mOutRingColor);
canvas.drawArc(oval1, -90, ((float)mOutProgress / mTotalProgress) * 360, false, mRingPaint);
mCirclePaint.setColor(mCircleColor);
canvas.drawCircle(mXCenter, mYCenter, mRadius, mCirclePaint);
if (mInnerProgress > 0 ) {
RectF oval = new RectF();
oval.left = (mXCenter - mRingRadius2);
oval.top = (mYCenter - mRingRadius2);
oval.right = mRingRadius2 * 2 + (mXCenter - mRingRadius2);
oval.bottom = mRingRadius2 * 2 + (mYCenter - mRingRadius2);
mRingPaint.setColor(mInnerRingColor);
canvas.drawArc(oval, -90, ((float)mInnerProgress / mTotalProgress) * 360, false, mRingPaint); //
// canvas.drawCircle(mXCenter, mYCenter, mRadius + mStrokeWidth / 2, mRingPaint);
String txt = mInnerProgress + "%";
String txt2 = "正确率";
mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());
mTxtWidth2 = mTextPaint2.measureText(txt2, 0, txt2.length());
canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter+mTxtWidth / 8, mTextPaint);
canvas.drawText(txt2 ,mXCenter - mTxtWidth2 / 2, mYCenter + mTxtWidth / 2, mTextPaint2);
}else if(mInnerProgress==0){
String txt = mInnerProgress + "%";
String txt2 = "正确率";
mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());
mTxtWidth2 = mTextPaint2.measureText(txt2, 0, txt2.length());
canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter+mTxtWidth / 8, mTextPaint);
canvas.drawText(txt2 ,mXCenter - mTxtWidth2 / 2, mYCenter + mTxtWidth / 2, mTextPaint2);
}
}
public void setOutProgress(double progress){
mOutProgress=progress;
}
public void setInnerProgress(double progress) {
mInnerProgress = progress;
// invalidate();
postInvalidate();
}
}
3.使用自定义View
<com.jsle.ebag.answer.view.AnswerChartView
android:id="@+id/tasks_view"
android:layout_width="160dp"
android:layout_height="160dp"
android:layout_centerHorizontal="true"
tc:circleColor="@color/circle_color"
tc:innerringColor="@color/dark_yellow"
tc:outringColor="@color/green"
tc:radius="60dip"
tc:strokeWidth="6dip"
tc:textSize="32sp" />
4.最后可已在AnswerChartActivity中设置内环和外环的百分比和属性
package com.jsle.ebag.answer.activity;
import java.text.DecimalFormat;
import com.jsle.ebag.answer.R;
import com.jsle.ebag.answer.R.layout;
import com.jsle.ebag.answer.view.AnswerChartView;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
public class AnswerChartActivity extends BaseActivity implements OnClickListener {
private AnswerChartView mTasksView;
private double mAccuracy;//个人的正确率
private double cAccuracy;//班级的正确率
private double mCurrentProgress;
private LinearLayout btn_black;
private TextView tv_title,tv_subjectcount,tv_submit,tv_accuracy;
private String title;
private double maccuracy,caccuracy;
private int subjectcount,submit;
@Override
protected int getID() {
// TODO Auto-generated method stub
return R.id.Activity_ID_AnswerChart;
}
@Override
protected String getTag() {
// TODO Auto-generated method stub
return "AnswerChart_Acitivity";
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_answer_chart);
btn_black=(LinearLayout) findViewById(R.id.btn_black);
tv_title=(TextView) findViewById(R.id.tv_title);
tv_subjectcount=(TextView) findViewById(R.id.tv_subjectcount);
tv_submit=(TextView) findViewById(R.id.tv_submit);
tv_accuracy=(TextView) findViewById(R.id.tv_accuracy);
btn_black.setOnClickListener(this);
getData();
initVariable();
initView();
new Thread(new ProgressRunable()).start();
}
private void getData() {
// TODO Auto-generated method stub
Intent intent = getIntent();
title=intent.getStringExtra("title");
maccuracy = intent.getDoubleExtra("maccuracy", 0);
caccuracy = intent.getDoubleExtra("caccuracy", 0);
subjectcount=intent.getIntExtra("subjectcount", 0);
submit=intent.getIntExtra("submit", 0);
}
private void initVariable() {
tv_title.setText(title);
tv_subjectcount.setText("共"+subjectcount+"道题");
tv_submit.setText(submit+"");
tv_accuracy.setText(caccuracy+"%");
mAccuracy =maccuracy;
cAccuracy=caccuracy;
mCurrentProgress = 0;
}
private void initView() {
mTasksView = (AnswerChartView) findViewById(R.id.tasks_view);
mTasksView.setOutProgress(cAccuracy);
}
/**
*进度动画效果
* @author LH
* @data 2016年1月29日 下午3:43:31
**/
class ProgressRunable implements Runnable {
@Override
public void run() {
while (mCurrentProgress < mAccuracy) {
mCurrentProgress += 1;
if(mCurrentProgress>mAccuracy){
mCurrentProgress=mAccuracy;
}
mTasksView.setInnerProgress(mCurrentProgress);
try {
Thread.sleep(15);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_black:
finish();
break;
default:
break;
}
}
}
来源:https://blog.csdn.net/u012483116/article/details/50635268


猜你喜欢
- ModbusModbus是一种串行通信协议。Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、T
- 本文实例为大家分享了Android实现读写USB串口数据的具体代码,供大家参考,具体内容如下最近在研究USB方面的内容;先后做了关于Andr
- 1. 问题描述:自己修改了下 ${M2_HOME}/conf/settings.xml中的本地repository地址,但是重新执行mvn的
- 每次写批量的时候,都要在网上搜索一下,虽然都做过多次了,但具体的自己还是记不住(汗颜),所以索性今天就记录下来。前期说明:foreach的主
- 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是
- 引言MyBatis-Plus | 最优雅最简洁地完成数据库操作是对MyBatis-Plus的功能进行简单介绍,虽然是介绍,也让我们领略到他的
- MyBatis查询返回null可能原因SQL语句查询条件有问题数据库中没数据返回字段与Entity的属性不对应解决方案针对 SQL
- 在.Net下DateTime.Ticks获得的是个long型的时间整数,具体表示是至0001 年 1 月 1 日午夜 12:00:00 以来
- 话说,最近一次系统维护 用JS读取导入Excel中的实验数据,出现被自动四舍五入。后来到客户现场听客户反馈 Excel实验数据要
- 介绍:Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包
- 前言进入到 SpringBoot2.7 时代,有小伙伴发现有一个常用的类忽然过期了:在 Spring Security 时代,这个类可太重要
- 前言本文主要介绍JWT的实战运用。准备工作首先我们创建一个Asp.Net的,包含MVC和WebApi的Web项目。然后使用Nuget搜索JW
- 想在Linux进行JAVA开发吗?环境如何搭建,第一个HelloWorld如何实现,下面马上奉献:1、环境搭建1.1 Java JDK 的安
- 前言在实际开发中,大多数情况下都需要对 SQL 传入参数以获得想要的结果集,传入的情况分为两种情况:1、SQL语句的拼接,比如表名、like
- 简述Java中Socket分为普通Socket和NioSocket两种,这里介绍Socket。我们可以把Socket比作两个城市间的交通工具
- 什么是接口?说到接口,USB大家肯定不陌生~接口是一种标准、规范.注意:接口一旦制定好,使用者和实现者都必须遵循的标准.接口的语法: (JD
- 本文实例讲述了Java调用Shell命令的方法。分享给大家供大家参考。具体如下:近日项目中有这样一个需求:系统中的外币资金调度完成以后,要将
- 想必我们在做项目的时候,都会遇到服务端与客户端交互数据。一般情况下我们都会采用json格式或者xml格式,将服务端的数据转换成这两种格式之一
- Step1: 安装JDK并配置环境变量;Step2: 安装Gradle进入点击打开链接官网首页点击install gra
- 背景:新年之际,微信微博支付宝红包是到处飞,但是,自己的手速总是比别人慢一点最后导致红包没抢到,红包助手就应运而生。需求:收到红包的时候进行