摘要:本文将带你了解Android应用开发Android 自定义控件教程:绘制一个会动的能力分布图,希望本文对大家学Android有所帮助。
本文将带你了解Android应用开发Android 自定义控件教程:绘制一个会动的能力分布图,希望本文对大家学Android有所帮助。
Android 自定义控件教程:绘制一个会动的能力分布图。
一、准备工作
新建类,继承View,修改构造方法为:
public AbilityView(Context context) {
this(context, null);
}
public AbilityView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
}
public AbilityView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context,attrs);
}
即一参和二参方法都调用三参的方法。
二、初始化
全局变量:
//数据
private AbilityBean data;
//角的个数
private int n;
//顶点到中心点的距离
private float radius;
//半径分为几段
private int intervalCount;
//间隔的角度
private float angle;
//画线的笔
private Paint linePaint;
//画文字的笔
private Paint textPaint;
//存储多边形顶点数组的数组
private List<list
//存储能力点的数组
private ArrayList
//控制变化的参数
private static int count = 0 ;
private int times = 40;
private int intervalTime = 25;
//计时线程池
private ScheduledExecutorService scheduledExecutorService;
private MyHandler myHandler;
初始化方法:
private void init(Context context, AttributeSet attrs){
// 获取自定义的属性
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AbilityView);
n = typedArray.getInteger(R.styleable.AbilityView_corner,7);
radius = typedArray.getDimension(R.styleable.AbilityView_radius,dp2px(context,100));
intervalCount = typedArray.getInteger(R.styleable.AbilityView_intervalCount,4);
typedArray.recycle();
// 算出间隔角度
angle = (float) ((2 * Math.PI)/n);
// 初始化集合存储各个顶点
pointsArrayList = new ArrayList<>();
float x;
float y;
for (int i = 0; i < intervalCount; i++) {
List
float r = radius * ((float)(intervalCount-i)/intervalCount);
for (int j = 0; j < n; j++) {
// 此处减去π/2是为了让点逆时针旋转90度(为了让图是立着的 更加美观)
x = (float) (r * Math.cos(j * angle - Math.PI/2));
y = (float) (r * Math.sin(j * angle - Math.PI/2));
pointFList.add(new PointF(x,y));
}
pointsArrayList.add(pointFList);
}
abilityPoints = new ArrayList<>();
// 初始化画笔
linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
linePaint.setStrokeWidth(dp2px(context,1f));
textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setTextSize(sp2px(context,14));
textPaint.setTextAlign(Paint.Align.CENTER);
textPaint.setColor(Color.BLACK);
// 初始化线程池 用于动画变动
scheduledExecutorService = Executors.newScheduledThreadPool(1);
myHandler = new MyHandler(this);
}
在各个部分都给出了注释。
另外还有Handler的类:
private static class MyHandler extends Handler{
WeakReference
public MyHandler(View view){
weakReference = new WeakReference<>(view);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
count++;
weakReference.get().invalidate();
}
}
注意内存泄露的隐患
三、绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 将画布移动到中心
canvas.translate(getWidth()/2,getHeight()/2);
// 画每个面
drawPolygon(canvas);
// 勾勒外围轮廓线
drawOutLine(canvas);
// 绘制文本
drawText(canvas);
// 画出能力值的线
drawAbility(canvas);
}
private void drawPolygon(Canvas canvas) {
canvas.save();
linePaint.setStyle(Paint.Style.FILL_AND_STROKE);
Path path = new Path();
for (int i = 0; i < intervalCount; i++) {
switch (i) {
case 0:
linePaint.setColor(Color.parseColor(#D4F0F3));
break;
case 1:
linePaint.setColor(Color.parseColor(#99DCE2));
break;
case 2:
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号