You can easily draw mind maps. It allows for node creation, deletion, as well as zooming and moving.
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.hegleB:MindMapView:0.1.0'
}
- zoom, move
- Fix your window
- remove nodes
- add nodes
- edit node text
Add | Remove | Edit | Move | Zoom and Fit Window |
---|---|---|---|---|
- Add the MindMapView to your XML layout
<com.mindsync.library.MindMapView
android:id="@+id/mind_map_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
- Define Node Classes
sealed class Node(
open val id: String,
open val parentId: String?,
open val path: NodePath,
open val description: String,
open val children: List<String>,
) {
abstract fun adjustPosition(
horizontalSpacing: Dp,
totalHeight: Dp,
): Node
}
data class CircleNode(
override val id: String,
override val parentId: String?,
override val path: CirclePath = CirclePath(Dp(0f), Dp(0f), Dp(0f)),
override val description: String,
override val children: List<String>,
) : Node(id, parentId, path, description, children) {
override fun adjustPosition(
horizontalSpacing: Dp,
totalHeight: Dp,
): Node {
return this.copy(path = path.adjustPath(horizontalSpacing, totalHeight))
}
}
data class RectangleNode(
override val id: String,
override val parentId: String,
override val path: RectanglePath = RectanglePath(Dp(0f), Dp(0f), Dp(0f), Dp(0f)),
override val description: String,
override val children: List<String>,
) : Node(id, parentId, path, description, children) {
override fun adjustPosition(
horizontalSpacing: Dp,
totalHeight: Dp,
): Node {
return this.copy(path = path.adjustPath(horizontalSpacing, totalHeight))
}
}
- Initialize the Mind Map View
val tree = Tree<Node>(this)
binding.mindMapView.setTree(tree)
binding.mindMapView.initialize()
- Implement Node Click Listener
binding.mindMapView.setNodeClickListener(object : NodeClickListener {
override fun onClickListener(node: NodeData<*>?) {
val selectedNode = createNode(node)
...
}
})
- Create Nodes Based on User Interaction
fun createNode(node: NodeData<*>?): Node? {
return when (node) {
is CircleNodeData -> CircleNode(
node.id,
node.parentId,
CirclePath(
Dp(node.path.centerX.dpVal),
Dp(node.path.centerY.dpVal),
Dp(node.path.radius.dpVal)
),
node.description,
node.children
)
is RectangleNodeData -> RectangleNode(
node.id,
node.parentId,
RectanglePath(
Dp(node.path.centerX.dpVal),
Dp(node.path.centerY.dpVal),
Dp(node.path.width.dpVal),
Dp(node.path.height.dpVal)
),
node.description,
node.children
)
else -> null
}
}
- Additional View Manipulations
binding.mindMapView.addNode(description)
binding.mindMapView.editNodeText(description)
binding.mindMapView.fitScreen()