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
Repository contains structures and methods to execute linear algebra operations (matrix multiplication etc)

LinearAlgebra Repository contains structures and methods to execute linear algebra operations (matrix multiplication etc) Matrix class Matrix implemen

null 0 Apr 27, 2022
Graph weather widget for Android

This app is a fork of aix weather widget which is no longer actively developed. It is a compact graphical weather graph as a single row Android widget. The source code is made public domain as it may provide utility for others. Please respect the various APIs used by the app, and please modify the user agent if you are running a modified version of the app.

null 25 Dec 23, 2022
Open Graph Parser for Android

OpenGraphParser A small and easy to use library which provides the convenience of using Open Graph Protocol in Android very easily. Create previews fo

Priyansh Kedia 69 Jan 4, 2023
A stock market app , with cached , search functionality , and market overview in the form of graph statics

A stock market app , with cached , search functionality , and market overview in the form of graph statics. The graph really looks cool (jetpack compose, SOLID priciples).

SUMIT KUMAR 1 May 20, 2022
Simple application with some famous graph algorithm implemented by Jetpack Compose framework

GraphAlgorithm This Application was implemented by Jetpack Compose framework. The dagger-hilt library was used for dependency injection and Room libra

Amirreza lotfi 8 Aug 17, 2022
This android app fetches the data from the USGS API in real time to display a list of earthquakes.

This android app fetches the data from the USGS API in real time to display a list of earthquakes. On clicking an earthquake it opens a browser window with the complete information of the earthquake along with the location on a map.

null 5 Jan 11, 2022
An android app which allows users to display the data of any excel sheet in rows and columns

ExcelReader App description An android app which allows users to display the data of any excel sheet in rows and columns. Features Display data of an

Srihitha Tadiparthi 4 Oct 25, 2022
Environmental-Monitoring-Android-App - This Android App is used to monitor environmental parameters data from remote sensors

Environmental-Monitoring-Android-App - This Android App is used to monitor environmental parameters data from remote sensors. Parameters includes but not limited to temperature, humidity, air quality, level of Ionizing radiation, ...

Francisco Pascal Elias TAMBASAFIDY 0 Jan 4, 2022
Android app which fetches a sample movies list to display. Built using Kotlin and latest Android tech stack, with an approach to clean architecture.

movies-sample-app This is an Android app which fetches a sample movies list to display. Built using Kotlin and latest Android tech stack, with an appr

Nadeem Ahmed 1 Oct 21, 2021
Simple android application that consumes RAWG API to display a list of games

Gamex Compose -Work in Progress- An android application that consumes RAWG API to display a list of popular video games built using Jetpack Compose an

Victor Kabata 17 Nov 14, 2022
An android app built using Kotlin that consumes TMDB API to display current trending, upcoming and popular movies 🍿 .

Flick An android app built using Kotlin that consumes TMDB API to display current trending, upcoming and popular movies ?? .It has been built followin

Kagiri Charles 8 Nov 29, 2022
An android app that use food API to display different categories of food

TheMealApp An android app that use food API to display different categories of food The food api is https://www.themealdb.com/api.php. What I used in

null 8 Jun 17, 2022
Changelog - a android library, it helps developers display the history of changes in their applications

Changelog is a android library, it helps developers display the history of changes in their applications. Supports Locales, Layout direction

Amirhosein Barati 2 Aug 1, 2022
RedditNews - A simple application to display the top news from the Reddit API site and save your favorites to a local database.

RedditNews - A simple application to display the top news from the Reddit API site and save your favorites to a local database. Arch

null 1 Aug 28, 2022
ComicsShow app: Display comics and search for any favourites one

ComicsShow app: Display comics and search for any favourites one. Technologies used: Koin: For injecting class and providing modules on runtime :). Vi

Ahmed Gamal Yousef 1 Nov 21, 2021
Small library that allows the application to display a small troubleshooting guide in case of repeated app startup crashes.

AppSalvager What is it? AppSalvager allows you to combat the issue of repeating crashes on app startup. Failed data migration, SDKs not handling their

Alexander Leontev 29 Aug 31, 2022
LedBuzz is a NodeMCU-powered see-through propeller display

LedBuzz What it does LedBuzz is a NodeMCU-powered see-through propeller display. By simply staring at your ceiling fan, you receive notification alert

Jatin 2 Jan 9, 2022
Acme-app - App to display the best routes for drivers based on a secret algorithm

Acme App App to display the best routes for drivers based on a "secret" algorith

Pablo Baxter 0 Jan 9, 2022
Marvel - A simple application to display information about the characters of the Marvel universe

Marvel Characters 'Marvel characters' is a simple application to display informa

Saul Molinero 10 Jan 12, 2022