仿掌上英雄联盟能力值图形绘制

一,前沿

相信玩撸啊撸的撸友们一定记得掌上英雄联盟App的能力值吧~~ 好吧,不记得没关系我来给大家上张图!!

所以今天呢我就抽空模仿了一下:

照例线来张GIF,有图有真相

下面是我的微博账号希望可以关注哈:

Email:[email protected]

Github: https://github.com/icuihai.

weibo:http://weibo.com/icuihai

二.言归正传

在平常做项目的时候自定义控件用的还是蛮多的,使用别人造好的轮子比较节省时间,但是作为了一个优雅的程序员

肯定得学会造轮子给别人用啦,俗话说不装逼那跟咸鱼有什么区别~~,这边文章呢不是轮子,只是一个小小的自定义view,用到了一些比较基础的知识,希望对初学者有帮助,也希望大牛能够发现错误以便及时纠正或者提出更好的idear.

我们从GIF图可以看出基本上就是在瞄点和画线,所以说要想做个合格的程序员,数学的基本功要够扎实~~

1,我们这个用的是正七边形,所以说我们分析首先画一根线,然后让其旋转可以得到七条,效果如下

我去,好丑。。。

其中调用两个主要的api就是

canvas.drawLine
canvas.rotate

画完线之后呢,我们再把外圈连在一起组成一个封闭的图形

之后呢我们在画内多变形,在此Demo中我们为了省时间只画了一个1/2内多边形,

最后我们在根据SeekBar传过来的值在边线成瞄点连线;

废话不多说,直接上代码:

2,MyView

public class MyView extends View{
    private int startX=720,startY=200;//起始点
    private int centerX=720,centerY=600;//圆心
    private int r=centerY-startY;//半径
    private String[]str= {"击杀","生存","助攻","物理","魔法","防御","金钱"};
    private int dimension;//文字大小
    private float xA,xB,xC,xD,xE,xF,xG;//x轴坐标
    private float yA,yB,yC,yD,yE,yF,yG;//y轴坐标
    private static final int TEXTSIZE=20;
    private float y1,y2,y3,y4,y5,y6,y7,x1,x2,x3,x4,x5,x6,x7;//能力值坐标
    private float pre1=0.2f,pre2=0.2f,pre3=0.2f,pre4=0.2f,pre5=0.2f,pre6=0.2f,pre7=0.2f;//百分率

    public MyView(Context context) {
        this(context,null);
    }

    public MyView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView();
        TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.textSize);
        dimension = (int) typedArray.getDimension(R.styleable.textSize_textsize, TEXTSIZE);
        typedArray.recycle();
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
    private void initView(){
        initData();
    }

上面这些呢主要是构造方法,和一些常量,圆心坐标呢我并没有对屏幕做适配,而是根据我的模拟器选择的一个大概的值,大家如果想做的话直接调用WindowManger窗口管理器,或者重写onMeasure()方法都可以得到view的宽度去做调整,

3,瞄点

private void initData() {
        //首先A点坐标(其实用不到)
        xA=startX;
        yA=startY;
        //先求出B点的坐标
        xB= (float) (centerX+Math.sin(Math.toRadians(360/7))*r);
        yB= (float) (centerY-Math.cos(Math.toRadians(360/7))*r);
        //在求出C点坐标
        xC= (float) (startX+Math.sin(Math.toRadians(360/7*1.5))*r);
        yC= (float) (centerY+Math.cos(Math.toRadians(360/7*1.5))*r);
        //Log.i("TAG",""+xC+"---"+yC);
        //在求出D点坐标
        xD= (float) (startX+Math.sin(Math.toRadians(360/7/2))*r);
        yD= (float) (centerY+Math.cos(Math.toRadians(360/7/2))*r);
        //于D点水平对称的E点坐标
        xE=(float) (centerX-Math.sin(Math.toRadians(360/7/2))*r);
        yE= (float) (centerY+Math.cos(Math.toRadians(360/7/2))*r);
        //与C点水平对称点的坐标F
        xF= (float) (centerX-Math.sin(Math.toRadians(360/7*1.5))*r);
        yF= (float) (centerY+Math.cos(Math.toRadians(360/7*1.5))*r);
        //与B点水平对称点的坐标G
        xG= (float) (centerX-Math.sin(Math.toRadians(360/7))*r);
        yG= (float) (centerY-Math.cos(Math.toRadians(360/7))*r);
    }

我们这次瞄点是根据角度进行绘制的,应该还有其他方法,PathMeasure这个类应该有api可以绘制,感兴趣的同学可以去研究下,上面的A点呢就是最上面的那个点,然后呢顺时针以此往下,

4,连线(外多边形)

 @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        Paint paint=new Paint();
        paint.setColor(Color.GREEN);
        paint.setStrokeWidth(2);
        for (int i = 0; i < 7; i++) {
            canvas.drawLine(startX,startY,centerX,centerY,paint);
            canvas.rotate((float) 360/7,centerX,centerY);
        }
        canvas.restore();
        //画AB之间的直线
        canvas.drawLine(startX,startY,xB,yB,paint);
        //画BC之间的直线
        canvas.drawLine(xB,yB,xC,yC,paint);
        //画BD之间的直线
        canvas.drawLine(xC,yC,xD,yD,paint);
        //画DE之间的直线
        canvas.drawLine(xD,yD,xE,yE,paint);
        //画EF之间的直线
        canvas.drawLine(xE,yE,xF,yF,paint);
        //画FG之间的直线
        canvas.drawLine(xF,yF,xG,yG,paint);
        //画FA之间的直线
        canvas.drawLine(xG,yG,startX,startY,paint);

点已经喵好了接下来肯定就是把这些点连载一起喽,代码注释的很清楚对吧~~注意上面这些是最最外面的多边形

5,连线(画内多边形)

//画内多变形
        canvas.drawLine(startX,centerY-r/2,(xB+startX)/2,yB+(centerY-yB)/2,paint);
        canvas.drawLine((xB+startX)/2,yB+(centerY-yB)/2,(startX+xC)/2,(centerY+yC)/2,paint);
        canvas.drawLine((startX+xC)/2,(centerY+yC)/2,(startX+xD)/2,(centerY+yD)/2,paint);
        canvas.drawLine((startX+xD)/2,(centerY+yD)/2,(startX+xE)/2,(centerY+yE)/2,paint);
        canvas.drawLine((startX+xE)/2,(centerY+yE)/2,(startX+xF)/2,(centerY+yF)/2,paint);
        canvas.drawLine((startX+xF)/2,(centerY+yF)/2,(startX+xG)/2,(centerY+yG)/2,paint);
        canvas.drawLine((startX+xG)/2,(centerY+yG)/2,startX,centerY-r/2,paint);
        canvas.drawLine((startX+xG)/2,(centerY+yG)/2,startX,centerY-r/2,paint);

6,动态的绘制图形

//顺时针依次
        x1=startX;
        y1= (centerY-(pre1*r));

        x2= (float) (startX+Math.sin(Math.toRadians(360/7))*pre2*r);
        y2= (float) (centerY-Math.cos(Math.toRadians(360/7))*pre2*r);

        x3= (float) (startX+Math.sin(Math.toRadians(180-360/7*2))*pre3*r);
        y3= (float) (centerY+Math.cos(Math.toRadians(180-360/7*2))*pre3*r);

        x4= (float) (startX+Math.sin(Math.toRadians(180-360/7*3))*r*pre4);
        y4= (float) (centerY+Math.cos(Math.toRadians(180-360/7*3))*r*pre4);

        x5= (float) (centerX-Math.sin(Math.toRadians(180-360/7*3))*r*pre5);
        y5= (float) (centerY+Math.cos(Math.toRadians(180-360/7*3))*r*pre5);

        x6= (float) (centerX-Math.sin(Math.toRadians(180-360/7*2))*r*pre6);
        y6= (float) (centerY+Math.cos(Math.toRadians(180-360/7*2))*r*pre6);

        x7= (float) (centerX-Math.sin(Math.toRadians(360/7))*r*pre7);
        y7= (float) (centerY-Math.sin(Math.toRadians(90-360/7))*r*pre7);

        mPath.moveTo(x7,y7);//把起点设置为7点可以使图形封闭
        mPath.lineTo(x1,y1);
        mPath.lineTo(x2,y2);
        mPath.lineTo(x3,y3);
        mPath.lineTo(x4,y4);
        mPath.lineTo(x5,y5);
        mPath.lineTo(x6,y6);
        mPath.lineTo(x7,y7);

        // 绘制路径
        canvas.drawPath(mPath, mPaint);
        //mPath.close(); //封闭曲线
        invalidate();

pre代表SeekBar滑动的值/最大值,因为我用了mPath.moveTo(x7,y7);所以不需要在调用mPath.close()了,它是可以是线条首尾连在一起组成一个封闭的图形,注意上面这些都要用float值,因为这些角度大部分都是float值,如果用int的话会让图片看起来有一定的偏差,我也截了一张错误的图大家仔细看一下是有区别的:

好了基本上就这些了,其他的代码我就不贴出来了,不然看起来太长了,完整的代码我会放在github上,https://github.com/icuihai/LolCustomView ,喜欢的可以给个star,感谢

时间: 2024-10-24 12:57:00

仿掌上英雄联盟能力值图形绘制的相关文章

利用Python爬取OPGG上英雄联盟英雄胜率及选取率信息

一.分析网站内容 本次爬取网站为opgg,网址为:” http://www.op.gg/champion/statistics” ? 由网站界面可以看出,右侧有英雄的详细信息,以Garen为例,胜率为53.84%,选取率为16.99%,常用位置为上单 现对网页源代码进行分析(右键鼠标在菜单中即可找到查看网页源代码).通过查找“53.84%”快速定位Garen所在位置 由代码可看出,英雄名.胜率及选取率都在td标签中,而每一个英雄信息在一个tr标签中,td父标签为tr标签,tr父标签为tbody标

Android中GPU硬件加速控制及其在2D图形绘制上的局限

图形的渲染可分为两种:软件渲染和硬件渲染.软件渲染是靠CPU计算各种坐标并绘制,主要是占用内存:硬件渲染是靠GPU,主要占用显存,一般的3D图形程序(OpenGL.DirectX)都是GPU加速的. 在Android3.0之前,2D绘图API只支持软件渲染模式,从Android3.0开始,2D绘图API开始支持GPU硬件渲染,即View中的Canvas的绘图操作会使用GPU,所以从Android 3.0(API Level 11)开始,View中就多了一些和硬件相关的方法.如果App的Andro

猫猫学IOS(十二)UI之UITableView学习(上)LOL英雄联盟练习

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44706671 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 源代码 NYViewController的代码 //ps:新建iOS交流学习群:304570962 可以加猫猫QQ:1764541256 或则微信znycat 让我们一起努力学习吧. 原文:http://blog.csdn.net

【Windows编程】系列第五篇:GDI图形绘制

上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数百个API可供我们使用,本篇把最常用的GDI绘图做一个讲解.GDI可以绘制点.直线曲线.填充封闭区域.位图以及文本,其中文本部分已经在上一篇中将了,请参考[Windows编程]系列第三篇:文本字符输出. 跟前面的GDI对象一样,本篇的这些绘图函数也必须要设备上下文句柄(HDC)作为函数参数,从前文我

腾讯勇夺全球游戏霸主地位,“英雄联盟”成基石

作者:楠沨 [IT战略家] <英雄联盟>世界总决赛于十月落下帷幕,成千上万粉丝观看了S6系列职业联赛,但鲜少有人知道的是,这是一个中国公司全球统治战略的一部分.(注:英雄联盟为当下最为火热的电子竞技类游戏.) 并购之路 & 合作伙伴自主性战略 腾讯作为亚洲最具价值的科技公司,目前市值高达2490亿美元,已经成为全球最大的游戏发行商,收入超过美国知名游戏公司艺电和暴雪.腾讯主导着中国的游戏市场,并不断通过与外国公司建立战略联盟走上全球扩张之路. 腾讯也在尝试出口自己的游戏,但它在全球取得

【个人计划】告别英雄联盟,开始学习Python

不知不觉中接触英雄联盟已经快两年了,记得是大四那年找完工作,一下比较清闲,宿舍刚好有lol的氛围,于是乎,四个新手在何大神的带领下,走上了lol的道路.不得不说,从那以后,花费在lol上的时间太多啦,据我估计,个人玩了将近2000了吧,别看局数这么多,其实就是个渣渣,技术太菜了,这也就是我告别英雄联盟的原因啦,根本没有玩这个游戏的天赋,技术上没有一点点提高,一直就是在浪费时间罢了. 就我个人而言,1.在补兵方面,时好时坏,而且有时候性子急,不太注重前期的补兵发育,往往导致输的结局:2.游戏中大部

CSS各种图形绘制

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>绘图</title> <style type="text/css"> div{ background:black; } /*绘正方形*/ .square{ width:100px; height:100px; } /*绘长方形*/ .retangle{ width:

JAVA学习之JAVA 2D图形绘制

最近一直没有空写博客,事情比较多,静不下心,事情顺其自然好了,有些事我也不懂为什么会变成现在这样,你以为你付出了你最珍贵的,但或许别人并不喜欢.算了,不多想,顺其自然好了. JAVA在图形绘制方面效率跟不上C++,但是我觉得JAVA也有其在图形方面的一些优势,不过对于大型桌面游戏就不行了,估计连流畅度都不能保证. 下面给出最近写的代码: package draw; import java.awt.*; import javax.swing.*; import java.awt.geom.*; p

Quartz2D--iOS下的图形绘制

一.基本介绍 Quartz 2D是一个二维绘图引擎,Quartz 2D的API是C语言,来自CoreGraphics框架,没有面向对象的思想. 1.作用:绘制图形:线条.三角形.矩形.圆.弧等 绘制文字 绘制.生成图片(图形) 读取.生成PDF 截图.裁剪图片 自定义UI控件 2.图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:1.保存绘图信息.绘图状态 2.决定绘制的输出目标(绘制到什么地方,输出目标可以是PDF文件.Bitmap或者