零、前言

最近两个星期研究了一下Android的绘图,也可以说是自定义控件吧。
但仅是如此吗?那些都是开胃菜,吾现在要放大招了,那就是让无数新手闻风丧胆的——数!据!结!构!
没错,吾要和数据结构进行第三次大规模战斗,而这场战斗的战利品将是本篇和之后的n篇,以及我从中获得的经验与知识。
本系列为了测试吾的能力(绘图能力,分析能力,表述能力,统筹能力)以及为大家换一个角度去看待数据结构。
本系列将会成为吾编程生涯的一座里程碑个人标志。希望你可以和我在Github一同见证:DS4Android
注:本系列的[捷文规范]定位在掘金,简书同步更新

0.本系列后续更新链接合集:(动态更新)

看得见的数据结构Android版之开篇前言
看得见的数据结构Android版之数组篇(待完成)
看得见的数据结构Android版之单链表篇(待完成)
看得见的数据结构Android版之双链表篇(待完成)
看得见的数据结构Android版之二叉树篇(待完成)
看得见的数据结构Android版之二分搜索树篇(待完成)
看得见的数据结构Android版之AVL树篇(待完成)
看得见的数据结构Android版之红黑树篇(待完成)
更多数据结构---以后再说吧

1.说说我对数据结构的理解吧:

1---数据结构=数据+结构:
2---说到结构,我第一反应就是生物的骨架,而数据则是附着在骨架上的躯体。
3---躯体外显,骨架内隐,骨架的行为在躯体上表现。很符合数据与结构的关系。
4---简而言之,我认为结构是数据的载体,数据是结构行为的体现。
5---血肉大同小异,但骨骼千差万别,有的灵巧娇小,有的笨重硕大,但各有千秋。

2.总结与展望:我与数据结构的两次大战
第一次接触数据结构是在学编程初期,可谓完败,内心倍受摧残,从而敬而远之
第二次接触数据结构是在前几个月,原因是感觉编程的境界提升很多,数据结构这个瓶颈早晚还是要过的
便决定潜心研究两个星期,感觉还不错,可以说平分秋色,收获颇多,虽然过深的知识我也只能浅尝辄止。  这次是第三次对数据结构的大战,基于Android的View来显示数据结构,让它的神秘无所遁藏。
就我刚写完数组篇来讲,确实对我的思维和分析有很大的考验,对于层次分解也更清晰,
常量的价值、监听的使用,以及接口的鬼斧神工还有泛型的使用(泛型包泛型我也是佩服自己)都理解得更深了
3.总体的思路
综述.png

4.下面是数组数据结构的视图:(有没有很期待)
数组效果图.gif


一、本文是干嘛的(开场篇当然不能太low)

既然决定对战数据结构,那擂台便必不可少,Android的View就是擂台。本篇解决擂台的问题。
本篇会解决数组、单链表、双链表、二叉树、红黑树的单体绘制,有什么视觉方面的想法欢迎留言。
基本样子大概就是下图了:

数据结构视图单体.png


二、下面来绘制一下各种数据结构的单体

以下是安卓原生绘图结果,也是本篇的重点:

0.统一常量管理类
/*** 作者:张风捷特烈<br/>* 时间:2018/11/21 0021:14:21<br/>* 邮箱:1981462002@qq.com<br/>* 说明:统一常量管理类*/
public class Cons {public static final int BOX_HEIGHT = 100;//一个数组盒子的高public static final int BOX_WIDTH = 200;//一个数组盒子的宽public static final int LINK_LEN = 100;//链表长度public static final int ARROW_DX = 20;//链表箭头public static final int BOX_RADIUS = 10;//盒子圆角public static final int FONT_SIZE = 40;//数组文字字号public static final int BST_RADIUS = 50;//二叉树文字字号
}
1.数组单体的绘制

控制点1,2重合了,你也可以用二次的贝塞尔曲线

数组画法.png

private void arrayView(Canvas canvas) {//画圆角矩形没什么好说的canvas.drawRoundRect(0, 0, Cons.BOX_WIDTH, Cons.BOX_HEIGHT,Cons.BOX_RADIUS, Cons.BOX_RADIUS, mPaint);//绘制贝塞尔弧线mPath.moveTo(0, 0);mPath.rCubicTo(Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2,//控制点1Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2,//控制点2Cons.BOX_WIDTH, 0);//终点canvas.drawPath(mPath, mPathPaint);//绘制文字没什么好说的canvas.drawText("0",Cons.BOX_WIDTH / 2, 3 * 10, mDataPaint);canvas.drawText("toly",0 + Cons.BOX_WIDTH / 2, 0 + Cons.BOX_HEIGHT / 2 + 3 * 10, mDataPaint);
}

2.单链表单体的绘制:
单链表画法.png

private void singleLink(Canvas canvas) {//画圆角矩形没什么好说的canvas.drawRoundRect(0, 0, Cons.BOX_WIDTH, Cons.BOX_HEIGHT,Cons.BOX_RADIUS, Cons.BOX_RADIUS, mPaint);//画路径mPath.rCubicTo(Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2,Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2,Cons.BOX_WIDTH, 0);mPath.rLineTo(0, Cons.BOX_HEIGHT / 2f);//往下画线走半高mPath.rLineTo(Cons.LINK_LEN, 0);//往左画线走线长mPath.rLineTo(-Cons.ARROW_DX, -Cons.ARROW_DX);//画箭头canvas.drawPath(mPath, mPathPaint);//绘制文字没什么好说的canvas.drawText("0", Cons.BOX_WIDTH / 2, 3 * 10, mDataPaint);canvas.drawText("toly",0 + Cons.BOX_WIDTH / 2, 0 + Cons.BOX_HEIGHT / 2 + 3 * 10, mDataPaint);
}

3.双链表单体的绘制:
双链表画法.png

private void DoubleLink(Canvas canvas) {//画圆角矩形没什么好说的canvas.drawRoundRect(0, 0, Cons.BOX_WIDTH, Cons.BOX_HEIGHT,Cons.BOX_RADIUS, Cons.BOX_RADIUS, mPaint);//画路径mPath.rCubicTo(Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2,Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2,Cons.BOX_WIDTH, 0);mPath.lineTo(Cons.BOX_WIDTH, Cons.BOX_HEIGHT / 2.2f);mPath.rLineTo(Cons.LINK_LEN, 0);mPath.rLineTo(-Cons.ARROW_DX, -Cons.ARROW_DX);mPath.moveTo(0, 0);mPath.rLineTo(0, Cons.BOX_HEIGHT / 1.2f);mPath.rLineTo(-Cons.LINK_LEN - Cons.ARROW_DX, 0);mPath.rLineTo(Cons.ARROW_DX, Cons.ARROW_DX);canvas.drawPath(mPath, mPathPaint);//绘制文字没什么好说的canvas.drawText("0",Cons.BOX_WIDTH / 2,3 * 10, mDataPaint);canvas.drawText("toly",0 + Cons.BOX_WIDTH / 2,0 + Cons.BOX_HEIGHT / 2 + 3 * 10, mDataPaint);
}

4.二叉树单体的绘制
二叉树画法.png

private void BST(Canvas canvas) {//先画线,圆将先盖住mPath.moveTo(0 + Cons.BST_RADIUS / 2, 0 + Cons.BST_RADIUS / 2);mPath.rLineTo(150, 150);mPath.moveTo(0 - Cons.BST_RADIUS / 2, 0 + Cons.BST_RADIUS / 2);mPath.rLineTo(-150, 150);canvas.drawPath(mPath, mPathPaint);//父节点绘制canvas.drawCircle(0, 0, Cons.BST_RADIUS, mPaint);canvas.drawText("0", 0, 10, mDataPaint);//绘制子节点int offsetX = 150;//子圆心偏移Xint offsetY = 150;//子圆心偏移Ycanvas.drawCircle(0 - offsetX, 0 + offsetY, Cons.BST_RADIUS, mPaint);canvas.drawText("null", 0 - offsetX, 10 + offsetY, mDataPaint);canvas.drawCircle(offsetX, offsetY, Cons.BST_RADIUS, mPaint);canvas.drawText("null", offsetX, 10 + offsetY, mDataPaint);
}

5.红黑树的画法
红黑树树画法.png

private void bAr(Canvas canvas) {mPath.moveTo(0 + Cons.BST_RADIUS / 2, 0 + Cons.BST_RADIUS / 2);mPath.rLineTo(150, 150);mPath.moveTo(0 - Cons.BST_RADIUS / 2, 0 + Cons.BST_RADIUS / 2);mPath.rLineTo(-150, 150);canvas.drawPath(mPath, mPathPaint);mPaint.setColor(Color.BLACK);canvas.drawCircle(0, 0, Cons.BST_RADIUS, mPaint);canvas.drawText("50", 0, 10, mDataPaint);//绘制子节点int offsetX = 150;//子圆心偏移Xint offsetY = 150;//子圆心偏移YmPaint.setColor(Color.RED);canvas.drawCircle(0 - offsetX, 0 + offsetY, Cons.BST_RADIUS, mPaint);canvas.drawText("35", 0 - offsetX, 10 + offsetY, mDataPaint);mPaint.setColor(Color.BLACK);canvas.drawCircle(offsetX, offsetY, Cons.BST_RADIUS, mPaint);canvas.drawText("78", offsetX, 10 + offsetY, mDataPaint);
}

三、其他初始:
1.可显示出来的基类

所有数据结构绘制单体的父类

/*** 作者:张风捷特烈<br/>* 时间:2018/11/21 0021:8:50<br/>* 邮箱:1981462002@qq.com<br/>* 说明:可显示出来的基本条件*/
public class Viewable {public float x;//单体的x坐标public float y;//单体的y坐标public int color = 0xff43A3FA;//单体的颜色public float vX;//单体的水平速度public float vY;//单体的数值速度public Viewable() {}public Viewable(float x, float y) {this.x = x;this.y = y;}
}
2.控操作接口
/*** 作者:张风捷特烈<br/>* 时间:2018/11/21 0021:10:17<br/>* 邮箱:1981462002@qq.com<br/>* 说明:控操作接口*/
public interface OnCtrlClickListener<T> {void onAdd(T view);void onRemove(T view);void onSet(T view);void onFind(T view);
}

后记:捷文规范

1.本文成长记录及勘误表
项目源码 日期 备注
V0.1--github 2018-11-21 看得见的数据结构Android版之开篇前言
2.更多关于我
笔名 QQ 微信 爱好
张风捷特烈 1981462002 zdl1994328 语言
我的github 我的简书 我的掘金 个人网站
3.声明

1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正

4----看到这里,我在此感谢你的喜欢与支持


icon_wx_200.png

看得见的数据结构Android版之开篇前言相关推荐

  1. 看得见的数据结构Android版之数组表(数据结构篇)

    零.前言: 一讲到装东西的容器,你可能习惯于使用ArrayList和数组,你有想过ArrayList和数组的区别吗? Java的类起名字都不是随便乱起的,一般前面是辅助,后面是实质:ArrayList ...

  2. 看得见的数据结构Android版之数组表(视图篇)

    零.前言: 1.本文的姊妹篇:看得见的数据结构Android版之表的数组实现(数据结构篇) 2.希望你可以和我在Github一同见证:DS4Android的诞生与成长,欢迎star 3.激动人心的时刻 ...

  3. 看得见的数据结构Android版之表的数组实现(视图篇)

    数据结构-表.png 零.前言: 1.本文的姊妹篇:看得见的数据结构Android版之表的数组实现(数据结构篇) 2.希望你可以和我在Github一同见证:DS4Android的诞生与成长,欢迎sta ...

  4. android 获取数组大小,看得见的数据结构Android版之数组表(数据结构篇)

    零.前言: 一讲到装东西的容器,你可能习惯于使用ArrayList和数组,你有想过ArrayList和数组的区别吗? Java的类起名字都不是随便乱起的,一般前面是辅助,后面是实质:ArrayList ...

  5. Android版数据结构与算法汇总十二章

    Android版数据结构与算法(一):基础简介 https://www.cnblogs.com/leipDao/p/9140726.html Android版数据结构与算法(二):基于数组的实现Arr ...

  6. 还是俄罗斯方块之android版

    前面的,口水话 请直接跳过. 虽然现在不比以前了 也没多少人气了,放到首页 都不到几百的点击量.也许博客园整体水平也是在往水的方向发展.不谈那些了,哥也曾经辉煌过 有过一天上千的点击量 ,哥也曾经有过 ...

  7. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

  8. android QQ动态tab,变化忒大了!Android版手机QQ 5.0体验

    变化忒大了!Android版手机QQ 5.0体验 出处:快科技 2014-07-28 12:02:56     作者:随心 编辑:随心[爆料] 收藏文章 内容导航: 第[01]页:[Android版手 ...

  9. 移动端IM实践:实现Android版微信的智能心跳机制

    本文由微信开发团队人员编写,转自 WeMobileDev,感谢. 一 引言 在2013年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援. 刚到广州的时候,Ray让我和春哥对Li ...

  10. 华清远见专家解读Android开发者的前景

    小编有话说: 日前,华清远见专家就Android开发者的成长之路进行分析,专家表示Android是一个比较庞大的体系,从底层的Linux内核到上层的应用层,各部分的内容跨度也比较大.因此,一个好的学习 ...

最新文章

  1. 为什么说Transformer就是图神经网络?
  2. Python趣味编程小技巧,图片转炫酷字符画,一看就是高手
  3. ora-14400插入的分区关键字未映射到任何分区---oracle数据库表过期问题
  4. 中石油训练赛 - Block(二维前缀和+思维)
  5. 2017面试分享(js面试题记录)
  6. 软件构造学习笔记-第十三周
  7. pil显示图片_Python之PIL模块使用
  8. oracle中插入图片,在Oracle数据库的表中插入图片的方法
  9. 安装好数据库 提示计算机无法启动,DBC数据库异常无法启动!!!HERODB配置错误怎么解决呢?...
  10. c语言股票最大收益_C语言买卖股票问题
  11. 生成扩散模型漫谈:DDPM = 自回归式VAE
  12. Java求树的深度(真的是树,而不是二叉树)#全网首发#
  13. android自动调节背光,android自动调节背光
  14. Xlookup、Vlookup请走开,万能的Wlookup函数来了!
  15. 快递鸟预约快递员上门揽件API开发指南
  16. 手表无线充电控制芯片方案的原理分析主控SOP8外置挂个AO3400或SI2302
  17. oracle12c生命周期,Oracle 12c 新特性之: ILM 数据生命周期管理
  18. 【每日一读】High-order Proximity Preserving Information Network Hashing
  19. 什么是放射性活度,半衰期,照射量和吸收剂量?
  20. FMEA学习(1总概)

热门文章

  1. 百度ai平台接口使用记录
  2. cc2538 BSL下载固件
  3. JTAG、SBW、BSL 三种接口的区别
  4. uint64_t {aka long unsigned int}
  5. Snowy Smile (HDU - 6638,稀疏矩阵子矩阵最大和)
  6. 基本概念学习(7002)---网络流量控制
  7. Excel公式大全Excel公式大全-入门
  8. Excel批量核实输入的银行卡号信息是否正确!
  9. BAT大牛带你深度剖析Android10大开源框架
  10. 【刷题篇】鹅厂文化衫问题