溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在android中自定義環(huán)形對比圖效果

發(fā)布時間:2021-06-08 16:53:04 來源:億速云 閱讀:177 作者:Leah 欄目:移動開發(fā)

怎么在android中自定義環(huán)形對比圖效果?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

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 mTxtWidth3;
 // 文本的高度
 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());
 mTxtWidth3 = mTextPaint2.measureText(txt2, 0, txt2.length());
 canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter+mTxtWidth / 8, mTextPaint);
 canvas.drawText(txt2 ,mXCenter - mTxtWidth3 / 2, mYCenter + mTxtWidth / 2, mTextPaint2);
 }else if(mInnerProgress==0){
 String txt = mInnerProgress + "%";
 String txt2 = "正確率";
 mTxtWidth = mTextPaint.measureText(txt, 0, txt.length());
 mTxtWidth3 = mTextPaint2.measureText(txt2, 0, txt2.length());
 canvas.drawText(txt, mXCenter - mTxtWidth / 2, mYCenter+mTxtWidth / 8, mTextPaint);
 canvas.drawText(txt2 ,mXCenter - mTxtWidth3 / 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中設置內環(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;
 }
 }
}

關于怎么在android中自定義環(huán)形對比圖效果問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI