Android GraphView is used to display data in graph structures.

Overview

GraphView

Android GraphView is used to display data in graph structures.

alt Logo

Overview

The library can be used within RecyclerView and currently works with small graphs only.

This project is currently experimental and the API subject to breaking changes without notice.

Download

The library is only available on MavenCentral. Please add this code to your build.gradle file on project level:

allprojects {
  repositories {
    ...
    mavenCentral()
  }
}

And add the dependency to the build.gradle file within the app module:

dependencies {
    implementation 'dev.bandb.graphview:graphview:0.8.1'
}

Layouts

Tree

Uses Walker's algorithm with Buchheim's runtime improvements (BuchheimWalkerLayoutManager class). Currently only the TreeEdgeDecoration can be used to draw the edges. Supports different orientations. All you have to do is using the BuchheimWalkerConfiguration.Builder.setOrientation(int) with either ORIENTATION_LEFT_RIGHT, ORIENTATION_RIGHT_LEFT, ORIENTATION_TOP_BOTTOM and ORIENTATION_BOTTOM_TOP (default). Furthermore parameters like sibling-, level-, subtree separation can be set.

Directed graph

Directed graph drawing by simulating attraction/repulsion forces. For this the algorithm by Fruchterman and Reingold (FruchtermanReingoldLayoutManager class) was implemented. To draw the edges you can use ArrowEdgeDecoration or StraightEdgeDecoration.

Layered graph

Algorithm from Sugiyama et al. for drawing multilayer graphs, taking advantage of the hierarchical structure of the graph (SugiyamaLayoutManager class). Currently only the SugiyamaArrowEdgeDecoration can be used to draw the edges. You can also set the parameters for node and level separation using the SugiyamaConfiguration.Builder.

Usage

GraphView must be integrated with RecyclerView. For this you’ll need to add a RecyclerView to your layout and create an item layout like usually when working with RecyclerView.

<com.otaliastudios.zoom.ZoomLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:hasClickableChildren="true">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</com.otaliastudios.zoom.ZoomLayout>

Currently GraphView must be used together with a Zoom Engine like ZoomLayout. To change the zoom values just use the different attributes described in the ZoomLayout project site.

To create a graph, we need to instantiate the Graph class. Next submit your graph to your Adapter, for that you must extend from the AbstractGraphAdapter class.

private void setupGraphView {
    val recycler = findViewById(R.id.recycler)

    // 1. Set a layout manager of the ones described above that the RecyclerView will use.
    val configuration = BuchheimWalkerConfiguration.Builder()
                    .setSiblingSeparation(100)
                    .setLevelSeparation(100)
                    .setSubtreeSeparation(100)
                    .setOrientation(BuchheimWalkerConfiguration.ORIENTATION_TOP_BOTTOM)
                    .build()
    recycler.layoutManager = BuchheimWalkerLayoutManager(context, configuration)

    // 2. Attach item decorations to draw edges
    recycler.addItemDecoration(TreeEdgeDecoration())

    // 3. Build your graph
    val graph = Graph()
    val node1 = Node("Parent")
    val node2 = Node("Child 1")
    val node3 = Node("Child 2")

    graph.addEdge(node1, node2)
    graph.addEdge(node1, node3)

    // 4. You will need a simple Adapter/ViewHolder.
    // 4.1 Your Adapter class should extend from `AbstractGraphAdapter`
    adapter = object : AbstractGraphAdapter<NodeViewHolder>() {

        // 4.2 ViewHolder should extend from `RecyclerView.ViewHolder`
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NodeViewHolder {
            val view = LayoutInflater.from(parent.context)
                    .inflate(R.layout.node, parent, false)
            return NodeViewHolder(view)
        }

        override fun onBindViewHolder(holder: NodeViewHolder, position: Int) {
            holder.textView.text = getNodeData(position).toString()
        }
    }.apply {
        // 4.3 Submit the graph
        this.submitGraph(graph)
        recycler.adapter = this
    }
}

Customization

You can change the edge design by supplying your custom paint object to your edge decorator.

    val edgeStyle = Paint(Paint.ANTI_ALIAS_FLAG).apply {
        strokeWidth = 5f
        color = Color.BLACK
        style = Paint.Style.STROKE
        strokeJoin = Paint.Join.ROUND
        pathEffect = CornerPathEffect(10f) 
    }
    
    recyclerView.addItemDecoration(TreeEdgeDecoration(edgeStyle))

If you want that your nodes are all the same size you can set useMaxSize to true. The biggest node defines the size for all the other nodes.

    recyclerView.layoutManager = BuchheimWalkerLayoutManager(this, configuration).apply { 
        useMaxSize = true
    }

Examples

Rooted Tree

alt Example

Directed Graph

alt Example

Layered Graph

alt Example

License

Copyright 2019 - 2021 Block & Block

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Comments
  • getHeight()' on a null object reference

    getHeight()' on a null object reference

    Hey there i want to know what is limit of graph? i have more than 5k records with nodes. i need help to solve this.

    java.lang.NullPointerException: Attempt to invoke virtual method 'int de.blox.graphview.Size.getHeight()' on a null object reference at de.blox.graphview.Node.getHeight(Node.java:45) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:69) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.firstWalk(BuchheimWalkerAlgorithm.java:89) at de.blox.graphview.tree.BuchheimWalkerAlgorithm.run(BuchheimWalkerAlgorithm.java:345) at de.blox.graphview.BaseGraphAdapter.notifySizeChanged(BaseGraphAdapter.java:41) at de.blox.graphview.GraphNodeContainerView.onMeasure(GraphNodeContainerView.java:367) at android.view.View.measure(View.java:24549) at android.view.ViewGroup.measureChild(ViewGroup.java:6799) at android.view.ViewGroup.measureChildren(ViewGroup.java:6776) at com.otaliastudios.zoom.ZoomLayout.onMeasure(ZoomLayout.java:104) at android.view.View.measure(View.java:24549) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552) at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1204) at android.widget.LinearLayout.onMeasure(LinearLayout.java:723) at android.view.View.measure(View.java:24549) at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227) at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572) at android.view.View.measure(View.java:24549) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143) at android.view.View.measure(View.java:24549) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:401) at android.view.View.measure(View.java:24549) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at android.view.View.measure(View.java:24549) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552) at android.widget.LinearLayout.measureVertical(LinearLayout.java:842) at android.widget.LinearLayout.onMeasure(LinearLayout.java:721) at android.view.View.measure(View.java:24549) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6828) at android.widget.FrameLayout.onMeasure(FrameLayout.java:194) at com.android.internal.policy.DecorView.onMeasure(DecorView.java:742) at android.view.View.measure(View.java:24549) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3007) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1834) 2020-03-19 23:40:57.893 27200-27200/com.kishanmaniar.treeview E/AndroidRuntime: at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2123) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1722) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7605) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1029) at android.view.Choreographer.doCallbacks(Choreographer.java:852) at android.view.Choreographer.doFrame(Choreographer.java:787) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1014) at android.os.Handler.handleCallback(Handler.java:883) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7403) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

    opened by TheDevManIT 16
  • How to Dynamic Node Create

    How to Dynamic Node Create

    Hello friends. I'm facing a problem while creating node dynamically. I have 2 column on my database

    1. id
    2. parentId

    i want to create dynamically node using 'id' as node name and use it on graph create. i need help how can i do that dynamically ?

    opened by TheDevManIT 12
  • Null pointer Exception at 'int de.blox.graphview.tree.BuchheimWalkerNodeData.getDepth()'

    Null pointer Exception at 'int de.blox.graphview.tree.BuchheimWalkerNodeData.getDepth()'

    Following is the code used:

    GraphView graphView = findViewById(R.id.graph);
    List<Parent> parent_list = response.body();
    Graph graph = new Graph();
        for(int h = 0; h < parent_list.size();h++) {
                Node node1 = new Node(parent_list.get(h).name);
                Node node2 = new Node(parent_list.get(h).user_id);
                graph.addEdge(node1, node2);
          }
    final BaseGraphAdapter<ViewHolder> adapter = new BaseGraphAdapter<ViewHolder>(graph) {
    
                @NonNull
                @Override
                public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                    final View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.node, parent, false);
                    return new SimpleViewHolder(view);
                }
    
                @Override
                public void onBindViewHolder(ViewHolder viewHolder, Object data, int position) {
                    ((SimpleViewHolder)viewHolder).textView.setText(data.toString());
                }
            };
            graphView.setAdapter(adapter);
    
            // set the algorithm here
            final BuchheimWalkerConfiguration configuration = new BuchheimWalkerConfiguration.Builder()
                    .setSiblingSeparation(100)
                    .setLevelSeparation(300)
                    .setSubtreeSeparation(300)
                    .setOrientation(BuchheimWalkerConfiguration.ORIENTATION_TOP_BOTTOM)
                    .build();
            adapter.setAlgorithm(new BuchheimWalkerAlgorithm(configuration));
    

    How to fix this issue ? As the graphview loads correctly without using for loop.

    opened by VKdeveloper 11
  • Zoom feature

    Zoom feature

    Hello.

    I like the library but it is in early stages of development. It would be very good if the view has also zooming capabilities.

    Thank you so much for this library.

    feature request 
    opened by ahmetcj4 11
  • How to add nodes dynamically from firebase

    How to add nodes dynamically from firebase

    Tried this but app crashes. I also want to add mulitple child nodes to a parent and I cant guess how to do that dynamically.

    databaseReference = FirebaseDatabase.getInstance().getReference("family_members/"); databaseReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) {

                for (DataSnapshot postSnapshot : snapshot.getChildren()) {
    
                    FamMembers memberUploadInfo = postSnapshot.getValue(FamMembers.class);
    
                    if(memberUploadInfo.getFname().equals("pp")) {
                        node1 = new Node(memberUploadInfo.getFname());
                        node2 = new Node(memberUploadInfo.getChildren());
    
                    }
    
    
                }
    
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });
        graph.addEdge(node1,node2);
    
    question 
    opened by deeppomal 8
  • How can I get item layout from adapter ?

    How can I get item layout from adapter ?

    I was try with this script but nothing happen.

    View v =adapter.getView(0, null, graphView); TextView t = v.findViewById(R.id.t1); t.setText("TEST");

    opened by jemmycalak 7
  • Delete the node what has a child node.

    Delete the node what has a child node.

    Hi. I got a problem when deleting a node in the Graph. It works with the node doesn't have any child node, but when I delete the node has some child node below it, I received the error message : "java.lang.NullPointerException: Attempt to invoke virtual method 'int de.blox.graphview.tree.BuchheimWalkerNodeData.getDepth()' on a null object reference" How can I resolve it?

    bug 
    opened by ntngocanh21 7
  • Why last row not rendering in Sugiyama Algorithm?

    Why last row not rendering in Sugiyama Algorithm?

    ` add.setOnClickListener{ if (clicked_nodes.size == 1) { graphView.adapter.graph.addEdge(Node(clicked_nodes[0]), Node(nodeCount)) graphView.adapter.notifyInvalidated()

                nodesData.add(0)
                nodeCount++
            } else {
                try {
                    graphView.adapter.graph.addEdge(searchNodeByData(0, graphView.adapter.graph.nodes), Node(nodeCount))
                } catch (e: ArrayIndexOutOfBoundsException) {
                    graphView.adapter.graph.addEdge(Node(0), Node(nodeCount))
                }
                graphView.adapter.notifyInvalidated()
    
                nodesData.add(0)
                nodeCount++
            }
        }
    

    `

    2020-02-11_00-38-09

    bug 
    opened by yoloroy 6
  • horizontal tree support?

    horizontal tree support?

    Is it possible to start from the left side(parent) to the right side(nodes)? if possible kindly help me to modify the codes or tell me what should I do to aim horizontal tree. Thanks in advance it will really helps.

    feature request 
    opened by herald25santos 6
  • Connect lines are not display with high sibling separation

    Connect lines are not display with high sibling separation

    I have to recreate a big tree diagram, this have a lot nodes ( around 100) and there have a big separation next to the other and with this, the lines are not drawing.

    If you want to simulate the problem, set (can be use the same initial example of the github):

    .setSiblingSeparation(10000)

    and you will see the problem.

    opened by nico6122 5
  • Cannot resolve symbol 'adapter'

    Cannot resolve symbol 'adapter'

    I copied the code given in Readme to get started but I got the error at 'adapter = new GraphAdapter<GraphView.ViewHolder>(graph) {' line saying "Cannot resolve symbol 'adapter'". I tried resolving it but implementing suggested resolution of declaring it as type GraphAdapter. After doing this I'm getting error at line 'adapter.setLayout(.....)' since setLayout class is not there in GraphAdapter class but in GraphView class. Please help

    opened by AnirudhJ3 4
  • [Feature Request]: Ability to Drag and Drop nodes

    [Feature Request]: Ability to Drag and Drop nodes

    Hi Team,

    First of all, thanks for the amazing library. It has been really useful in developing one of the core visualizations in my app.

    I had couple of feature requests:

    • Ability to draw Edges as arcs instead of straight lines. (Enhances the look of the resulting visualization)
    • Ability to drag/drop or reposition nodes.
    • Algorithm to fan out the graph. (another option beside top/down, left/right)

    If someone has been able to make the above work, would love to see the implementation. Else, I'd work on adding these abilities myself. Any suggestions/directions are welcome.

    Thanks again for all the work on this.

    feature request 
    opened by satyan 3
  • set right or left position for node

    set right or left position for node

    hi is there any way to i set where to add to node when i am adding to graph? for example graph.addEdge(prNode, Node(subUser)) to left edge or right ? thank you.

    feature request 
    opened by alirezarabiei7239 2
  • IndexOutOfBoundsException when using SugiyamaAlgorithm for certain cases

    IndexOutOfBoundsException when using SugiyamaAlgorithm for certain cases

    As the title says, the graph may run into problem in certain cases, when trying to draw itself.

    My initialization of the algorithm is:

    val configurationBuilder = SugiyamaConfiguration.Builder().setLevelSeparation(300).setNodeSeparation(100)
    val algorithm = SugiyamaAlgorithm(SugiyamaConfiguration(configurationBuilder))
    

    The known simplest graph structure is with three nodes (reported in renyuneyun/Easer#310 ):

    s1
    s2 -> p1
    

    I tried to dig into GraphView's code, but wasn't able to understand what type1Conflicts is meant for. Therefore, here is the stacktrace:

        java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
            at java.util.ArrayList.get(ArrayList.java:437)
            at de.blox.graphview.layered.SugiyamaAlgorithm.verticalAlignment(SugiyamaAlgorithm.java:586)
            at de.blox.graphview.layered.SugiyamaAlgorithm.assignX(SugiyamaAlgorithm.java:367)
            at de.blox.graphview.layered.SugiyamaAlgorithm.coordinateAssignment(SugiyamaAlgorithm.java:328)
            at de.blox.graphview.layered.SugiyamaAlgorithm.run(SugiyamaAlgorithm.java:53)
            at de.blox.graphview.BaseGraphAdapter.notifySizeChanged(BaseGraphAdapter.java:29)
            at de.blox.graphview.GraphNodeContainerView.onMeasure(GraphNodeContainerView.java:368)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewGroup.measureChild(ViewGroup.java:6829)
            at android.view.ViewGroup.measureChildren(ViewGroup.java:6806)
            at com.otaliastudios.zoom.ZoomLayout.onMeasure(ZoomLayout.kt:129)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6858)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6858)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6858)
            at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:733)
            at com.google.android.material.appbar.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:95)
            at com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1556)
            at androidx.coordinatorlayout.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:803)
            at android.view.View.measure(View.java:24710)
            at androidx.drawerlayout.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6858)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
            at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6858)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6858)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6858)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1552)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:842)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:721)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6858)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
            at com.android.internal.policy.DecorView.onMeasure(DecorView.java:749)
            at android.view.View.measure(View.java:24710)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3259)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2042)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2337)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1930)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7988)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1154)
            at android.view.Choreographer.doCallbacks(Choreographer.java:977)
            at android.view.Choreographer.doFrame(Choreographer.java:893)
    2020-02-08 17:08:34.571 14743-14743/ryey.easer.beta E/AndroidRuntime:     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1139)
            at android.os.Handler.handleCallback(Handler.java:883)
            at android.os.Handler.dispatchMessage(Handler.java:100)
            at android.os.Looper.loop(Looper.java:214)
            at android.app.ActivityThread.main(ActivityThread.java:7682)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
    
    enhancement 
    opened by renyuneyun 3
  • Nodes overlap on each other

    Nodes overlap on each other

    Hi, thanks for this useful library. Actually i'm experiencing an issue about overlapping nodes on each other. The images shown below. How can i solve this issue? i referred to the issue #2 but didn't find any solution. This is my configuration for BaseGraphAdapter's algorithm:

    val configuration = BuchheimWalkerConfiguration.Builder() .setSiblingSeparation(100) .setLevelSeparation(300) .setSubtreeSeparation(300) .setOrientation(BuchheimWalkerConfiguration.ORIENTATION_LEFT_RIGHT) .build()

    algorithm = BuchheimWalkerAlgorithm(configuration)

    Screenshot_1576325551 Screenshot_1576325524

    I've tried landscape mode or change values inside the configuration but none of them solved the issue. Thanks

    bug 
    opened by alisoleimani-android 14
Releases(0.8.1)
  • 0.8.1(Apr 10, 2021)

  • v0.7.1(Oct 26, 2020)

  • v0.7.0(Jul 3, 2020)

    Breaking Changes!

    • Add padding calculation
    • Move layout algorithm from adapter to view and rename Algorithm to Layout.
    • Migrate to androidx.
    • Bump targetSdk/compiledSdk version to 29
    • Migrate to kotlin
    • Remove ZoomLayout from GraphView.
    • Now the redraw must be initiated manually via adapter.notifyDataSetChanged()
    Source code(tar.gz)
    Source code(zip)
  • v0.6.0(Feb 19, 2019)

  • v0.5.0(Feb 1, 2019)

  • v0.4.2(Oct 31, 2018)

  • v0.4.1(Oct 31, 2018)

    • Fixed: Deleting a node in a tree now deletes all children
    • Fixed: After deleting a node in a graph the remaining nodes are positioned closer together to remove unused space
    • Fixed: Deleting all nodes doesn't throw an exception anymore
    Source code(tar.gz)
    Source code(zip)
  • v0.4.0(Oct 22, 2018)

Owner
Block & Block
Block & Block
A powerful 🚀 Android chart view / graph view library, supporting line- bar- pie- radar- bubble- and candlestick charts as well as scaling, panning and animations.

⚡ A powerful & easy to use chart library for Android ⚡ Charts is the iOS version of this library Table of Contents Quick Start Gradle Maven Documentat

Philipp Jahoda 36k Dec 28, 2022
This project is used to introduce the use of flutter canvas, include draw chart, clip image's path and draw progress indicator.

flutter_canvas This project is used to introduce the use of flutter canvas, include draw chart, clip image's path and draw progress indicator. draw ch

YouXianMing 9 Oct 27, 2022
A Flutter data visualization library based on Grammar of Graphics.

Graphic is now under a total refactoring. The prior available version code is here: v0.3.0 . A Flutter data visualization library based on Grammar of

LIN Chen 906 Jan 3, 2023
In this project you will see how to generate charts with the data from the Firestore.

FlutterChartFirestore Flutter Tutorial - Flutter Charts+Firestore Video series can be watched here https://youtu.be/HGkbPrTSndM Getting Started In thi

Whatsupcoders 49 Oct 21, 2022
Stores and manages the data of your week expenses with a chart

personal_expenses_app A new Flutter project. Getting Started This project is a starting point for a Flutter application. A few resources to get you st

null 1 Dec 26, 2021
Tiny charts 🤏 - Sparkline charts for fast data visualization on Flutter apps

Tiny charts ?? - Sparkline charts for fast data visualization on Flutter apps

rows 15 Dec 10, 2022
Android GraphView is used to display data in graph structures.

GraphView Android GraphView is used to display data in graph structures. Overview The library can be used within RecyclerView and currently works with

Block & Block 992 Jan 6, 2023
Rocket is a parsing framework for parsing binary data structures using efficient parsing algorithms

rocket Version 0.1.10 (BETA) Rocket is a parsing framework for parsing binary data structures using efficient parsing algorithms. Breaking change: The

null 5 Dec 5, 2021
Implementation of data structures and algorithms in Dart programming language.

Algorithms in Dart Implementation of several algorithms with Dart programming language. Use dartdoc to generate documentation. Lists List data structu

Mafinar Khan 197 Dec 24, 2022
Prepare for Data Structures & Algorithms questions for your upcoming interviews with this Flutter App made by Parker Shamblin.

flutter_data_structures_and_algorithms Prepare for Data Structures & Algorithms questions for your upcoming interviews with this Flutter App made by P

Parker Shamblin 3 Jun 12, 2022
A powerful 🚀 Android chart view / graph view library, supporting line- bar- pie- radar- bubble- and candlestick charts as well as scaling, panning and animations.

⚡ A powerful & easy to use chart library for Android ⚡ Charts is the iOS version of this library Table of Contents Quick Start Gradle Maven Documentat

Philipp Jahoda 36k Dec 28, 2022
Foody - Flutter project to display foods to clients and display charts and has a lot of features , two flutter apps : Android and Web

Foody Flutter project to display foods to the clients and use charts and use a lot of features to complete the process (HUGE APP) There two apps: Andr

ABDULKARIMALBAIK 1 Feb 7, 2022
Create a DataTable with Flutter to display data in columns, rows, and cells and also learn how to sort the data within the table.

Flutter Tutorial - Sortable DataTable Create a DataTable with Flutter to display data in columns, rows, and cells and also learn how to sort the data

Johannes Milke 22 Oct 9, 2022
a wrapper for LabSound(graph-based audio engine)

lab_sound_flutter WIP lab_sound_flutter is the LabSound wrapper for Flutter. Currently only the Android platform is available, other platforms have en

null 10 Dec 11, 2022
Intel Corporation 238 Dec 24, 2022
Experimenting with 6 examples of different types of simple and complex JSON structures in Flutter

Parsing complex JSON in Flutter Gives a detailed explanation of working with simple and complex JSON structures using dart:convert library in Flutter

Pooja Bhaumik 488 Jan 6, 2023
A simple dart library for extracting the Open Graph protocol on a web pages

ogp_data_extract A simple dart library for extracting the Open Graph protocol on

KINTO 0 Jan 12, 2022
A showcase app for the Flutter SDK. Wonderous will educate and entertain as you uncover information about some of the most famous structures in the world.

Wonderous Navigate the intersection of history, art, and culture. Wonderous will educate and entertain as you uncover information about some of the mo

gskinner team 2.3k Dec 29, 2022
An app for analysing sound waves and building sounds from a visual sound wave graph

Wave This app was built for the Science Talent Search Victoria 2022. UPDATE: This project won a minor bursary prize in the Computer Programs category

William Herring 7 Dec 20, 2022