android自定義環(huán)形對比圖效果
本文實例為大家分享了android自定義環(huán)形對比圖的具體代碼,供大家參考,具體內(nèi)容如下

1.首先在res/values里創(chuàng)建一個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;
// 圓環(huán)畫筆
private Paint mRingPaint;
// 百分數(shù)畫筆
private Paint mTextPaint;
// 文本畫筆
private Paint mTextPaint2;
// 里面圓顏色
private int mCircleColor;
// 里面弧顏色
private int mInnerRingColor;
// 外面弧顏色
private int mOutRingColor;
// 空白的圓半徑
private float mRadius;
// 里面的弧半徑
private float mRingRadius;
// 最外弧半徑
private float mRingRadius2;
// 圓環(huán)的寬度
private float mStrokeWidth;
// 文本的中心x軸位置
private int mXCenter;
// 文本的中心y軸位置
private int mYCenter;
// 百分比文本的寬度
private float mTxtWidth;
// 描述文本的寬度
private float mTxtWidth2;
// 文本的高度
private float mTxtHeight;
// 百分數(shù)文本的大小
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中設(shè)置內(nèi)環(huán)和外環(huán)的百分比和屬性
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;
}
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解 Android中Libgdx使用ShapeRenderer自定義Actor解決無法接收到Touch事件的問題
- 詳解Android Libgdx中ScrollPane和Actor事件沖突問題的解決辦法
- Android使用libgdx實現(xiàn)模擬方向鍵控制角色移動的方法
- Android 游戲引擎libgdx 資源加載進度百分比顯示案例分析
- Android drawable微技巧,你不知道的drawable細節(jié)
- Android指紋識別API講解,一種更快更好的用戶體驗
- Android在Kotlin中更好地使用LitePal
- Android Studio輕松構(gòu)建自定義模板的步驟記錄
- 詳解Android 檢測權(quán)限的三種寫法
- Android最簡單的狀態(tài)切換布局實現(xiàn)教程
- Libgdx解決部分Android機型鎖屏崩潰的方法
相關(guān)文章
Android jni調(diào)試打印char陣列的實例詳解
這篇文章主要介紹了Android jni調(diào)試打印char陣列的實例詳解的相關(guān)資料,通過此文希望能幫助到大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-08-08
Android實現(xiàn)保存QQ賬號與密碼功能(文件存儲)
這篇文章主要介紹了Android保存QQ賬號與密碼,文件存儲是Android中最基本的一種數(shù)據(jù)存儲方式,它與Java中的文件存儲類似,都是通過I/O流形式把數(shù)據(jù)直接存儲到文件中,下面我們一起來看一下如何用Android實現(xiàn)文件存儲功能吧2022-04-04
Android開發(fā)學(xué)習(xí)筆記 Gallery和GridView淺析
這篇文章主要介紹了Android開發(fā)學(xué)習(xí)筆記 Gallery和GridView淺析,需要的朋友可以參考下2014-11-11
Android音視頻開發(fā)之MediaPlayer使用教程
Android多媒體框架支持播放提供了MediaPlayerAPI,可以通過MediaPlayer來實現(xiàn)媒體文件播放。可以說MediaPlayer是非常方便使用的多媒體播放器。本文將詳細講解MediaPlayer的使用,需要的可以參考一下2022-04-04
Android使用AlertDialog實現(xiàn)對話框
本文主要介紹了Android使用AlertDialog實現(xiàn)對話框的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧2017-03-03
Kotlin 封裝萬能SharedPreferences存取任何類型詳解
這篇文章主要介紹了Kotlin 封裝萬能SharedPreferences存取任何類型詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android App中使用ViewPager+Fragment實現(xiàn)滑動切換效果
這篇文章主要介紹了Android App中使用ViewPager+Fragment實現(xiàn)滑動切換效果的方法,借助Fragment可以使Activity的內(nèi)部管理邏輯更加清晰,需要的朋友可以參考下2016-03-03

