CircularView


Source link: https://github.com/sababado/CircularView

CircularView

Trello Project Board

A custom view for Android. It consists of a larger center circle that it surrounded by other circles. Each of the surrounding circles (or CircularViewObject's) can be represented by data or simply as a visual.

Usage

The library can be referenced from jcenter.

Gradle

compile 'com.sababado.circularview:library:1.1.+'

The CircularView can be defined in a XML layout or in code.

Quick Setup

Adding the view to a layout

<com.sababado.circularview.CircularView
  android:id="@+id/circular_view"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:centerBackgroundColor="#33b5e5"
  app:centerDrawable="@drawable/center_bg"/>

Using the custom attributes requires the following in the layout file. Example

xmlns:app="http://schemas.android.com/apk/res-auto" 

Adding Markers

A Marker is an object that visual "floats" around the view. Each marker is can represent data or it can simply be for visual effect. Markers must be customized through a CircularViewAdapter.

public class MySimpleCircularViewAdapter extends SimpleCircularViewAdapter {

  @Override
  public int getCount() {

// This count will tell the circular view how many markers to use.

return 20;
  
}

@Override
  public void setupMarker(final int position, final Marker marker) {

// Setup and customize markers here. This is called every time a marker is to be displayed.

// 0 >= position > getCount()

// The marker is intended to be reused. It will never be null.

marker.setSrc(R.drawable.ic_launcher);

marker.setFitToCircle(true);

marker.setRadius(10 + 2 * position);

  
}
 
}

Once the CircularViewAdapter implementation is ready it can be set on a CircularView object.

mAdapter = new MySimpleCircularViewAdapter();
 circularView = (CircularView) findViewById(R.id.circular_view);
 circularView.setAdapter(mAdapter);

Receiving click listeners

Click events can be received from the CircularView.

To receive click events set a CircularView.OnClickListener into circularView.setOnCircularViewObjectClickListener(l). For example:

circularView.setOnCircularViewObjectClickListener(new CircularView.OnClickListener() {

public void onClick(final CircularView view, boolean isLongClick) {

Toast.makeText(MainActivity.this, "Clicked center", Toast.LENGTH_SHORT).show();

  
}

public void onMarkerClick(CircularView view, Marker marker, int position, boolean isLongClick) {

Toast.makeText(MainActivity.this, "Clicked " + marker.getId(), Toast.LENGTH_SHORT).show();

  
}
 
}
);

Long click events will come in through the same listener.

Animation

There are a few simple animations built into the library at the moment.

Animate Highlighted Degree

The CircularView has animateHighlightedDegree(start, end, duration). The method takes a start and end position in degrees, and a long value for the duration of the animation. The highlighted degree refers to which degree is "highlighted" or "focused". When a degree is focused it can trigger a secondary animation automatically for a Marker.

A listener can be set to receive a callback when this animation ends, and on what object it stopped on.

circularView.setOnHighlightAnimationEndListener(new CircularView.OnHighlightAnimationEndListener() {

  @Override
  public void onHighlightAnimationEnd(CircularView view, Marker marker, int position) {

Toast.makeText(MainActivity.this, "Spin ends on " + marker.getId(), Toast.LENGTH_SHORT).show();

  
}
 
}
);

Marker Animation Options

Markers have a simple animation associated with them; up and down. It can repeat or it can happen once. The CircularView can trigger the bounce animation when animateHighlightedDegree(start, end, duration) is called. The bounce animation can be turned off by calling the same method with an additional flag. For example:

animateHighlightedDegree(start, end, duration, shouldAnimateMarkers)

In addition there is control over if a marker should bounce while it is highlighted and while the highlighted degree value is constant (aka not animating).

// Allow markers to continuously animate on their own when the highlight animation isn't running. circularView.setAnimateMarkerOnStillHighlight(true);
 // Combine the above line with the following so that the marker at it's position will animate at the start. circularView.setHighlightedDegree(circularView.BOTTOM);

The latter line is necessary in case the bounce animation should also run initially. The highlighted degree is set to CircularView.HIGHLIGHT_NONE by default.

Proguard

If using proguard add the following to your proguard script to make sure animations run

# keep setters in Views so that animations can still work. # see http://proguard.sourceforge.net/manual/examples.html#beans -keepclassmembers public class * extends android.view.View {

 void set*(***);

 *** get*();
 
}
 # keep setters in CircularViewObjects so that animations can still work. -keepclassmembers public class * extends com.sababado.circularview.CircularViewObject {

 void set*(***);

 *** get*();
 
}
 

Developer Hints

  • Every property that can be customized on a CircularViewObject can also be customized on a Marker object. A Marker object extends from a CircularViewObject. The former is used as a smaller object that floats around the center object. The center object is a CircularViewObject.
  • By default, markers are drawn in the order that they're created; meaning if markers overlap then the first marker will be partially covered by the next marker. An option can be set to draw the highlighted marker on top of the markers next to it with circularView.setDrawHighlightedMarkerOnTop(true); . The flag is false by default.
  • Any CircularViewObject can be hidden and shown independently of other objects using setVisibility(int)
  • In a layout editor use the attribute editMode_markerCount and editMode_markerRadius to see the size and layout of markers. Not supplying a radius will show the default radius.

License

Copyright 2017 Robert Szabo  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. 

Resources

Titanic is an Android experiment reproducing this effect:

Layout inflation library for Android which uses annotation processing to write the code you don't want to write and simplify your compound views.

Use the annotation @AfterInflate on your compound view's methods you want to run straight after the layout is inflated with Michelangelo.

TextChronometer is a very simple library offering a widget showing a live time formatted like "4 seconds ago": This library is very convenient if you are building apps with a live timeline.

A TextView that simulates the effect from the app Secret where the characters fade in/out at different speeds.

An animated path view following the methods in a blog post.

A highly configurable section based layout manager with headers and all that.

Features:

  • Section Headers
    • Sticky headers
    • Headers in content margins
    • Header overlays
  • Individual layouts for each section at the same time
    • Linear
    • Grid not yet implemented
    • Staggered Grid not yet implemented

Topics


2D Engines   3D Engines   9-Patch   Action Bars   Activities   ADB   Advertisements   Analytics   Animations   ANR   AOP   API   APK   APT   Architecture   Audio   Autocomplete   Background Processing   Backward Compatibility   Badges   Bar Codes   Benchmarking   Bitmaps   Bluetooth   Blur Effects   Bread Crumbs   BRMS   Browser Extensions   Build Systems   Bundles   Buttons   Caching   Camera   Canvas   Cards   Carousels   Changelog   Checkboxes   Cloud Storages   Color Analysis   Color Pickers   Colors   Comet/Push   Compass Sensors   Conferences   Content Providers   Continuous Integration   Crash Reports   Credit Cards   Credits   CSV   Curl/Flip   Data Binding   Data Generators   Data Structures   Database   Database Browsers   Date &   Debugging   Decompilers   Deep Links   Dependency Injections   Design   Design Patterns   Dex   Dialogs   Distributed Computing   Distribution Platforms   Download Managers   Drawables   Emoji   Emulators   EPUB   Equalizers &   Event Buses   Exception Handling   Face Recognition   Feedback &   File System   File/Directory   Fingerprint   Floating Action   Fonts   Forms   Fragments   FRP   FSM   Functional Programming   Gamepads   Games   Geocaching   Gestures   GIF   Glow Pad   Gradle Plugins   Graphics   Grid Views   Highlighting   HTML   HTTP Mocking   Icons   IDE   IDE Plugins   Image Croppers   Image Loaders   Image Pickers   Image Processing   Image Views   Instrumentation   Intents   Job Schedulers   JSON   Keyboard   Kotlin   Layouts   Library Demos   List View   List Views   Localization   Location   Lock Patterns   Logcat   Logging   Mails   Maps   Markdown   Mathematics   Maven Plugins   MBaaS   Media   Menus   Messaging   MIME   Mobile Web   Native Image   Navigation   NDK   Networking   NFC   NoSQL   Number Pickers   OAuth   Object Mocking   OCR Engines   OpenGL   ORM   Other Pickers   Parallax List   Parcelables   Particle Systems   Password Inputs   PDF   Permissions   Physics Engines   Platforms   Plugin Frameworks   Preferences   Progress Indicators   ProGuard   Properties   Protocol Buffer   Pull To   Purchases   Push/Pull   QR Codes   Quick Return   Radio Buttons   Range Bars   Ratings   Recycler Views   Resources   REST   Ripple Effects   RSS   Screenshots   Scripting   Scroll Views   SDK   Search Inputs   Security   Sensors   Services   Showcase Views   Signatures   Sliding Panels   Snackbars   SOAP   Social Networks   Spannable   Spinners   Splash Screens   SSH   Static Analysis   Status Bars   Styling   SVG   System   Tags   Task Managers   TDD &   Template Engines   Testing   Testing Tools   Text Formatting   Text Views   Text Watchers   Text-to   Toasts   Toolkits For   Tools   Tooltips   Trainings   TV   Twitter   Updaters   USB   User Stories   Utils   Validation   Video   View Adapters   View Pagers   Views   Watch Face   Wearable Data   Wearables   Weather   Web Tools   Web Views   WebRTC   WebSockets   Wheel Widgets   Wi-Fi   Widgets   Windows   Wizards   XML   XMPP   YAML   ZIP Codes