实心圆形的进度条,可做报表使用
先上效果图
模拟学生试题结果的统计,但作用绝对不止用于此
上代码:
一个自定义圆形图标
参照https://www.jb51.net/article/81665.htm
public class CirclePro extends View { private Paint paint; private int circleBack;//圆的背景色 private int mschedual = 0;//用于控制动态变化 float circleHalf; //圆的半径 String percent = "";//绘制百分比的字符串 @SuppressLint("Recycle") public CirclePro(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); paint = new Paint(); TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.myCircleImage, defStyleAttr,0); @SuppressWarnings("unused") int leng = array.length(); //获取自定义的属性,这里注意是R.styleable.myCircleImage_circlecolor而不是R.attr.circlecolor circleBack = array.getColor(R.styleable.myCircleImage_circlecolor,Color.GREEN); circleHalf = array.getDimension(R.styleable.myCircleImage_half,200.f); System.out.println(circleBack); } /** * 这个构造参数,当在布局文件中引用该view的时候,必须重写该构造函数 * @param context * @param attrs */ public CirclePro(Context context, AttributeSet attrs) { this(context, attrs, 0);//调用自己的构造函数 } /** * 根据文本的 * @param text * @param textSize * @return */ public float getTextWidth(String text,float textSize) { TextPaint textPaint = new TextPaint(); textPaint.setTextSize(textSize); return textPaint.measureText(text); } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); float height = getHeight(); float width = getWidth(); // float circleHalf = (float) (width*0.7/2); paint.setColor(circleBack); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); canvas.drawCircle(width/2,height/2,circleHalf, paint);//画实心圆 if (mschedual <= 100) {//,如果当前进度小于100,画实心矩形 paint.setColor(Color.WHITE); canvas.drawRect(width/2-circleHalf,height/2-circleHalf,width/2+circleHalf,height/2+circleHalf - mschedual*circleHalf/50, paint); } //画当前进度的字符串 paint.setColor(Color.BLACK); paint.setTextSize(30.f); percent = mschedual+" %"; canvas.drawText(percent, width/2-getTextWidth(percent,30)/2,height/2+paint.getTextSize()*3/8, paint);//字体的高度=paint.getTextSize()*3/4 //画空心圆 paint.setColor(circleBack); paint.setStyle(Paint.Style.STROKE); canvas.drawCircle(width/2,height/2,circleHalf, paint); } public void setMschedual(float f){ this.mschedual=Math.round(f); invalidate(); } }
public class CircleCardAdapter extends BaseAdapter { private Context con; private ArrayList<ViewQuestionAnswerCard.PositionSet> list; private ArrayList<CountBigCircle> countBigCircleArrayList; private LayoutInflater inflater; private boolean isShowResult; public CircleCardAdapter(Context context, boolean isShowResult, ArrayList<CountBigCircle> countBigCircleArrayList, ArrayList<ViewQuestionAnswerCard.PositionSet> list){ this.con = context; this.isShowResult=isShowResult; this.countBigCircleArrayList=countBigCircleArrayList; this.list = list; inflater = (LayoutInflater)con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { if(position>=getCount()){ return null; } return list.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { viewHolder vh = null; ViewQuestionAnswerCard.PositionSet positionSet = list.get(position); if(convertView == null){ convertView = inflater.inflate(R.layout.item_small_circle_card, null); vh = new viewHolder(convertView); convertView.setTag(vh); }else{ vh = (viewHolder) convertView.getTag(); } String orderString="第"+positionSet.bigPos+"大题,第"+positionSet.smallPos+"小题"; vh.bigQuestionOrder=positionSet.bigPos; vh.smallQuestionOrder=positionSet.smallPos; vh.tvBigQuestionOrder.setText("第"+positionSet.bigPos+"大题"); vh.tvSmallQuestionOrder.setText("第"+positionSet.smallPos+"小题"); vh.circle.setMschedual(countBigCircleArrayList.get(positionSet.bigPos).getCountSmallCircleArrayList().get(positionSet.smallPos).getProgress()); return convertView; } public class viewHolder{ public CirclePro circle; public TextView tvBigQuestionOrder; public TextView tvSmallQuestionOrder; public viewHolder(View view){ circle = (CirclePro) view.findViewById(R.id.circle); tvBigQuestionOrder = (TextView) view.findViewById(R.id.tv_big_question_order); tvSmallQuestionOrder = (TextView) view.findViewById(R.id.tv_small_question_order); } public int bigQuestionOrder; public int smallQuestionOrder; } } 核心代码就这些,具体代码见 https://download.csdn.net/download/hugn215/10904453