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 is designed to support different graph layouts and currently works with small graphs only.

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

Download

dependencies {
    implementation 'de.blox:graphview:0.7.1'
}

Layouts

Tree

Uses Walker's algorithm with Buchheim's runtime improvements (BuchheimWalkerAlgorithm class). 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 (FruchtermanReingoldAlgorithm class) was implemented.

Layered graph

Algorithm from Sugiyama et al. for drawing multilayer graphs, taking advantage of the hierarchical structure of the graph (SugiyamaAlgorithm class). You can also set the parameters for node and level separation using the SugiyamaConfiguration.Builder.

Usage

Using GraphView is not much different than using RecyclerView. Add GraphView to your layout file.

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

    <de.blox.graphview.GraphView
        android:id="@+id/graph"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:lineColor="@android:color/holo_blue_dark"
        app:lineThickness="2dp"
        app:useMaxSize="true" />
</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.

Then define the node layout, e.g. node.xml. You can make the node Layout as complex as you want.

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

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

public class GraphActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        GraphView graphView = findViewById(R.id.graph);

        // example tree
        final Graph graph = new Graph();
        final Node node1 = new Node("Parent");
        final Node node2 = new Node("Child 1");
        final Node node3 = new Node("Child 2");

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

        // you can set the graph via the constructor or use the adapter.setGraph(Graph) method
        GraphAdapter adapter = new GraphAdapter<GraphView.ViewHolder>(graph) {

            @NonNull
            @Override
            public GraphView.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(GraphView.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();
        graphView.setLayout(new BuchheimWalkerAlgorithm(configuration));
    }
}

Your ViewHolder class should extend from GraphView.ViewHolder:

class SimpleViewHolder extends GraphView.ViewHolder {
    TextView textView;

    SimpleViewHolder(View itemView) {
        super(itemView);
        textView = itemView.findViewById(R.id.text);
    }
}

Customization

To use the custom attributes you have to add the namespace first: xmlns:app="http://schemas.android.com/apk/res-auto"

Attribute Format Example Explanation
lineThickness Dimension 10dp Set how thick the connection lines should be
lineColor Color "@android:color/holo_red_dark" Set the color of the connection lines
useMaxSize Boolean true Use the same size for each node

Each of the attributes has a corresponding setter in the GraphView class, if you want to use it programmatically.

Examples

Rooted Tree

alt Example

Directed Graph

alt Example

Layered Graph

alt Example

License

Copyright 2020 Team-Blox

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
null
Android library to display a few images in one ImageView like avatar of group chat. Made by Stfalcon

MultiImageView Library for display a few images in one MultiImageView like avatar of group chat Who we are Need iOS and Android apps, MVP development

Stfalcon LLC 468 Dec 9, 2022
Library project to display DialogFragment with a blur effect.

BlurDialogFragment This project allows to display DialogFragment with a burring effect behind. The blurring part is achieved through FastBlur algorith

tvbarthel 2.1k Dec 29, 2022
Splash screen demo that used with ‘Splash Screen‘ API on Android 12.

Splash Screen Feature Splash screen demo that used with Splash Screen API on Android 12. ?? Screenshot Default splash screen Splash screen with animat

Ellison Chan 60 Nov 16, 2022
Wrapper of the ObjectAnimator that can be used similarly to ViewPropertyAnimator

ViewPropertyObjectAnimator Wrapper of the ObjectAnimator that can be used similarly to ViewPropertyAnimator. ViewPropertyObjectAnimator is as easy to

Bartek Lipinski 313 Dec 19, 2022
Android library. Flexible components for chat UI implementation with flexible possibilities for styling, customizing and data management. Made by Stfalcon

ChatKit for Android ChatKit is a library designed to simplify the development of UI for such a trivial task as chat. It has flexible possibilities for

Stfalcon LLC 3.6k Jan 5, 2023
Smoothen rx value streams for e.g. sensor data using kalman filter.

KalmanRx Introduction Removes the noise from float streams using Kalman Filter. Useful to smoothen sensory data e.g.: gps location, or Accelerometer.

Jan Rabe 98 Nov 23, 2022
A component for flip animation on Android, which is similar to the effect in Flipboard iPhone/Android

android-flip Aphid FlipView is a UI component to accomplish the flipping animation like Flipboard does. A pre-built demo APK file for Android OS 2.2+

Bo 2.8k Dec 21, 2022
:rocket: Ultimate Android Reference - Your Road to Become a Better Android Developer

The goal of this project is to provide a hand-picked collection of Android libraries, tools, open-source projects, books, blogs, tutorials - you name

Aritra Roy 7.6k Jan 4, 2023
Deprecated in favour of https://developer.android.com/reference/android/support/v4/view/animation/PathInterpolatorCompat.html

Deprecated: use https://developer.android.com/reference/android/support/v4/view/animation/PathInterpolatorCompat.html instead. android-cubic-bezier-in

Codesoup 161 Jan 1, 2023
Android Country Picker is a Kotlin-first, flexible and powerful Android library that allows to integrate Country Picker with just a few lines.

1. Add dependency dependencies { implementation 'com.hbb20:android-country-picker:X.Y.Z' } For latest version, 2. Decide your use-case

Harsh B. Bhakta 65 Dec 6, 2022
Allows the easy creation of animated transition effects when the state of Android UI has changed

android-transition Android-Transition allows the easy creation of view transitions that reacts to user inputs. The library is designed to be general e

Kai 615 Nov 14, 2022
Actions for android animations. Inspired by libgdx scene2d actions.

Android Animations Actions Actions for android animations. Inspired by libgdx scene2d actions. The main goal of this project is making creating of com

dtx12 137 Nov 29, 2022
Android library for swipable gestures

Swipper Android Library for custom views to control brightness , volume and seek through swipable gestures . These views could easily replace the conv

Mobile Development Group 105 Dec 30, 2022
Android Library that lights items for tutorials or walk-throughs etc...

Spotlight Gradle dependencies { implementation 'com.github.takusemba:spotlight:x.x.x' } Usage val spotlight = Spotlight.Builder(this) .setTarg

TakuSemba 3.4k Jan 4, 2023
[] An Android library which allows developers to easily add animations to ListView items

DEPRECATED ListViewAnimations is deprecated in favor of new RecyclerView solutions. No new development will be taking place, but the existing versions

Niek Haarman 5.6k Dec 30, 2022
An amazing and convenient Android image slider.

Android Image Slider ![Gitter](https://badges.gitter.im/Join Chat.svg) This is an amazing image slider for the Android platform. I decided to open sou

代码家 5.6k Jan 7, 2023
Android ImageViews animated by Ken Burns Effect

KenBurnsView Android library that provides an extension to ImageView that creates an immersive experience by animating its drawable using the Ken Burn

Flávio Faria 2.7k Jan 2, 2023
You can easily access the top of the screen in Android. Like a iPhone 6 & 6 Plus.

Reachability on Android Easy access on top. Like a iPhone 6 & 6 Plus. demo apk Usage Add dependencies compile 'com.github.sakebook:Reachability:0.2.0@

sakebook 258 Nov 12, 2022
Android Animation Easing Functions. Let's make animation more real!

Android Easing Functions This project is originally from my another project, AndroidViewAnimation, which is an animation collection, to help you make

代码家 2.5k Jan 4, 2023