Android应用开发Android 自定义控件教程:绘制一个会动的能力分布图
白羽 2019-04-15 来源 :网络 阅读 1032 评论 0

摘要:本文将带你了解Android应用开发Android 自定义控件教程:绘制一个会动的能力分布图,希望本文对大家学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> pointsArrayList;
    //存储能力点的数组
    private ArrayListabilityPoints;
    //控制变化的参数
    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  pointFList = new ArrayList<>();
               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  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频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程