实心圆形的进度条,可做报表使用

实心圆形的进度条,可做报表使用

先上效果图

模拟学生试题结果的统计,但作用绝对不止用于此

上代码:

一个自定义圆形图标

参照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