Android自定义View之网络图

新建项目,新建CircualRectView类继承自View,实现OnGlobalLayoutListener接口,
定义变量(RectModel为实体类):

private Context mContext;
    private int mViewWidth,mViewHeight;
    private Paint mRectPaint,mTextPaint,mLinePaint;
    private List<String> mDrawingText;
    private List<RectModel> mRectModels;
    private int mCenterRectHeight = 50;
    private int mChildRectDistance = 200 ;
    private int mSingleChildDegreeDistance;

添加绘制代码,修改onDraw函数如下:

public void init(Context context){
        mContext = context;
        mRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mTextPaint = new Paint();
        mLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mRectPaint.setStyle(Paint.Style.FILL);
        mRectPaint.setColor(Color.BLUE);
        mTextPaint.setStrokeWidth(3);
        mTextPaint.setColor(Color.RED);
        mLinePaint.setColor(Color.BLUE);
        mRectModels = new ArrayList<>();
        mDrawingText = new ArrayList<>();
        mDrawingText.add("中心节点");
        mDrawingText.add("节点1");
        mDrawingText.add("节点2");
        mDrawingText.add("节点3");
        mDrawingText.add("节点4");
        mDrawingText.add("节点5");
        mDrawingText.add("节点6");
        mDrawingText.add("节点7");
        getViewTreeObserver().addOnGlobalLayoutListener(this);
    }

    @Override
    public void onGlobalLayout() {
        mViewWidth = getWidth();
        mViewHeight = getHeight();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        /*
        * 绘制中心节点
        * */
        RectModel rectModel = new RectModel(MeasureUtils.getRect(mViewWidth/2,mViewHeight/2,mDrawingText.get(0).length()*20,mCenterRectHeight),mDrawingText.get(0),0);
        mRectModels.add(rectModel);
        drawNode(canvas,rectModel);
        /*
        * 画周围子节点
        * */
        mSingleChildDegreeDistance = 360 / (mDrawingText.size()-1);

        for (int i=0;i<mDrawingText.size()-1;i++){
            RectModel rectModel1 = new RectModel(MeasureUtils.getRect(mChildRectDistance+mViewWidth/2,mViewHeight/2,mDrawingText.get(i+1).length()*20,mCenterRectHeight),mDrawingText.get(i+1),i*mSingleChildDegreeDistance);
            mRectModels.add(rectModel1);
            drawNode(canvas,rectModel1);
            canvas.drawLine(mViewWidth/2,mViewHeight/2,rectModel1.getCenterX(),mViewHeight/2,mLinePaint);
            canvas.rotate(mSingleChildDegreeDistance,mViewWidth/2,mViewHeight/2);
        }

        super.onDraw(canvas);
    }

    public void drawNode(Canvas canvas,RectModel rectModel){
        /*
        * 锁定画布,将画布旋转回原始坐标系
        * */
        canvas.save();
        canvas.rotate(-rectModel.getAngle(),rectModel.getCenterX(),rectModel.getCenterY());
        canvas.drawRect(rectModel.getLeft(),rectModel.getTop(),rectModel.getRight(),rectModel.getBottom(),mRectPaint);
        Paint.FontMetricsInt fontMetrics = mRectPaint.getFontMetricsInt();
        int baseline = (rectModel.getBottom() + rectModel.getTop() - fontMetrics.bottom - fontMetrics.top) / 2;
        mTextPaint.setTextAlign(Paint.Align.CENTER);
        canvas.drawText(rectModel.getText(), rectModel.getCenterX(), baseline, mTextPaint);
        /*
        * 释放画布
        * */
        canvas.restore();
    }

运行效果如下:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值