Android自定义控件 - 彩虹表盘

说实话写代码久了,本能的会避免一些不熟悉的领域,而去做一些擅长的领域,这样使工作显得得心应手,但殊不知这是一种逃避行为,只有不断的面临问题甚至主动制造问题,好比说我偏偏不用setVisible这种老旧的显影方式,而是使用去使用动画,不用常用布局堆叠构建UI,而是使用Canvas绘制布局,虽然说到底还是API调用师,笔者不是要歌颂那些勇于尝试的人,只是想多个方法对条路,这也是另一种节约时间成本的方式。

进入正题

国际惯例先上效果图

设计图实现效果
设计效果

看完效果会给我打多少分?···
基本样式已出,剩下就是精雕细琢了

按照笔者学习借鉴的套路,一般找几个参考案例,百度,GitHub,谷歌三连,是绝对不会少的

案例一

效果: 指针旋转 + 间隔彩虹

package com.xiaomakj.utillib.widget;import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.view.View;public class GradualView extends View {public static final int[] SWEEP_GRADIENT_COLORS = new int[]{Color.GREEN, Color.GREEN, Color.BLUE, Color.RED, Color.RED};private int tableWidth = 50;private Paint mPaint;private Path mPath;private RectF mTableRectF;//把路径分成虚线段的private DashPathEffect dashPathEffect;//给路径上色private SweepGradient mColorShader;//指针的路径private Path mPointerPath;private float mCurrentDegree = 60;public GradualView(Context context, AttributeSet attrs) {super(context, attrs);mPaint = new Paint();mPaint.setAntiAlias(true);mPaint.setDither(true);mPaint.setColor(Color.BLACK);mPath = new Path();mPointerPath = new Path();startAnimator();}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);float size = Math.min(w, h) - tableWidth * 2;//油表的位置方框mTableRectF = new RectF(0, 0, size, size);mPath.reset();//在油表路径中增加一个从起始弧度mPath.addArc(mTableRectF, 60, 240);//计算路径的长度PathMeasure pathMeasure = new PathMeasure(mPath, false);float length = pathMeasure.getLength();float step = length / 60;dashPathEffect = new DashPathEffect(new float[]{step / 3, step * 2 / 3}, 0);float radius = size / 2;mColorShader = new SweepGradient(radius, radius,SWEEP_GRADIENT_COLORS,null);//设置指针的路径位置mPointerPath.reset();mPointerPath.moveTo(radius, radius - 20);mPointerPath.lineTo(radius, radius + 20);mPointerPath.lineTo(radius * 2 - tableWidth, radius);mPointerPath.close();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);float dx = (getWidth() - mTableRectF.width()) / 2;float dy = (getHeight() - mTableRectF.height()) / 2;//把油表的方框平移到正中间canvas.translate(dx, dy);canvas.save();//旋转画布canvas.rotate(90, mTableRectF.width() / 2, mTableRectF.height() / 2);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(tableWidth);mPaint.setPathEffect(dashPathEffect);mPaint.setShader(mColorShader);canvas.drawPath(mPath, mPaint);canvas.restore();//还原画笔mPaint.setPathEffect(null);mPaint.setShader(null);mPaint.setStyle(Paint.Style.FILL);mPaint.setStrokeWidth(tableWidth / 10);canvas.save();canvas.rotate(150 + mCurrentDegree, mTableRectF.width() / 2, mTableRectF.height() / 2);canvas.drawPath(mPointerPath, mPaint);canvas.restore();}public void startAnimator() {ValueAnimator animator = ValueAnimator.ofFloat(0, 240);animator.setDuration(40000);animator.setRepeatCount(ValueAnimator.INFINITE);animator.setRepeatMode(ValueAnimator.RESTART);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {mCurrentDegree = (int) (0 + (Float) animation.getAnimatedValue());invalidate();}});animator.start();}
}

案例二

效果:彩虹圆弧 + 图形定位


package com.example.yan;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.Shader;import android.graphics.SweepGradient;import android.util.AttributeSet;import android.view.View;/*** Created by xiaoyanzi on 2016/3/18.* 渐变圆弧*/
public class GradualView extends View {private Context context;private Paint paint;//画笔private Paint paintFull;//实心圆画笔private Paint textPaint;//标识字画笔private Paint valuePaint;//移动小球画笔private int[] mColors;//渐变色数组private int centerX;//中心Xprivate int centerY;//中心Yprivate int srcH;//控件高度private float startAngle = 110;//圆弧起始角度private float sweepAngle = 320;//圆弧所占度数private float airValue = 66;/*** 直接在代码中调用时,使用该函数** @param context*/public GradualView(Context context) {super(context);initData(context);}/*** 在xml中使用自定义view时,使用这个函数** @param context* @param attrs*/public GradualView(Context context, AttributeSet attrs) {super(context, attrs);initData(context);}/*** 可以由上一个函数中手动调用** @param context* @param atrrs* @param defStyle 自定义函数中的attrs表示view的属性集,defStyle表示默认的属性资源集的id*/public GradualView(Context context, AttributeSet atrrs, int defStyle) {super(context, atrrs, defStyle);}/*** 初始化** @param context*/private void initData(Context context) {this.context = context;paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setStyle(Paint.Style.STROKE);mColors = new int[]{0xFF660099,//紫色0xFF330033,//褐色0xFF99FF00,//草绿色0xFFFFFF00,//黄色0xFFFF6600,//橘色0xFFFF0000,//红色0xFF660099,//紫色};Shader s = new SweepGradient(0, 0, mColors, null);paint.setAntiAlias(true);//设置画笔为无锯齿paint.setStrokeWidth(dip2px(context, 14));//线宽paint.setShader(s);paintFull = new Paint(Paint.ANTI_ALIAS_FLAG);paintFull.setStyle(Paint.Style.FILL_AND_STROKE);paintFull.setAntiAlias(true);//设置画笔为无锯齿paintFull.setShader(s);textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);textPaint.setTextSize(dip2px(context, 22));//设置字体大小textPaint.setColor(0xFFFFFFFF);valuePaint = new Paint(Paint.ANTI_ALIAS_FLAG);valuePaint.setAntiAlias(true);//设置画笔为无锯齿}public void setAirValue(float airValue) {this.airValue = airValue;}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);srcH = h;centerX = w / 2;centerY = h / 2;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);float r = srcH / 2 - paint.getStrokeWidth() * 0.5f - dip2px(context, 200);
//移动中心canvas.translate(centerX, centerY);RectF oval = new RectF();oval.left = -r;//左边oval.top = -r;//上边oval.right = r;//右边oval.bottom = r;//下边canvas.drawArc(oval, startAngle, sweepAngle, false, paint); //绘制圆弧
//绘制圆弧两头的小圆float mr = dip2px(context, 7);float x1 = (float) (-r * Math.sin((360 - sweepAngle) / 2 * Math.PI / 180));float y1 = (float) (r * Math.cos((360 - sweepAngle) / 2 * Math.PI / 180));canvas.drawCircle(x1, y1, mr, paintFull);float x2 = (float) (r * Math.sin((360 - sweepAngle) / 2 * Math.PI / 180));float y2 = (float) (r * Math.cos((360 - sweepAngle) / 2 * Math.PI / 180));canvas.drawCircle(x2, y2, mr, paintFull);
//小圆离球的距离float range = r + dip2px(context, 30);float ar = 12f;
//画周围小球和数字float ax1 = (float) (-range * Math.sin(45 * Math.PI / 180));float ay1 = (float) (range * Math.cos(45 * Math.PI / 180));canvas.drawCircle(ax1, ay1, ar, paintFull);canvas.drawText("0", ax1 - getTextW() * 3, ay1 + getTextH() / 2, textPaint);float ax2 = -range;float ay2 = 0;canvas.drawCircle(ax2, ay2, ar, paintFull);canvas.drawText("50", ax2 - getTextW() * 5, ay2 + getTextH() / 2, textPaint);float ax3 = (float) (-range * Math.sin(45 * Math.PI / 180));float ay3 = (float) (-range * Math.cos(45 * Math.PI / 180));canvas.drawCircle(ax3, ay3, ar, paintFull);canvas.drawText("100", ax3 - getTextW() * 7, ay3 + getTextH() / 2, textPaint);float ax4 = 0;float ay4 = -range;canvas.drawCircle(ax4, ay4, ar, paintFull);canvas.drawText("150", ax4 - getTextW() * 3, ay4 - getTextH(), textPaint);float ax5 = (float) (range * Math.sin(45 * Math.PI / 180));float ay5 = (float) (-range * Math.cos(45 * Math.PI / 180));canvas.drawCircle(ax5, ay5, ar, paintFull);canvas.drawText("200", ax5 + getTextW(), ay5 + getTextH() / 2, textPaint);float ax6 = range;float ay6 = 0;canvas.drawCircle(ax6, ay6, ar, paintFull);canvas.drawText("300", ax6 + getTextW(), ay6 + getTextH() / 2, textPaint);float ax7 = (float) (range * Math.sin(45 * Math.PI / 180));float ay7 = (float) (range * Math.cos(45 * Math.PI / 180));canvas.drawCircle(ax7, ay7, ar, paintFull);canvas.drawText("500", ax7 + getTextW(), ay7 + getTextH() / 2, textPaint);
//画标识小球valuePaint.setColor(0xFFFFFFFF);float cx;float cy;if (airValue >= 0 && airValue <= 50) {cx = (float) (-r * Math.cos((45 - airValue * 0.9) * Math.PI / 180));cy = (float) (r * Math.sin((45 - airValue * 0.9) * Math.PI / 180));} else if (airValue > 50 && airValue <= 150) {cx = (float) (-r * Math.cos((airValue * 0.9 - 45) * Math.PI / 180));cy = (float) (-r * Math.sin((airValue * 0.9 - 45) * Math.PI / 180));} else if (airValue > 150 && airValue <= 200) {cx = (float) (-r * Math.cos((airValue * 0.9 - 45) * Math.PI / 180));cy = (float) (-r * Math.sin((airValue * 0.9 - 45) * Math.PI / 180));} else if (airValue > 200 && airValue <= 300) {cx = (float) (-r * Math.cos((airValue * 0.45 + 45) * Math.PI / 180));cy = (float) (-r * Math.sin((airValue * 0.45 + 45) * Math.PI / 180));} else if (airValue > 300 && airValue <= 500) {//此处有问题cx = (float) (r * Math.cos(((airValue - 300) * 0.225) * Math.PI / 180));cy = (float) (r * Math.sin(((airValue - 300) * 0.225) * Math.PI / 180));} else {cx = (float) (-r * Math.cos(45 * Math.PI / 180));cy = (float) (r * Math.sin(45 * Math.PI / 180));}canvas.drawCircle(cx, cy, dip2px(context, 11), valuePaint);canvas.drawCircle(cx, cy, dip2px(context, 4), paintFull);}/*** dip转px** @param context* @param dpValue* @return*/private int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}/*** 获取"正"的高度** @return*/private float getTextH() {Paint pFont = new Paint();Rect rect = new Rect();
//返回包围整个字符串的最小的一个Rect区域pFont.getTextBounds("正", 0, 1, rect);return rect.height();}/*** 获取"正"的宽度** @return*/private float getTextW() {Paint pFont = new Paint();Rect rect = new Rect();
//返回包围整个字符串的最小的一个Rect区域pFont.getTextBounds("正", 0, 1, rect);return rect.width();}
}

最终章:合并大法

效果:效果如上图

package com.xiaomakj.utillib.widget;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.view.View;import com.vondear.rxtool.RxTool;
import com.xiaomakj.utillib.R;/*** 弧形进度条** @author Vondear* @date 2015/12/03*/
public class RxRoundProgress extends View {private int count;public static final int STROKE = 0;/*** 画笔对象的引用*/private Paint paint;private Path mPath;private Paint textPaint;private Paint centerPaint;private Paint dotPaint;private Paint dotTexttPaint;/*** 圆环的颜色*/private int roundColor;/*** 圆环进度的颜色*/private int roundProgressColor;/*** 中间进度百分比的字符串的颜色*/private int textColor;/*** 中间进度百分比的字符串的字体*/private float textSize;/*** 圆环的宽度*/private float roundWidth;/*** 最大进度*/private double max;/*** 当前进度*/private double progress;/*** 是否显示中间的进度*/private boolean textIsDisplayable;/*** 进度的风格,实心或者空心*/private int style;private int centerX;//中心Xprivate int centerY;//中心Yprivate int srcH;//控件高度public RxRoundProgress(Context context) {this(context, null);}public RxRoundProgress(Context context, AttributeSet attrs) {this(context, attrs, 0);}public RxRoundProgress(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);//进度条画笔paint = new Paint();mPath = new Path();//文字画笔textPaint = new Paint();//文字画笔centerPaint = new Paint();//文字画笔dotPaint = new Paint();//文字画笔dotTexttPaint = new Paint();TypedArray mTypedArray = context.obtainStyledAttributes(attrs,R.styleable.RxRoundProgress);//获取自定义属性和默认值roundColor = mTypedArray.getColor(R.styleable.RxRoundProgress_roundColor, Color.WHITE);roundProgressColor = mTypedArray.getColor(R.styleable.RxRoundProgress_roundProgressColor, Color.parseColor("#F6B141"));textColor = mTypedArray.getColor(R.styleable.RxRoundProgress_textColor, Color.GREEN);textSize = mTypedArray.getDimension(R.styleable.RxRoundProgress_textSize1, 15);roundWidth = mTypedArray.getDimension(R.styleable.RxRoundProgress_roundWidth, 20);max = mTypedArray.getInteger(R.styleable.RxRoundProgress_max, 100);textIsDisplayable = mTypedArray.getBoolean(R.styleable.RxRoundProgress_textIsDisplayable, true);style = mTypedArray.getInt(R.styleable.RxRoundProgress_style, 0);mTypedArray.recycle();textPaint.setColor(roundColor);textPaint.setAntiAlias(true);textPaint.setTextSize(dp2px(13));dotPaint.setStyle(Paint.Style.STROKE);dotPaint.setAntiAlias(true);dotTexttPaint.setStyle(Paint.Style.FILL);dotTexttPaint.setAntiAlias(true);dotTexttPaint.setTextSize(dp2px(12));//中间分数centerPaint.setColor(textColor);centerPaint.setAntiAlias(true);}int[] mColors = new int[]{Color.GREEN, 0xFF12B8CA,Color.RED, Color.RED,Color.YELLOW, Color.YELLOW,Color.BLUE, Color.GREEN,};/*** dp转px** @param dpValue dp值* @return px值*/public int dp2px(float dpValue) {final float scale = RxTool.getContext().getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);srcH = h;centerX = w / 2;centerY = h / 2;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);/*** 画最外层的大圆环*///向右边取启点//间距int margin = dp2px(2);int tPadding = dp2px(40);//获取圆心的x坐标int center = getWidth() / 2 - tPadding;//圆环的半径int radius = (int) (center - roundWidth / 2);//用于定义的圆弧的形状和大小的界限RectF innerOval = new RectF(center - radius + tPadding, center - radius + tPadding, center + radius + tPadding, center + radius + tPadding);int outWidth = dp2px(20);RectF outOval = new RectF(center - radius + tPadding - outWidth, center - radius + tPadding - outWidth, center + radius + tPadding + outWidth, center + radius + tPadding + outWidth);//画外圆mPath.reset();mPath.addArc(outOval, 135, 270);//计算路径的长度PathMeasure pathMeasure = new PathMeasure(mPath, false);float length = pathMeasure.getLength();float step = length / 60;DashPathEffect dashPathEffect = new DashPathEffect(new float[]{step / 3, step * 2 / 3}, 0);SweepGradient mColorShader = new SweepGradient(centerX, centerX, mColors, null);paint.setPathEffect(dashPathEffect);//設置彩色paint.setShader(mColorShader);//设置空心paint.setStyle(Paint.Style.STROKE);//设置圆环的宽度paint.setStrokeWidth(roundWidth / 2);//消除锯齿paint.setAntiAlias(true);paint.setStrokeCap(Paint.Cap.BUTT);canvas.drawPath(mPath, paint);//画内圆mPath.reset();mPath.addArc(innerOval, 135, 270);//消除间隔paint.setPathEffect(null);paint.setStrokeWidth(roundWidth);//設置彩色canvas.drawPath(mPath, paint);//放弃灰底色圆
//        paint.setStrokeCap(Paint.Cap.ROUND);
//        paint.setStrokeWidth(roundWidth);
//        paint.setColor(roundColor);
//        paint.setPathEffect(null);
//        //設置彩色
//        paint.setShader(null);//根据进度画圆弧
//        canvas.drawArc(innerOval, 135, 270, false, paint);//		canvas.drawRect(0, 0, getWidth(), getWidth(), paint);// 正方形centerPaint.setTextSize(dp2px(18));float textH = getTextH(centerPaint, ((int) getProgress()) + "");canvas.drawText(((int) getProgress()) + "",(center + tPadding) - centerPaint.measureText((int) getProgress() + "") / 2,center + tPadding + textH + radius / 2, centerPaint);centerPaint.setTextSize(dp2px(14));float textH2 = getTextH(centerPaint, "平均成绩");canvas.drawText("平均成绩",(center + tPadding) - centerPaint.measureText("平均成绩") / 2,center + tPadding + textH + textH2 + margin * 2 + radius / 2, centerPaint);centerPaint.setTextSize(dp2px(12));float textH3 = getTextH(centerPaint, "已完成考试" + count + "次");canvas.drawText("已完成考试" + count + "次",(center + tPadding) - centerPaint.measureText("已完成考试" + count + "次") / 2,center + tPadding + textH + textH2 + textH3 + margin * 3 + radius / 2, centerPaint);//左边最小值
//        canvas.drawText("0分", (float) (radius - Math.sqrt(2) * (radius / 2) + 10), (float) (2 * radius - Math.sqrt(2) * (radius / 4) + 130), textPaint);//右边最大值
//        canvas.drawText(getMax() + "分", (float) (radius + Math.sqrt(2) * (radius / 2) + 138), (float) (2 * radius - Math.sqrt(2) * (radius / 4) + 130), textPaint);/*if(progress<50){double money = progress*1+(Math.floor(Math.random()*getMax()));canvas.drawText(money+"", (center+toright) - centerPaint.measureText(money+"")/2-15, center+165, centerPaint);//右边最大值}else{*///}//右边最大值
//        canvas.drawText("分", (center + toright) + centerPaint.measureText(RxDataTool.format2Decimals(getProgress() + "")) / 2 - 10, center + 105, dotPaint);int[] mColors = new int[]{0xFFFF0000,//红色0xFFFFFF00,//黄色0xFF0B74FE,//蓝色0xFF99FF00//草绿色};String[] mStrings = new String[]{"差",//红色"中",//黄色"良",//蓝色"优"//草绿色};for (int i = 0; i < mColors.length; i++) {dotPaint.setColor(mColors[i]);dotTexttPaint.setColor(mColors[i]);canvas.drawCircle(tPadding * 2 / 3 + i / 5f * getWidth(), getHeight() - dp2px(7.5f),dp2px(5), dotPaint);canvas.drawText(mStrings[i],tPadding * 2 / 3 + i / 5f * getWidth() + getTextW(dotTexttPaint, mStrings[i]) / 2 + margin,getHeight() - dp2px(10) + getTextH(dotTexttPaint, mStrings[i]) / 2,dotTexttPaint);}
//        /**
//         * 画进度百分比
//         */
//        paint.setStrokeWidth(0);
//        paint.setColor(textColor);
//        paint.setTextSize(textSize);
//        //设置字体
//        paint.setTypeface(Typeface.DEFAULT_BOLD);
//        //中间的进度百分比,先转换成float在进行除法运算,不然都为0
//        int percent = (int) (((float) progress / (float) max) * 100);
//        //测量字体宽度,我们需要根据字体的宽度设置在圆环中间
//        float textWidth = paint.measureText(percent + "%");
//
//        if (textIsDisplayable && percent != 0 && style == STROKE) {
            canvas.drawText(percent + "%", center + toright - textWidth / 2, center + toright + textSize / 2, paint); //画出进度百分比
//        }//还原画笔paint.setPathEffect(null);paint.setShader(null);paint.setStyle(Paint.Style.FILL);Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pointer);Rect bitmapRec = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());RectF pointerOval = new RectF(center + tPadding - bitmap.getWidth() / 2,center + tPadding - bitmap.getWidth() / 2,center + tPadding + bitmap.getHeight() / 2,center + tPadding + bitmap.getHeight() / 2);Matrix matrix = new Matrix();matrix.postRotate(-90-45 + 270 * ((float) progress / (float) max), bitmapRec.width() / 2, bitmapRec.height());matrix.postTranslate(pointerOval.centerX()-bitmap.getWidth()/2, pointerOval.centerY()-bitmap.getHeight());canvas.drawBitmap(bitmap, matrix, paint);//canvas.drawBitmap(bitmap, bitmapRec, pointerOval, paint);/*** 画圆弧 ,画圆环的进度*///设置进度是实心还是空心paint.setStrokeWidth(roundWidth); //设置圆环的宽度paint.setColor(roundProgressColor);  //设置进度的颜色paint.setAntiAlias(true);switch (style) {case STROKE: {paint.setStyle(Paint.Style.STROKE);if (progress >= 0) {canvas.drawArc(innerOval, 45, (270 * ((float) progress / (float) max - 1)), false, paint);  //根据进度画圆弧}break;}default:break;}}public synchronized double getMax() {return max;}/*** 设置进度的最大值** @param max*/public synchronized void setMax(double max) {if (max < 0) {throw new IllegalArgumentException("max not less than 0");}this.max = max;}/*** 获取进度.需要同步** @return*/public synchronized double getProgress() {return progress;}/*** 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步* 刷新界面调用postInvalidate()能在非UI线程刷新** @param progress*/public synchronized void setProgress(double progress) {if (progress < 0) {this.progress = progress;//throw new IllegalArgumentException("progress not less than 0");}if (progress > max) {progress = max;}if (progress <= max) {this.progress = progress;postInvalidate();}}/*** 获取"正"的高度** @return*/private float getTextH(Paint pFont, String text) {Rect rect = new Rect();
//返回包围整个字符串的最小的一个Rect区域pFont.getTextBounds(text, 0, 1, rect);return rect.height();}/*** 获取"正"的宽度** @return*/private float getTextW(Paint pFont, String text) {Rect rect = new Rect();
//返回包围整个字符串的最小的一个Rect区域pFont.getTextBounds(text, 0, 1, rect);return rect.width();}public int getCricleColor() {return roundColor;}public void setCricleColor(int cricleColor) {this.roundColor = cricleColor;}public int getCricleProgressColor() {return roundProgressColor;}public void setCricleProgressColor(int cricleProgressColor) {this.roundProgressColor = cricleProgressColor;}public int getTextColor() {return textColor;}public void setTextColor(int textColor) {this.textColor = textColor;}public float getTextSize() {return textSize;}public void setTextSize(float textSize) {this.textSize = textSize;}public float getRoundWidth() {return roundWidth;}public void setRoundWidth(float roundWidth) {this.roundWidth = roundWidth;}public int setCount(int count) {return this.count;}}

style

    <declare-styleable name="RxRoundProgress"><attr format="color" name="roundColor"/><attr format="color" name="roundProgressColor"/><attr format="dimension" name="roundWidth"/><attr format="color" name="textColor"/><attr format="dimension" name="textSize1"/><attr format="integer" name="max"/><attr format="boolean" name="textIsDisplayable"/><attr name="style"><enum name="STROKE" value="0"/><enum name="FILL" value="1"/></attr></declare-styleable>

可以看出来笔者自己写的也是二开版本,面向对象不就是只要结果,不讲过程吗?嘿嘿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18884.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

半个月时间把MySQL重新巩固了一遍,梳理了一篇几万字 “超硬核” 文章!

MySQL 是最流行的关系型数据库管理系统&#xff0c;在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System&#xff1a;关系数据库管理系统)应用软件之一 MySQL实战文章目录 MySQL必会知识点梳理 (必看)【介绍】什么是数据库MySQL数据库RDBMS 术语数据库…

为什么只有涨价才能救小米?

作者&#xff1a;仙人JUMP 来源&#xff1a;https://www.xttblog.com/?p4777 01 小米10发布了&#xff0c;虽然各项参数都已经早就被剧透完了&#xff0c;那个充电器淘宝各路品牌都卖了大半年了&#xff0c;不过价格还是香的。 产品本身没什么惊喜&#xff0c;吊打友商几个月前…

不一样的母爱

文/爱笑的王阿哥(ISmileLi) 每个人都有自己的母亲 每位母亲都爱自己的孩子 我们也爱自己的母亲 但却和母亲爱我们不一样 我们对母亲的爱 像小桥流水 母亲对我们的爱 像江河湖海 每位母亲不同 表达爱的方式也不同 她们的爱 或平静 或深沉 或直白 每位母亲不同 表达爱的思想…

想要艺术气质高逼格,不吹牛真的有捷径可走

文中呈现出的经典西方作品&#xff0c;足以让你大脑空缺的西方美术史部分得以补充&#xff0c;想要艺术气质高逼格&#xff0c;读完是关键&#xff0c;你懂得&#xff01; 达芬奇蒙娜丽莎 达芬奇的《蒙娜丽莎》成功地塑造了资本主义上升时期一位城市有产阶级妇女形象。据记载…

【码歌】代码歌颂人生----怎样给Swagger换皮肤?

上文我们讲到在Spring Boot中集成Swagger2的组件&#xff0c;那今天我们就来聊聊怎样给Swagger换个皮肤呢&#xff1f;环境搭建&#xff1a;使用Spring Boot依赖swagger-spring-boot-starter进行快速构建。具体swagger-spring-boot-starter可以参考&#xff1a;https://github.…

Spring中的Aop简单实例讲解

注重版权&#xff0c;转载请注明原作者和原文链接 作者&#xff1a;码农BookSea 原文链接&#xff1a;https://editor.csdn.net/md?articleId107092569 Aop&#xff0c;即面向切面编程&#xff0c;面向切面编程的目标就是分离关注点 比如&#xff1a;一个骑士只需要关注守护…

七夕我们在歌颂什么

“七夕节”是我国最具有浪漫色彩的节日&#xff0c;也是古代少女、闺妇最看重的节日。因主要的参与者是少女&#xff0c;活动以乞巧为主&#xff0c;也被称为“乞巧节”或“少女节”、“女儿节”。 农历七月初七&#xff0c;正值夏秋&#xff0c;晴朗夜空&#xff0c;明亮的牵牛…

细微之处见真章之JSON格式美化

一、背景 今天 段段 在技术群里提出一个问题&#xff1a;”如何实现JSON的格式美化“。 具体含义是&#xff0c;通过后端代码实现将紧凑的JSON字符串变为更美观的形式。 如下面的JSON字符串 {\"age\":0,\"name\":\"张三\",\"sex\":…

应对互联网变局,这 8 件事必须要做。

阅读本文大概需要 1.8 分钟。 昨晚直播说了挺多&#xff0c;整体都是跟互联网相关&#xff0c;也提到整体环境&#xff0c;有不少人失去工作后不知所措&#xff0c;也有不少人说创业的合规成本太高应该怎么做&#xff1f;更有不少在职场的人表示大家太卷又该怎么应对等等。 上述…

我让ChatGPT用CSS3画一个皮卡丘,还是自己画的可爱

突然想到了小时候看过的动画片《皮卡丘》&#xff0c;于是突然就想&#xff0c;ChatGPT肯定也看过&#xff0c;他哪有不知道的东西啊&#xff0c;于是就想着让他帮我画一个&#xff0c;他画出来之后&#xff0c;我笑了&#xff0c;这啥玩意儿啊。 目录 一、第一次尝试让ChatGP…

总是后来居上,我曾经的偶像公司又火了 !

1 有一家IT公司&#xff0c;在它成立40多年的历史上&#xff0c;非常幸运&#xff0c;非常罕见地踏中了三次浪潮。 这三次浪潮分别是PC、云计算和AI。 尤其是后两次&#xff0c;在十年的时间内连续踏上&#xff0c;实在是牛。 没错&#xff0c;这家公司就是微软。 PC时代&#…

Python速查表;腾讯大佬的AIGC设计应用汇总;这个世界需要10亿开发者;67个最常用AI工具清单 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『一份必收藏的 Python 3 速查表』可运行代码中文注释 随着AIGC浪潮的兴起&#xff0c;越来越多小伙伴尝试着使用 GPT 类工具开发小程…

ChromeBox 推出 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 5 月 29 日&#xff0c;在 1985 年的今天&#xff0c;伊士曼柯达公司推出了一种名为 Ektaprint 电子出版系统的电子出版系统&#xff0c;旨在允许公司编辑、打印…

“28 年后,Windows 终于原生支持了 RAR 文件!”

整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 即将彻底告别那些第三方存档应用程序。 今天凌晨&#xff0c;微软在西雅图举办了一场关于 AI 的“小春晚”——Build 2023 大会。在大会上&#xff0c;除了宣布的 Bing 将引入 ChatGPT 成为默认搜索体验…

【GPT-4】HuggingFace万字访谈:OpenAI不足为惧,每个公司都会有自己的GPT-4

日前,Hugging Face 创始人 Clem Delangue 参与了一场访谈,过程中谈到了以下几个关键问题: Hugging Face 的创始故事 大模型 AI 未来会如何迭代? 大公司闭源会对开源社区产生影响吗? 驱动大模型进步的核心是什么? 通用大模型和专用小模型有优劣之分吗? 现阶段如何进行更具…

AIGC新时代,注意政策走向,产业方向,拥抱可信AI。需要了解基本理论,基础模型,前沿进展,产品应用,以及小小的项目复现

AIGC&#xff08;AI-Generated Content&#xff0c;AI生成内容&#xff09;是指基于生成对抗网络&#xff08;GAN&#xff09;、大型预训练模型等人工智能技术的方法&#xff0c;通过对已有数据进行学习和模式识别&#xff0c;以适当的泛化能力生成相关内容的技术。类似的概念还…

a16z最新预判——AI虚拟陪伴生态全解析!

导语 “AI的魔力在于它的不断演变。有一天&#xff0c;它会比真实的“女朋友”更出色。未来某一天&#xff0c;选择真实的伴侣反而会成为第二优先级的选择。” 这是来自CarynAI社区的一位早期用户&#xff0c;在这个社区中已经有超过20,000人了。这个社区的用户们每分钟支付1美…

A16Z:AI Companion的趋势洞察

[ AI技术在人际交往中的应用是否会对人类关系产生负面影响&#xff1f; ] shadow 我想发起一场实验&#xff1a;你愿意参与这一场全程由AI主导的社交游戏吗&#xff1f;你只需要接受or拒接AI给你的任务。 听起来就很有意思 # # 预约参加 …… opus 今天推荐的是A16Z的一篇文章&…

第一批用ChatGPT坐牢的人,都玩的是哪些套路?

通过GPT在短时间内生成完整诈骗话术&#xff0c;套路啊套路 “虚拟角色”可以虚拟客服&#xff0c;还可以虚拟恋人玩杀猪盘 让受害人以为自己“坠入爱河” 套路还是从前的套路 但骗子用上了新的工具 又换上了很多马甲 防不胜防 你以为OpenAI不知道骗子会用这个工具来做坏…

我用GPT搭建了一个虚拟女友!

Datawhale干货 作者&#xff1a;仲泰&#xff0c;Datawhale成员 1. 作者知乎&#xff1a;https://www.zhihu.com/people/yong-tan-39-67 2.我用GPT搭建了一个虚拟女友-哔哩哔哩&#xff1a;https://b23.tv/GYYwMcq 3. 五月学习&#xff1a;ChatGPT应用组队学习来了&#xff01…