CircleProgressDemo01.7z

  • Z8_811565
    了解作者
  • 428.8KB
    文件大小
  • 7z
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-14 11:17
    上传日期
自定义view,继承view,实现进度条,中间显示进度变化和提示文字。
CircleProgressDemo01.7z
内容介绍
package cn.qbang.circleprogressdemo01; import android.animation.ValueAnimator; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.SweepGradient; import android.graphics.Typeface; import android.os.Build; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.animation.LinearInterpolator; import android.widget.ProgressBar; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; public class CircleProgress extends View { //定义颜色 private int background_color, ring_color, ring_progress_color, dot_color, percent_color, text_progress_color, text_color; private float ringSize, dotSize, textProgressSize, texSize, texMarginSize; private String showText; //显示固定文字 ValueAnimator animator; //动画 //增长动画中的临时进度 private float tempProgress = 0; //当前进度 private int curProgress; //最大进度 private int maxProgress = 100; //定义画笔 private Paint mPaint; private Paint ringPaint; //圆弧 private Paint ringProgressPaint; //进度圆弧 private Paint textPaint; //文本 private Paint pointPaint; //点 public CircleProgress(Context context) { this(context, null); } public CircleProgress(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public CircleProgress(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //获得atts.xml定义的属性值,存储在TypedArray中 TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CircleProgress, defStyleAttr, 0); int n = ta.getIndexCount(); for (int i = 0; i < n; i++) { int attr = ta.getIndex(i); switch (attr) { case R.styleable.CircleProgress_ringColor: //圆环颜色 ring_color = ta.getColor(attr, Color.BLACK); break; case R.styleable.CircleProgress_ringSize: //圆环宽度 ringSize = ta.getDimension(R.styleable.CircleProgress_ringSize, 13); break; case R.styleable.CircleProgress_ringprogressColor: //圆环进度颜色 ring_progress_color = ta.getColor(attr, Color.WHITE); break; case R.styleable.CircleProgress_dotColor: //小圆点 dot_color = ta.getColor(attr, Color.WHITE); break; case R.styleable.CircleProgress_dotSize: //小圆点大小 dotSize = ta.getDimension(R.styleable.CircleProgress_dotSize, 32); break; case R.styleable.CircleProgress_textProgressColor: //字体进度的颜色 text_progress_color = ta.getColor(attr, Color.BLACK); break; case R.styleable.CircleProgress_textProgressSize: //字体进度大小 textProgressSize = ta.getDimension(R.styleable.CircleProgress_textProgressSize, 32); break; case R.styleable.CircleProgress_textPercentColor: //百分号颜色 percent_color = ta.getColor(attr, Color.BLACK); break; case R.styleable.CircleProgress_showProgressText: //固定字体显示 showText = ta.getString(R.styleable.CircleProgress_showProgressText); break; case R.styleable.CircleProgress_texColor: //字体的颜色 text_color = ta.getColor(attr, Color.BLACK); break; case R.styleable.CircleProgress_texSize: //字体大小 texSize = ta.getDimension(R.styleable.CircleProgress_texSize, 17); break; case R.styleable.CircleProgress_texMarginSize: //字之间的款阿杜 texMarginSize = ta.getDimension(R.styleable.CircleProgress_texMarginSize, 9); break; } } ta.recycle(); init(); } private void init() { mPaint = new Paint(); //画笔 mPaint.setAntiAlias(true); ringPaint = new Paint(); //圆弧 ringPaint.setAntiAlias(true); ringProgressPaint = new Paint(); //进度圆弧 ringProgressPaint.setAntiAlias(true); textPaint = new Paint(); //文字画笔 textPaint.setAntiAlias(true); pointPaint = new Paint(); //点 pointPaint.setAntiAlias(true); } /** * 重写onMeasure()方法,支持wrap_content属性 * * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // super.onMeasure(widthMeasureSpec, heightMeasureSpec); int width; int height; int widthMode = MeasureSpec.getMode(widthMeasureSpec); //宽度的测量模式 int widthSize = MeasureSpec.getSize(widthMeasureSpec); //宽度的测量值 int heightMode = MeasureSpec.getMode(heightMeasureSpec); //高度的测量模式 int heightSize = MeasureSpec.getSize(heightMeasureSpec); //高度的测量值 //如果布局里面设置的是固定值,这里取布局里面的固定值;如果设置的是match_parent,则取父布局的大小 if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { //如果布局里面没有设置固定值,这里取布局的宽度的1/2 width = widthSize * 1 / 2; } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { //如果布局里面没有设置固定值,这里取布局的高度的3/4 height = heightSize * 3 / 4; } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 画最外层的大圆环 int centre = getWidth() / 2; //获取圆心的x坐标 int radius = (int) (centre - 2 * ringSize); //圆环的半径 mPaint.setColor(ring_color); //设置圆环的颜色 mPaint.setStyle(Paint.Style.STROKE); //设置空心 mPaint.setStrokeWidth(ringSize); //设置圆环的宽度 mPaint.setAntiAlias(true); //消除锯齿 canvas.drawCircle(centre, centre, radius, mPaint); //画出圆环 //画进度文字 //设置进度值的大小颜色,字体样式 textPaint.setStrokeWidth(0); textPaint.setColor(text_progress_color); textPaint.setTextSize(textProgressSize); textPaint.setTypeface(Typeface.MONOSPACE); //中间的进度百分比,先转换成float在进行除法运算,不然都为0 int percent = (int) (((float) tempProgress / (float) maxProgress) * 100); String percent_draw; if (percent == 0) { percent_draw = "00"; } else { percent_draw = percent + ""; } float textHeight = textProgressSize; //进度字体的高度 float textWidth = textPaint.measureText(percent_draw); textPaint.setTextSize(textHeight); // canvas.drawText(percent_draw, centre - 5 * textWidth, centre, textPaint); canvas.drawText(percent_draw, centre - textWidth / 2, centre + textProgressSize / 6, textPaint); //画百分比号 textPaint.setSt
评论
    相关推荐
    • OGRE示例程序
      自己整合的一个OGRE程序,刚开始没有头绪,纠结啊。。。。的确看懂了就恍然大悟了(尤其在学了opengl之后)
    • ogre实例程序
      对照ogre初、中级教程综合了一部分内容做的一个小例子。VS10,ogre1.7.版本下实现。
    • Ogre-critter
      NxOgre和Ogre的结合,Critter可以把NxOgre绑定到Ogre中。虽然NxOgre名字中有Ogre,但是没有引用或使用任何Ogre中的代码。所以需要Critter。
    • OGRE粒子系统
      这是一份关于OGRE粒子系统的例程,是一个面向对象的图像渲染引擎的教学例子。
    • Ogre Book
      Ogre基础入门书籍和帮助手册消息机制等等。
    • OGRE基础教学文档
      在这篇教程里,我会向您介绍OGRE最基础的构架:场景管理器,场景节点和实体。由于我需要在这篇教程里把OGRE的基本概念介绍给你,所以我们不会接触太多的代码。在您阅读这篇教程的同时,您应该自己一点一点的添加代码...
    • Ogre Dependencies
      Ogre依赖库:Ogre Dependencies
    • OGRE Dependency
      OGRE的Dependency,从官方给的Bitbucket链接下载下来的,2013-03的版本。编译的话要先安装CMake,装好D3D的SDK,我用的是2010-June版本的SDK,有的版本CMake找不到D3D的环境变量,打开CMake,选择对应的开发平台和...
    • ogre arcball
      ogre arcball
    • OGRE GetRayToScreen
      ogre实现的 光标跟踪鼠标点击的坐标