美文网首页程序猿学习view酷炫的UI效果
自定义View 模仿掌盟能力值分析效果

自定义View 模仿掌盟能力值分析效果

作者: 江城北望 | 来源:发表于2016-09-27 15:54 被阅读487次

    原始图效果


    模仿效果


    PNG

    GIF

    流程


    1.绘制中心线,用于计算外层多边形各点的坐标

    2.绘制最外层多边形

    3.分析原型图算出每个多边形之间的间距

    4.绘制里三层多边形

    5.绘制字体

    6.根据进度值绘制等级进度

    难点

    关键在于坐标的计算,与旋转角度的掌控。

    一 测量


    初始化

    privatePaintcenter_paint;//中心线画笔

    private intcenter;//中心点

    private floatone_radius;//外层菱形圆半径

    private intdefalutSize=300;//默认大小

    //初始化中心线画笔

    center_paint=newPaint();

    center_paint.setAntiAlias(true);

    center_paint.setColor(Color.WHITE);

    测量

    @Override

    protected voidonMeasure(intwidthMeasureSpec, intheightMeasureSpec) {

    super.onMeasure(widthMeasureSpec,heightMeasureSpec);

    intwMode = MeasureSpec.getMode(widthMeasureSpec);

    intwSize = MeasureSpec.getSize(widthMeasureSpec);

    inthMode = MeasureSpec.getMode(heightMeasureSpec);

    inthSize = MeasureSpec.getSize(heightMeasureSpec);

    intwidth,height;

    if(wMode == MeasureSpec.EXACTLY) {

    width = wSize;

    }else{

    width = Math.min(wSize,defalutSize);

    }

    if(hMode == MeasureSpec.EXACTLY) {

    height = hSize;

    }else{

    height = Math.min(hSize,defalutSize);

    }

    center= width /2;//中心点

    one_radius=center- getPaddingTop() -2*str_rect.height();

    setMeasuredDimension(width,height);

    }

    这里在计算最外层多边形外切圆半径的时候留出了2个字体高度距离,给多边形外字体的绘制留出空间。


    二 绘制中心线


    /**

    * 绘制中心线

    *

    *@paramcanvas

    */

    private voidcenter(Canvas canvas) {

    //绘制七边形中心线

    canvas.save();//保存当前状态

    canvas.rotate(0,center,center);

    floatstartY = getPaddingTop() +2*str_rect.height();

    floatendY =center;

    floatdu = (float) (360/7+0.5);

    for(inti =0;i <7;i++) {

    canvas.drawLine(center,startY,center,endY,center_paint);

    canvas.rotate(du,center,center);

    }

    canvas.restore();//恢复之前状态

    }

    先计算出圆心到A点的坐标,

    在计算出旋转的角度(360/7),

    然后旋转7次Canvas,绘制7条中心线。

    为了加深显示效果,先绘制一个绿色背景作参考。

    三 绘制最外层正七边形


    各坐标点的计算主要用到了三角函数。

    A点

    x  对应这圆心center。

    y  paddingTop+2个字体高度的距离

    B点

    x  A点的x坐标+EB

    利用三角函数公式,BE=sin(AB的夹角)*OB

    这里有个坑,Math.sin(x)里的x是弧度,而不是角度。

    如果要计算角度则需要加上Math.sin(Math.toRadians(x))

    center+ Math.sin(Math.toRadians(360/7)) *one_radius

    y A点的y坐标+AE

    同理AE=OA-OE,OE=cos(AB的夹角)*OB

    OE=cos(AB的夹角)*OB

    Math.abs(Math.cos(Math.toRadians(360/7)) *one_radius

    由于余弦有正负值,这里要取绝对值

    AE=OA-OE

    (getPaddingTop() +2*str_rect.height() +one_radius

    - Math.abs(Math.cos(Math.toRadians(360/7)) *one_radius))

    C点

    x  :圆心X+FC

    Math.sin(Math.toRadians(360/7+360/7/2)) *one_radius

    y: 圆心Y+OF

    (Math.cos(Math.toRadians(360/7+360/7/2)) *one_radius) +center

    D点

    x  :圆心x+HD

    center+ Math.sin(Math.toRadians(360/7/2)) *one_radius

    y:圆心y+OH

    Math.cos(Math.toRadians(360/7/2)) *one_radius) +center

    右边点绘制完后,左边点就出来了,只需要把加号改成减号。

    截屏显示效果有多点差- -

    �四 绘制内三层正七边形


    privatePainttwo_paint;//第二层多边形画笔

    privatePaintthree_paint;//第三层多边形画笔

    privatePaintfour_paint;//第四层多边形画笔

    绘制完最外层七边形后,剩下来的就好办了,只需要计算出每个七边形的间距即可。

    由原型图分析,每一个正七边形占半径的四分之一

    private floatdistance;//多边形之间的间距

    distance=one_radius/4;

    去掉绿色背景后,显示的效果

    五 绘制字体


    根据最外层多边形各点坐标以及字体的长度高度 微调。

    privateRectstr_rect;//字体矩形

    String[]str= {"击杀","生存","助攻","物理","魔法","防御","金钱"};

    效果

    6绘制各能力值进度

    floatf1,f2,f3,f4,f5,f6,f7;

    privatePaintmPaint;//各等级进度画笔

    根据f1~f7的值,来控制各点的y轴坐标即可。

    感兴趣的同学可直接到github下载源码。

    https://github.com/jiangzehui/polygonsview

    相关文章

      网友评论

      本文标题:自定义View 模仿掌盟能力值分析效果

      本文链接:https://www.haomeiwen.com/subject/tanqsttx.html