热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

android自定义环形对比图效果

这篇文章主要为大家详细介绍了android自定义环形对比图,外环有类似进度条的旋转动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了android自定义环形对比图的具体代码,供大家参考,具体内容如下

1.首先在res/values里创建一个attr.xml的文件。

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
 
  
  
  
  
  
  
 
 

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

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=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;
 }
 }
}

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


推荐阅读
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 优化 Android 按钮状态下的背景和文本颜色变化
    本文介绍如何通过 Android 的 Selector 实现按钮在不同状态下(如按压)的背景和文本颜色动态变化。我们将详细讲解实现步骤,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 本文详细介绍了Java Web应用程序中的过滤器(Filter)功能,包括其作用、实现方式及配置方法。过滤器可以在请求到达目标资源之前对其进行预处理,并在响应返回给客户端之前进行后处理。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 本文介绍了ArcXML配置文件的分类及其在不同服务中的应用,详细解释了地图配置文件的结构和功能,包括其在Image Service、Feature Service以及ArcMap Server中的使用方法。 ... [详细]
  • 本文详细介绍如何利用已搭建的LAMP(Linux、Apache、MySQL、PHP)环境,快速创建一个基于WordPress的内容管理系统(CMS)。WordPress是一款流行的开源博客平台,适用于个人或小型团队使用。 ... [详细]
  • 本文详细介绍了 RosPack 类的功能和用法,探讨了其在 ROS 系统中的重要作用。RosPack 类提供了类似于终端命令 rospack 的功能,能够方便地查询和管理 ROS 包的相关信息。 ... [详细]
author-avatar
手机用户2602890535
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有