package com.com.mr_wrong.CustomView.Shader;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by Mr_Wrong on 15/8/25.
*/
public class MultiCricleView extends View {
private static final float STROKE_WIDTH = 1F / 256F, // 描边宽度占比
SPACE = 1F / 64F,// 大圆小圆线段两端间隔占比
LINE_LENGTH = 3F / 32F, // 线段长度占比
CRICLE_LARGER_RADIU = 3F / 32F,// 大圆半径
CRICLE_SMALL_RADIU = 5F / 64F,// 小圆半径
ARC_RADIU = 1F / 8F,// 弧半径
ARC_TEXT_RADIU = 5F / 32F;// 弧围绕文字半径
private Paint strokePaint, textPaint;// 描边画笔和文字画笔
private int size;// 控件边长
private float strokeWidth;// 描边宽度
private float ccX, ccY;// 中心圆圆心坐标
private float largeCricleRadiu, smallCricleRadiu;// 大圆半径和小圆半径
private float lineLength;// 线段长度
private float space;// 大圆小圆线段两端间隔
private float textOffsetY;// 文本的Y轴偏移值
public MultiCricleView(Context context, AttributeSet attrs) {
super(context, attrs);
// 初始化画笔
initPaint(context);
}
/**
* 初始化画笔
*
* @param context Fuck
*/
private void initPaint(Context context) {
/*
* 初始化描边画笔
*/
strokePaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
strokePaint.setStyle(Paint.Style.STROKE);
strokePaint.setColor(Color.WHITE);
strokePaint.setStrokeCap(Paint.Cap.ROUND);
/*
* 初始化文字画笔
*/
textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.SUBPIXEL_TEXT_FLAG);
textPaint.setColor(Color.WHITE);
textPaint.setTextSize(30);
textPaint.setTextAlign(Paint.Align.CENTER);
textOffsetY = (textPaint.descent() + textPaint.ascent()) / 2;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 强制长宽一致
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
// 获取控件边长
size = w;
// 参数计算
calculation();
}
/*
* 参数计算
*/
private void calculation() {
// 计算描边宽度
strokeWidth = STROKE_WIDTH * size;
// 计算大圆半径
largeCricleRadiu = size * CRICLE_LARGER_RADIU;
// 计算小圆半径
smallCricleRadiu = size * CRICLE_SMALL_RADIU;
// 计算线段长度
lineLength = size * LINE_LENGTH;
// 计算大圆小圆线段两端间隔
space = size * SPACE;
// 计算中心圆圆心坐标
ccX = size / 2;
ccY = size / 2 + size * CRICLE_LARGER_RADIU;
// 设置参数
setPara();
}
/**
* 设置参数
*/
private void setPara() {
// 设置描边宽度
strokePaint.setStrokeWidth(strokeWidth);
}
@Override
protected void onDraw(Canvas canvas) {
// 绘制背景
canvas.drawColor(0xFFF29B76);
// 绘制中心圆
canvas.drawCircle(ccX, ccY, largeCricleRadiu, strokePaint);
canvas.drawText("AigeStudio", ccX, ccY - textOffsetY, textPaint);
// 绘制左上方图形
drawTopLeft(canvas);
// 绘制右上方图形
drawTopRight(canvas);
// 绘制左下方图形
drawBottomLeft(canvas);
// 绘制下方图形
drawBottom(canvas);
// 绘制右下方图形
drawBottomRight(canvas);
}
/**
* 绘制左上方图形
*
* @param canvas
*/
private void drawTopLeft(Canvas canvas) {
// 锁定画布
canvas.save();
// 平移和旋转画布
canvas.translate(ccX, ccY);
canvas.rotate(-30);
// 依次画:线-圈-线-圈
canvas.drawLine(0, -largeCricleRadiu, 0, -lineLength * 2, strokePaint);
canvas.drawCircle(0, -lineLength * 3, largeCricleRadiu, strokePaint);
Path path = new Path();
int x = 100;
//canvas.drawText("Apple", 0, -lineLength * 3 - textOffsetY, textPaint);
path.moveTo(-x * 1.73f, -lineLength * 3 - textOffsetY - x);
path.lineTo(x * 1.73f, -lineLength * 3 - textOffsetY + x);
canvas.drawTextOnPath("Apple", path, 0, 0, textPaint);
canvas.drawLine(0, -largeCricleRadiu * 4, 0, -lineLength * 5, strokePaint);
canvas.drawCircle(0, -lineLength * 6, largeCricleRadiu, strokePaint);
path.reset();
path.moveTo(-x * 1.73f, -lineLength * 6 - textOffsetY - x);
path.lineTo(x * 1.73f, -lineLength * 6 - textOffsetY + x);
canvas.drawTextOnPath("Orange", path, 0, 0, textPaint);
//canvas.drawText("Orange", 0, -lineLength * 6 - textOffsetY, textPaint);
// 释放画布
canvas.restore();
}
/**
* 绘制右上方图形
*
* @param canvas
*/
private void drawTopRight(Canvas canvas) {
float cricleY = -lineLength * 3;
// 锁定画布
canvas.save();
// 平移和旋转画布
canvas.translate(ccX, ccY);
canvas.drawText("Tropical", 0, cricleY - textOffsetY, textPaint);
canvas.rotate(30);
// 依次画:线-圈
canvas.drawLine(0, -largeCricleRadiu, 0, -lineLength * 2, strokePaint);
canvas.drawCircle(0, cricleY, largeCricleRadiu, strokePaint);
// 释放画布
canvas.restore();
}
private void drawBottomLeft(Canvas canvas) {
float lineYS = -largeCricleRadiu - space, lineYE = -lineLength * 2 - space, cricleY = -lineLength * 2 - smallCricleRadiu - space * 2;
// 锁定画布
canvas.save();
// 平移和旋转画布
canvas.translate(ccX, ccY);
canvas.rotate(-100);
// 依次画:(间隔)线(间隔)-圈
canvas.drawLine(0, lineYS, 0, lineYE, strokePaint);
canvas.drawCircle(0, cricleY, smallCricleRadiu, strokePaint);
canvas.drawText("Banana", 0, cricleY - textOffsetY, textPaint);
// 释放画布
canvas.restore();
}
private void drawBottom(Canvas canvas) {
float lineYS = -largeCricleRadiu - space, lineYE = -lineLength * 2 - space, cricleY = -lineLength * 2 - smallCricleRadiu - space * 2;
// 锁定画布
canvas.save();
// 平移和旋转画布
canvas.translate(ccX, ccY);
canvas.rotate(180);
// 依次画:(间隔)线(间隔)-圈
canvas.drawLine(0, lineYS, 0, lineYE, strokePaint);
canvas.drawCircle(0, cricleY, smallCricleRadiu, strokePaint);
canvas.drawText("Cucumber", 0, cricleY - textOffsetY, textPaint);
// 释放画布
canvas.restore();
}
private void drawBottomRight(Canvas canvas) {
float lineYS = -largeCricleRadiu - space, lineYE = -lineLength * 2 - space, cricleY = -lineLength * 2 - smallCricleRadiu - space * 2;
// 锁定画布
canvas.save();
// 平移和旋转画布
canvas.translate(ccX, ccY);
canvas.rotate(100);
// 依次画:(间隔)线(间隔)-圈
canvas.drawLine(0, lineYS, 0, lineYE, strokePaint);
canvas.drawCircle(0, cricleY, smallCricleRadiu, strokePaint);
canvas.drawText("Vibrators", 0, cricleY - textOffsetY, textPaint);
// 释放画布
canvas.restore();
}
}