```canvas
public class BubbleView extends View { private Paint textPaint; private Paint bgPaint; private Paint whitePaint; private float offset; private RectF rectF; private RectF innerRectF; private int padding = 20; private int innerPadding = 35; private int BUBBLEOFFSET=35; private ValueAnimator valueAnimator; private String text="5g"; public BubbleView(Context context) { super(context); init(); } public BubbleView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public BubbleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } int[] colors = {0xFFCCFE5F,0xffBDF041}; private void init() { bgPaint=new Paint(); bgPaint.setColor(Color.GREEN); bgPaint.setAntiAlias(true); bgPaint.setStrokeWidth(10); bgPaint.setStyle(Paint.Style.FILL); whitePaint=new Paint(); whitePaint.setColor(Color.WHITE); whitePaint.setAntiAlias(true); whitePaint.setStrokeWidth(10); whitePaint.setStyle(Paint.Style.STROKE); whitePaint.setStrokeCap( Paint.Cap.ROUND ); textPaint = new Paint(); textPaint.setColor(0xff339855); textPaint.setAntiAlias(true); textPaint.setStrokeWidth(35); textPaint.setStyle(Paint.Style.FILL); textPaint.setTextAlign(Paint.Align.CENTER); textPaint.setTextSize(75); textPaint.setTypeface(Typeface.DEFAULT_BOLD); Paint.FontMetrics fontMetrics = new Paint.FontMetrics(); textPaint.getFontMetrics(fontMetrics); offset = (fontMetrics.descent + fontMetrics.ascent) / 2; valueAnimator = ObjectAnimator.ofFloat(this, "translationY", BUBBLEOFFSET,-BUBBLEOFFSET); valueAnimator.setDuration(1500); valueAnimator.setRepeatMode(ObjectAnimator.REVERSE); valueAnimator.setRepeatCount(INFINITE); valueAnimator.start(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int mode= MeasureSpec.getMode(widthMeasureSpec); if(mode==MeasureSpec.AT_MOST||mode==MeasureSpec.UNSPECIFIED){ setMeasuredDimension(240,240); }else{ super.onMeasure(widthMeasureSpec, widthMeasureSpec); } } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); rectF = new RectF(padding, padding, w - padding, h - padding); innerRectF = new RectF(innerPadding, innerPadding, w - innerPadding, h - innerPadding); Shader shader1 = new RadialGradient(rectF.centerX(), rectF.centerY(),rectF.centerX()-rectF.left,colors,new float[]{0.8f,02f},Shader.TileMode.CLAMP); bgPaint.setShader(shader1); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (rectF == null) return; canvas.drawCircle(rectF.centerX(), rectF.centerY(), rectF.centerX()-rectF.left, bgPaint); whitePaint.setColor(0xefffffff); canvas.drawArc(innerRectF,180,60,false,whitePaint); canvas.drawArc(innerRectF,250,2,false,whitePaint); whitePaint.setColor(0xaaffffff); canvas.drawArc(innerRectF,15,60,false,whitePaint); canvas.drawText(text, rectF.centerX(), rectF.centerY() - offset, textPaint); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); if(valueAnimator!=null)valueAnimator.cancel(); valueAnimator=null; }}複製代碼
```bash