零、前言

一开始也是突发奇想,感觉对安卓的绘图了解比较深了,何不画画数据结构呢

演示操作的项目文件已经在Github开源了,大家可以下载来自己玩玩,想要研究或完善都很欢迎

这个项目以及下面几篇文章是近几天的成果,相信对认识数据结构的新手应该会有很大的帮助

本系列测试了吾的能力(绘图能力,分析能力,表述能力,统筹能力)可以说对我有很多的益处

毕竟要视图呈现,关于结构的每一个细小点都不能马虎,也不再畏惧debug(反而喜欢上了)

bug是coder的家常便饭,debug便是筷子,吃完了,饭没了,人饱了,项目便完成了

复制代码

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

数组表

表结构的常规操作

数组的扩容与缩容

单链表

双链表:

队列

数组实现普通队列:

蓝色区域是数组看见:初始化四个空间,不够再扩容,空闲太多再缩容

链表实现普通队列:

二分搜索树

一、我与数据结构:

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

1---数据结构=数据+结构:

2---说到结构,我第一反应就是生物的骨架,而数据则是附着在骨架上的躯体。

3---躯体外显,骨架内隐,骨架的行为在躯体上表现。很符合数据与结构的关系。

4---简而言之,我认为结构是数据的载体,数据是结构行为的体现。

5---血肉大同小异,但骨骼千差万别,有的灵巧娇小,有的笨重硕大,但各有千秋。

2.总结与展望:我与数据结构的两次大战

第一次接触数据结构是在学编程初期,可谓完败,内心倍受摧残,从而敬而远之

第二次接触数据结构是在前几个月,原因是感觉编程的境界提升很多,数据结构这个瓶颈早晚还是要过的

便决定潜心研究两个星期,感觉还不错,可以说平分秋色,收获颇多,虽然过深的知识我也只能浅尝辄止。

这次是第三次对数据结构的大战,基于Android的View来显示数据结构,让它的神秘无所遁藏。

就我刚写完数组篇来讲,确实对我的思维和分析有很大的考验,对于层次分解也更清晰,

常量的价值、监听的使用,以及接口的鬼斧神工还有泛型的使用(泛型包泛型我也是佩服自己)都理解得更深了

复制代码

项目包的分类

总体的思路

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

既然决定对战数据结构,那擂台便必不可少,Android的View就是擂台。本篇解决擂台的问题。

本系列每种数据结构将分为两篇:数据结构篇和视图篇,如果你只偏爱其中一种,自选观看(数据结构接口与java基本保持一致)

本篇会解决数组、单链表、双链表、二叉树、红黑树的单体绘制,有什么视觉方面的想法欢迎留言。

基本样子大概就是下图了:

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

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

0.统一常量管理类

/**

* 作者:张风捷特烈

* 时间:2018/11/21 0021:14:21

* 邮箱:1981462002@qq.com

* 说明:统一常量管理类

*/

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重合了,你也可以用二次的贝塞尔曲线

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,//控制点1

Cons.BOX_WIDTH / 2, Cons.BOX_HEIGHT / 2,//控制点2

Cons.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.单链表单体的绘制:

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.双链表单体的绘制:

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.二叉树单体的绘制

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;//子圆心偏移X

int offsetY = 150;//子圆心偏移Y

canvas.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.红黑树的画法

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;//子圆心偏移X

int offsetY = 150;//子圆心偏移Y

mPaint.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.可显示出来的基类

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

/**

* 作者:张风捷特烈

* 时间:2018/11/21 0021:8:50

* 邮箱:1981462002@qq.com

* 说明:可显示出来的基本条件

*/

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.控操作接口

/**

* 作者:张风捷特烈

* 时间:2018/11/21 0021:10:17

* 邮箱:1981462002@qq.com

* 说明:控操作接口

*/

public interface OnCtrlClickListener {

void onAdd(T view);

void onRemove(T view);

void onSet(T view);

void onFind(T view);

}

复制代码

后记:捷文规范

1.本文成长记录及勘误表

2.更多关于我

笔名QQ微信爱好张风捷特烈1981462002zdl1994328语言

3.声明

1----本文由张风捷特烈原创,转载请注明

2----欢迎广大编程爱好者共同交流

3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正

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

android动态开场,看得见的数据结构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 开场动画

    呼,忙了两天了这个,找了各种资料,勉勉强强实现我的功能,这个还得改进一下,线程方面的知识没有学到多少,弄了线程画UI有着各种bug,无奈..就这样跳过先了,哪一天有时间在回来搞一下. 正文---- 要 ...

  6. android 动态申请权限_你真的了解Android权限机制吗?

    码个蛋(codeegg)第 610 次推文 作者:FeelsChaotic 原文:https://www.jianshu.com/p/a17c8bed79d9 前言 Android将安全设计贯穿系统架 ...

  7. android动态波浪效果图,【炫酷】Android 波浪式扭曲侧边栏,窗帘(Curtain Menu)效果...

    原标题:[炫酷]Android 波浪式扭曲侧边栏,窗帘(Curtain Menu)效果 来自:Android技术杂货铺(微信号:Tech-Android) 排版整编 作者:Android500 原文: ...

  8. android ,动态布局 butterknife,与Butterknife绑定在android中动态添加视图

    如何绑定布局中存在的视图,该视图使用ButterKnife动态添加到父视图中. 我有一个LinearLayout说容器.我有一个自定义布局,其中包含两个按钮,将此布局称为子视图 在活动中,我将chil ...

  9. android动态添加控件在指定位置,Android 如何动态添加 View 并显示在指定位置。

    引子 最近,在做产品的需求的时候,遇到 PM 要求在某个按钮上添加一个新手引导动画,引导用户去点击.作为 RD,我哗啦啦的就写好相关逻辑了.自测完成后,提测,PM Review 效果. 看完后,PM ...

  10. android 动态库获取路径问题,一种Android App在Native层动态加载so库的方案

    这篇文章通过实战案例,介绍了一种有条理的组织Native层代码层级结构的方法.并且,在良好的代码层级.作用分工的基础上,实现了动态的按需加载.卸载so库.文章的最后,还介绍了实践过程中遇到的困难以及对 ...

最新文章

  1. Android ShareSDK桥接技术
  2. 【TypeScript】parseInt 函数将字符串转换为整数
  3. Java对【JSON数据的解析】--官方解析法
  4. tensorflow加载训练好的模型实例
  5. 有哪些命令行工具堪称神器?
  6. node --- 使用nrm改变npm的源
  7. 关于源文件用不同的编码方式编写,会导致执行结果不一样的现象及解决方法
  8. __invoke,try{}catch(){},microtime(),is_callable()
  9. dom4j实现为list添加父节点_Heap 堆的实现
  10. java 拼音码_java代码将汉字转换成拼音
  11. 【Elasticsearch】Elasticsearch 热点线程 hot_threads
  12. Javascript实现鼠标框选元素后拖拽被框选的元素
  13. C++11 实现defer功能(转载)
  14. 内存延续分派治理方法
  15. 无刷直流电机四象限matlab pudn,一种无刷直流电机四象限PWM调制方式的分析和设计...
  16. C1. Simple Polygon Embedding(计算几何)
  17. 五年技术工作的一点点感悟
  18. 超级科技网络安全风险评估服务,全面了解网络系统面临的安全风险
  19. python高级教程_Python高级进阶教程
  20. 联想微型计算机beta2,联想的两款Detachable 2-in-1新品,可能是我未来会买的移动办公/床头娱乐本...

热门文章

  1. Java调用第三方天气预报接口示范
  2. html调用打印机,[Javascript]网页调用打印机
  3. cortana在哪里打开_Windows 10开启Cortana的方法步骤
  4. 关于Shader wants normals, but the mesh doesn't have them的问题
  5. egret的eui以及exml使用
  6. php 获取windows进程,PHP获取python进程并终止它。Xamp/Windows
  7. 8188gu驱动和su realtek_Realtek瑞昱RTL8192SU/RTL8188SU/RTL8192GU无线网卡驱动怎么样
  8. 树莓派自动饮水机编程示例
  9. openstack虚拟机热迁移优化如何治本?
  10. android 模拟器终端 了解及部分命令