热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android开发分享荐Android思维导图布局:效果展示及使用方法

思维导图布局的前身是树形布局,对树形布局基本使用还不太了解的朋友可以先看看我写的树形布局系列教程,了解了树形布局的使用方法后再来阅读本文章。先睹为快来看看效果吧,横向效果如下:纵向

思维导图布局的前身是树形布局,对树形布局基本使用还不太了解的朋友可以先看看我写的树形布局系列教程,了解了树形布局的使用方法后再来阅读android开发分享荐 Android思维导图布局:效果展示及使用方法章。

先睹为快

来看看效果吧,横向效果如下:
荐                                                         Android思维导图布局:效果展示及使用方法
纵向效果如下:(布局可拖拽,后面会讲解)
荐                                                         Android思维导图布局:效果展示及使用方法

基本使用

为了方便讲解,下面来实现如下的效果,先写布局代码。
荐                                                         Android思维导图布局:效果展示及使用方法
注意下面的代码,MindMapLayout是思维导图布局,TreeLayout是树形布局。一定要按照如下的方式摆放,否则会报错。
左树 + 根 + 右树 或者 上树 + 根 + 下树
app:orientation决定思维导图的方向
app:mapLocked锁定思维导图,后面会讲它的作用

<com.pyjtlk.widget.MindMapLayout         android:id="@+id/mindMapLayout"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:background="#A0A0"         app:orientation="horizontal"         app:mapLocked="false">                   <com.pyjtlk.widget.TreeLayout             android:id="@+id/treeView"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             app:treeDirection="downToUp"             app:levelInterval="50dp">              <Button                 android:layout_width="80dp"                 android:layout_height="40dp"                 android:text="Node"/>              <Button                 android:layout_width="80dp"                 android:layout_height="40dp"                 android:text="Node"                 android:layout_margin="10dp"/>              <Button                 android:layout_width="80dp"                 android:layout_height="40dp"                 android:text="Node"                 android:layout_margin="10dp"/>         com.pyjtlk.widget.TreeLayout>                   <Button             android:layout_width="100dp"             android:layout_height="50dp"             android:text="ROOT"/>                           <com.pyjtlk.widget.TreeLayout             android:id="@+id/treeView2"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             app:treeDirection="upToDown"             app:levelInterval="50dp">              <Button                 android:layout_width="80dp"                 android:layout_height="40dp"                 android:text="Node"/>              <Button                 android:layout_width="80dp"                 android:layout_height="40dp"                 android:text="Node"                 android:layout_margin="10dp"/>              <Button                 android:layout_width="80dp"                 android:layout_height="40dp"                 android:text="Node"                 android:layout_margin="10dp"/>          com.pyjtlk.widget.TreeLayout>     com.pyjtlk.widget.MindMapLayout> 

接下来写java代码。

@Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          mindMapLayout = findViewById(R.id.mindMapLayout); 	 		//1         CurveDrawer documentLineDrawer = new CurveDrawer(6,Color.WHITE);         //2         RectFrameDrawer rectFrameDrawer = new RectFrameDrawer(documentLineDrawer,6,Color.WHITE);         //3         ConnectPointDrawer connectPointDrawer = new ConnectPointDrawer(rectFrameDrawer,12, Color.WHITE);         mindMapLayout.setDecorDrawer(connectPointDrawer);     } 

代码1、2、3都是装饰绘制器,思维导图布局上面的连接线、方框等装饰物都是由它们绘制出来的,后面会讲它们的使用方法。

写好了运行一下就可以了。

布局参数

思维导图布局的参数有两个。

参数 说明
app:orientation 决定思维导图的方向:horizontal(水平方向),vertical(竖直方向)
app:mapLocked 是否锁定布局,解锁状态下布局可以拖拽

常用方法

方法 说明
setDecorDrawer 设置装饰绘制器
setOrientation 设置方向
lockMap 锁定/解锁布局,解锁后布局可拖拽,子控件将无法接收滑动事件
skipDrawDecorator 跳过装饰物绘制

高级用法

1.自定义装饰物绘制器

我们可以通过继承NodeDecoratorDrawer类来实现想要的绘制效果,例如实现结点直线连接。
荐                                                         Android思维导图布局:效果展示及使用方法
直线绘制器的代码如下。

public class DirectLineDrawer extends NodeDecoratorDrawer {     protected int mLineWidth;     protected int mColor;     protected int mStartX;     protected int mStartY ;     protected int mEndX;     protected int mEndY;      public DirectLineDrawer(int lineWidth, int color){         this(null,lineWidth,color);     }      public DirectLineDrawer(NodeDecoratorDrawer sourceDecorator, int lineWidth, int color){         super(sourceDecorator);         mLineWidth = lineWidth;         mColor = color;     }      @Override     protected void onDrawDecorator(Canvas canvas, Paint paint, Rect start, Rect end, int direction) {         switch(direction){             case Direction.DIRECTION_LEFT_TO_RIGHT:                 mStartX = start.right;                 mEndX = end.left;                 mStartY = (start.top + start.bottom) / 2;                 mEndY = (end.top + end.bottom)  /2;                 break;              case Direction.DIRECTION_RIGHT_TO_LEFT:                 mStartX = start.left;                 mEndX = end.right;                 mStartY = (start.top + start.bottom) / 2;                 mEndY = (end.top + end.bottom)  /2;                 break;              case Direction.DIRECTION_UP_TO_DOWN:                 mStartX = (start.right + start.left) / 2;                 mEndX = (end.right + end.left) / 2;                 mStartY = start.bottom;                 mEndY = end.top;                 break;              case Direction.DIRECTION_DOWN_TO_UP:                 mStartX = (start.right + start.left) / 2;                 mEndX = (end.right + end.left) / 2;                 mStartY = start.top;                 mEndY = end.bottom;                 break;         }          paint.setColor(mColor);         paint.setStyle(Paint.Style.FILL);         paint.setStrokeCap(Paint.Cap.ROUND);         paint.setStrokeWidth(mLineWidth);         canvas.drawLine(mStartX,mStartY,mEndX,mEndY,paint);     }      public int getLineWidth() {         return mLineWidth;     }      public void setLineWidth(int lineWidth) {         this.mLineWidth = lineWidth;     }      public int getColor() {         return mColor;     }      public void setmColor(int color) {         mColor = color;     } } 

不仅如此,绘制器是可以功能叠加的。

//直线绘制器 DirectLineDrawer directLineDrawer = new DirectLineDrawer(6,Color.WHITE); //方框绘制器,在布局子控件外围绘制一个方框         RectFrameDrawer rectFrameDrawer = new RectFrameDrawer(directLineDrawer,6,Color.WHITE); //圆点绘制器 ConnectPointDrawer connectPointDrawer = new ConnectPointDrawer(rectFrameDrawer,12, Color.WHITE); mindMapLayout.setDecorDrawer(connectPointDrawer); 

荐                                                         Android思维导图布局:效果展示及使用方法

2.布局拖拽

在布局文件中设置app:mapLocked=“false” 或 调用lockMap(false) 方法就可以解锁布局。布局解锁后就可以拖拽了。注意,解锁后滑动事件会被思维导图布局拦截,布局上锁了子控件才能接收到滑动事件。

最后

思维导图布局的使用教程就到这里了,前面说过思维导图布局的前身是树形布局,二者的用法其实非常相似,对源码感兴趣的朋友可以到Github项目里看看,喜欢这个布局控件的话可以star一下以示鼓励。


推荐阅读
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • Python 异步编程:深入理解 asyncio 库(上)
    本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
author-avatar
ningxiao088_272
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有