大家好,最近贵公司招兵买马,求能人异士一起写代码,有简历就投递到我的邮箱 atmanpro@163.com ,我的美女大连秘书会联系您预约面试喔!
招聘要求:
本科以上,三年工作,热爱代码,想做点东西的人
加入我们的好处:
优秀的开发者一起,相互提高,相互切磋。薪酬可观。

之前写的不好,从新写了一下。

最近,小弟在实现一个思维导图的开源控件。下面我简单介绍一下如下打造一个类似思维导图软件的ViewGroup。

建立模型

主要模型结构相对简单:TreeModel,NoteModel,NoteView,TreeView。

核心实现分布如下:

  • TreeModel:树形结构的存储,树形结构的遍历,添加、删除节点;
  • NoteModel:节点关联的指向,和Parent的指向;
  • TreeView :绘制树形结构,对树形结构位置的纠正,实现View层的添加,删除,note关联绘制;
  • NoteView:显示text;

编写位置计算核心代码

在核心代码中,我想和大家分享的是TreeView如何对多种Style(树形形状)进行适配的问题。因为我们的树形结构的表达多种的,有的是一个半树形图,有点是圆形展开的等。对于这个问题,作为程序员如何进行解耦能,采用Interface进行解构适配,统一行为。所以在这里我写了一个TreeLayoutManager进行管理树形的位置表达。这里我实现了一个RightTreeLayoutManager。代码概况如下:

接口

public interface TreeLayoutManager {/*** 进行树形结构的位置计算*/void onTreeLayout(TreeView treeView);/*** 位置分布好后的回调,用于确认ViewGroup的大小*/ViewBox onTreeLayoutCallBack();/*** 修正位置** @param treeView* @param next*/void correctLayout(TreeView treeView, NodeView next);}

实现


public class RightTreeLayoutManager implements TreeLayoutManager{final int msg_standard_layout = 1;final int msg_correct_layout = 2;final int msg_box_call_back = 3;private ViewBox mViewBox;private int mDy;private int mDx;private int mHeight;public RightTreeLayoutManager(int dx, int dy, int height) {mViewBox = new ViewBox();this.mDx = dx;this.mDy = dy;this.mHeight = height;}@Overridepublic void onTreeLayout(final TreeView treeView) {final TreeModel<String> mTreeModel = treeView.getTreeModel();if (mTreeModel != null) {View rootView = treeView.findNodeViewFromNodeModel(mTreeModel.getRootNode());if (rootView != null) {rootTreeViewLayout((NodeView) rootView);}mTreeModel.addForTreeItem(new ForTreeItem<NodeModel<String>>() {@Overridepublic void next(int msg, NodeModel<String> next) {doNext(msg, next, treeView);}});//基本布局mTreeModel.ergodicTreeInWith(msg_standard_layout);//纠正mTreeModel.ergodicTreeInWith(msg_correct_layout);mViewBox.clear();mTreeModel.ergodicTreeInDeep(msg_box_call_back);}}@Overridepublic ViewBox onTreeLayoutCallBack() {if (mViewBox != null) {return mViewBox;} else {return null;}}/*** 布局纠正** @param treeView* @param next*/public void correctLayout(TreeView treeView, NodeView next) {//主要是纠正对于标准布局出现的错误,譬如,在图片纠正中的那种情况//纠正需要对同层的Note进行拉伸}/*** 标准分布** @param treeView* @param rootView*/private void standardLayout(TreeView treeView, NodeView rootView) {//标准分布主要是在基于root节点进行排开//对于奇数和偶数不同的情况进行排开//中间向外计算位置}/*** 移动** @param rootView* @param dy*/private void moveNodeLayout(TreeView superTreeView, NodeView rootView, int dy) {//如果一个note节点进行了移动,那么它//会影响到它的子节点的位置。//所以要进行重新计算,把它的所有的Note位置进行位移        }/*** root节点的定位** @param rootView*/private void rootTreeViewLayout(NodeView rootView) {int lr = mDy;int tr = mHeight / 2 - rootView.getMeasuredHeight() / 2;int rr = lr + rootView.getMeasuredWidth();int br = tr + rootView.getMeasuredHeight();rootView.layout(lr, tr, rr, br);}
}

View的连线

要实现对View和View的连线,只要在View的位置定了之后,就进行画线即可。用Sketch画个演示如下:

其中线为一个贝塞尔曲线。代码如下:

    @Overrideprotected void dispatchDraw(Canvas canvas) {if (mTreeModel != null) {drawTreeLine(canvas, mTreeModel.getRootNode());}super.dispatchDraw(canvas);}/*** 绘制树形的连线** @param canvas* @param root*/private void drawTreeLine(Canvas canvas, NodeModel<String> root) {NodeView fatherView = (NodeView) findNodeViewFromNodeModel(root);if (fatherView != null) {LinkedList<NodeModel<String>> childNodes = root.getChildNodes();for (NodeModel<String> node : childNodes) {//连线drawLineToView(canvas, fatherView, findNodeViewFromNodeModel(node));//递归drawTreeLine(canvas, node);}}}/*** 绘制两个View直接的连线** @param canvas* @param from* @param to*/private void drawLineToView(Canvas canvas, View from, View to) {if (to.getVisibility() == GONE) {return;}Paint paint = new Paint();paint.setAntiAlias(true);paint.setStyle(Paint.Style.STROKE);float width = 2f;paint.setStrokeWidth(dp2px(mContext, width));paint.setColor(mContext.getResources().getColor(R.color.chelsea_cucumber));int top = from.getTop();int formY = top + from.getMeasuredHeight() / 2;int formX = from.getRight();int top1 = to.getTop();int toY = top1 + to.getMeasuredHeight() / 2;int toX = to.getLeft();Path path = new Path();path.moveTo(formX, formY);path.quadTo(toX - dp2px(mContext, 15), toY, toX, toY);canvas.drawPath(path, paint);}

位置的纠正流程

位置纠正的问题;在对于我之前的位置的算法探索流程如下图,关键是写好已知的代码,之后纠正

最后

记得在GitHub上给我一个星吧。https://github.com/owant/ThinkMap
百度应用市场:http://shouji.baidu.com/software/11238419.html

树形控件之思维导图 Android相关推荐

  1. Android实现无序树形结构图,类似思维导图和级联分层图(无序,随机位置)

    参考文章: 利用递归算法.堆栈打造一个android可擦除思维导图 用SurfaceView实现级联分层图(粗略篇) 效果图打头阵: 这些和亲戚关系图谱,或者思维导图类似,最近公司的医疗项目也用到了这 ...

  2. Android课程思维导图,Android实现思维导图

    最近,小弟在实现一个思维导图的开源控件.下面我简单介绍一下如下打造一个类似思维导图软件的ViewGroup. 基本结构.png 建立模型 主要模型结构相对简单:TreeModel,NoteModel, ...

  3. Mindjet MindManager思维导图使用技巧

    作者:pengxl 出处:慧都控件网 思维导图的4个要素: 1.节点--表示概念,是指感知到的同类事物的共同属性. 2.命题--两个概念之间通过某个连接词而形成的意义关系. 3.连线--连线表示两个概 ...

  4. 一篇文章一张思维导图看懂Android学习最佳路线

    一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...

  5. android搜索框布局文件,android搜索框列表布局,流程及主要步骤思维导图

    android搜索框列表布局,流程及主要步骤思维导图 android搜索框列表布局,流程及主要步骤思维导图 activity_coin_search.xml ---------- android:id ...

  6. 【转】C#各类控件的输入输出(思维导图、知识点分析、案例解析)

    第六周学习笔记-C#各类控件的输入输出 1.思维导图 知识点汇总: 着重介绍几个常用控件: 数据显示控件 DataGridView控件 列设置 a).列的宽度铺满这个控件 设置如下:把AutoSize ...

  7. asp.net 两个控件放一行_思维导图?试试这两个宝藏网站吧

    #文章首发于公众号"如风起". 原文链接: 思维导图试试这两个网站吧​mp.weixin.qq.com Hello~,大家好,今天小编向大家介绍两款关于绘制思维导图的软件. 在日常 ...

  8. android思维导图github,2020年GitHub 上那些优秀Android开源库,这里是Top10!

    前言 每过一段时间呀,我都会给大家带来一些从Github上收集的一些开源库,有的是炫酷动效,有的则是实用的工具和类库.以前没看过或者没有收藏的同学,建议先收藏,以下是链接: No1. LiquidSw ...

  9. Android 进阶路线(思维导图),Android开发实用必备的几款插件

    今年的Google IO 大会上,Google 宣布Kotlin 成为Android 的官方语言,Kotlin 终于被扶正.Kotlin 顿时火遍了各个技术社区和网站,掀起了一股学习Kotlin 的热 ...

  10. Android复习13【广播:思维导图、音乐播放器】

    音乐播放器Android代码下载:https://wws.lanzous.com/ifqzihaxvij 思维导图 https://share.weiyun.com/1vVLYnlb 音乐播放器

最新文章

  1. hangfire 过期记录_时隔数月后我又有减肥的想法(饮食日记录)
  2. wiredtiger存储引擎介绍——本质就是LSM,当然里面也可以包含btree和列存储
  3. OVS sflow(二十六)
  4. mysql 远程登录权限
  5. 从方法到实践!深度解读:企业数据治理到底治什么?怎么治?
  6. 利用反射获得委托和事件以及创建委托实例和添加事件处理程序
  7. C语言指定初始化器解析及其应用
  8. linux下查看usb插拔日志,Linux:如何检测usb键盘是否已插入和拔出
  9. 从新获取jar_SpringBoot配置文件放在jar外部
  10. Excel 如何锁定表头
  11. 常见视频分辨率及码率
  12. python图像拉伸_python处理图像
  13. PHPExcel浏览器输出Excel2007出错
  14. 诗词温习集:跟梁瀚文一起重温诗词(宋词)之《雨霖铃.寒蝉凄切》宋.柳永
  15. 微信小助手:专为mac微信3.1.0发行!支持发朋友圈!支持僵尸粉清理
  16. Up in the Air-19
  17. 【GDAL基础教程】多张二维tif数据转三维tif数据
  18. matlab绘制站点分布图
  19. P8339-[AHOI2022]钥匙【虚树,扫描线】
  20. Verilog HDL语言要素

热门文章

  1. 浪涌保护器ant120_菲尼克斯浪涌保护器
  2. http-server 简介
  3. VsCode——创建Vue 模板
  4. 苹果手机连接电脑服务器传文件,实用!三种iPhone与Windows电脑互传文件操作技巧,...
  5. 视觉检测售价_视觉自动化检测设备多少钱一台,它是如何报价的?
  6. 开源dns软件PowerDNS BIND9 mydns
  7. 如何把电视盒子做成游戏机? —— 破解电视IPTV盒子(Skyworth E900-S)
  8. Mac macOS HP打印机添加教程驱动软件下载
  9. 【信号与系统】(十三)傅里叶变换与频域分析——周期信号的傅里叶级数
  10. 数据结构 将两个有序的链表合并为一个新链表