An Android Widget for selecting items that rotate on a wheel.

Related tags

UI/UX WheelView
Overview

Looking for maintainers

I'm no longer active on this project but I'll still focus on fixing crashing issues and review any code changes etc.

WheelView

WheelView is an Android library that allows drawables to be placed on a rotatable wheel. It behaves like a Circular ListView where items rotate rather than scroll vertically. It isn't limited by the number of items that can fit on the wheel since it will cycle through each adapter position when the wheel is rotated. It can be rotated at any angle and from any position.

The WheelView can be used as a way to select one item from a list. The SelectionAngle determines what position on the wheel is selected. You can also receive a callback for when an item is clicked, and whether it is selected. Have a look at the sample for a working example!

1 2

Note - Frame rate is much better than these poorly converted gifs!

Setup

Include this in build.gradle project dependencies:

dependencies {
    compile 'com.github.lukedeighton:wheelview:0.4.2'
}

Usage

  1. Add a custom view in xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.lukedeighton.wheelview.WheelView
        android:id="@+id/wheelview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:wheelColor="@color/grey_400"
        app:rotatableWheelDrawable="false"
        app:selectionAngle="90.0"
        app:wheelPosition="bottom"
        app:wheelOffsetY="60dp"
        app:repeatItems="true"
        app:wheelRadius="276dp"
        app:wheelItemCount="14"
        app:wheelPadding="13dp"
        app:wheelItemRadius="43dp"/>
</RelativeLayout>
  1. Set a WheelAdapter similar to how you would set an adapter with a ListView
wheelView.setAdapter(new WheelAdapter() {
    @Override
    public Drawable getDrawable(int position) {
        //return drawable here - the position can be seen in the gifs above
    }

    @Override
    public int getCount() {
        //return the count
    }
});

Please note that the WheelAdapter doesn't behave exactly like a ListAdapter since Drawables don't need to be recycled in comparison to Views where inflation is expensive. If you need to refresh the Adapter / Items then call setAdapter again.

Listeners

  1. A listener for when the closest item to the SelectionAngle changes.
wheelView.setOnWheelItemSelectedListener(new WheelView.OnWheelItemSelectListener() {
    @Override
    public void onWheelItemSelected(WheelView parent,  Drawable itemDrawable, int position) {
        //the adapter position that is closest to the selection angle and it's drawable
    }
});
  1. A listener for when an item is clicked.
wheelView.setOnWheelItemClickListener(new WheelView.OnWheelItemClickListener() {
    @Override
    public void onWheelItemClick(WheelView parent, int position, boolean isSelected) {
        //the position in the adapter and whether it is closest to the selection angle
    }
});
  1. A listener for when the wheel's angle is changed.
wheelView.setOnWheelAngleChangeListener(new WheelView.OnWheelAngleChangeListener() {
    @Override
    public void onWheelAngleChange(float angle) {
        //the new angle of the wheel
    }
});

Attributes

The WheelView is highly customisable with many attributes that can be set via xml or programmatically (recommend using xml as programmatically set attributes is half implemented at the moment). Here are the custom attributes that can be declared in xml:

  • wheelDrawable
  • wheelColor
  • emptyItemDrawable
  • emptyItemColor
  • selectionDrawable
  • selectionColor
  • selectionPadding
  • selectionAngle
  • repeatItems
  • wheelRadius
  • wheelItemRadius
  • rotatableWheelDrawable
  • wheelOffsetX
  • wheelOffsetY
  • wheelItemCount
  • wheelItemAngle
  • wheelToItemDistance
  • wheelPosition
  • wheelPadding
  • wheelItemTransformer
  • selectionTransformer

WheelItemTransformer

Determines the draw bounds of the WheelItem in relation to the selection angle.

  • SimpleItemTransformer - All items are the same size
  • ScalingItemTransformer - Items grow in size near to the selection angle

Future Goals

Convert this project to use LayoutManager to replace Drawables with Views

License

Apache License Version 2.0 http://apache.org/licenses/LICENSE-2.0.txt

Comments
  • selected items color?

    selected items color?

    Thank you for this amazing lib!

    I was trying to write a game with this lib, but the problem is that I couldn't find anything about changing selected item's color. Is there something like this or do i just implement myself?

    opened by Swisyn 4
  • Set background of the wheelView as an image

    Set background of the wheelView as an image

    Is there a way to set the background of the wheel view element as an image? As we can use android:background = "@drawable/imageResource" for listView

    opened by codingant007 3
  • how to set wheel view current position ?

    how to set wheel view current position ?

    i m trying to set currnet position of wheelview same as index we set in listview ..... for this i m doing this ... but i m not getting my desired result .. lets say i have passed arraylist to settext in wheelview and i m setting selected position to 1 ..... but i m not getting my desired result ? wheelView.setSelectedPosition(position);

    wheelView.setWheelItemCount(3); wheelView.layoutWheelItems(); wheelView.invalidate(); wheelView.invalidateWheelItemDrawables();

        MaterialColorAdapter mat = new MaterialColorAdapter(context, groupList,false);
        wheelView.setAdapter(mat);
    

    here is my adapter class :

    static class MaterialColorAdapter extends WheelArrayAdapter { private Context mContext; List grpList; boolean drawInnerText = false;

        MaterialColorAdapter(Context mContext,List<Groups> entries,boolean drawInnerText) {
            super(entries);
            //Log.d(TAG,"MaterialColorAdapter called");
            this.mContext = mContext;
            grpList = new ArrayList<Groups>();
            grpList = entries;
            Log.d(TAG, "MaterialColorAdapter:" + grpList.size());
            this.drawInnerText = drawInnerText;
        }
    
        @Override
        public Drawable getDrawable(int position) {
    
            Log.d(TAG, "getDrawable called for position:"+position);
    
            Log.d(TAG,"grpList.get(position).getTitle:"+grpList.get(position).getGroupTitle());
            Log.d(TAG,"grpList.get(position).getColor():"+grpList.get(position).getColor());
            Log.d(TAG,"grpList.get(position).isDefault:"+grpList.get(position).isDefault());
            Drawable mDrawable = createOvalDrawable(grpList.get(position)
                    .getGroupTitle(),grpList.get(position).getColor());
            /*TextDrawableTop textDrawable = new TextDrawableTop(grpList.get(
                    position).getGroupTitle());*/
            TextDrawableTop textDrawable;
            if(grpList.get(position).isDefault())
            {
                Log.d(TAG, "grpList.get(position).isDefault() if:"+grpList.get(position).isDefault());
                textDrawable = new TextDrawableTop(grpList.get(
                        position).getGroupTitle()+" Default");
                textDrawable.setColor(Color.parseColor("#f0bd5b"));
            }
            else
            {
                Log.d(TAG, "grpList.get(position).isDefault() else:"+grpList.get(position).isDefault());
                textDrawable = new TextDrawableTop(grpList.get(
                        position).getGroupTitle());
                textDrawable.setColor(mContext.getResources().getColor(
                    android.R.color.white));
            }
    
    
            textDrawable.setTextSize(32f);
    
            if(grpList.get(position).isDefault())
            {
                Log.d(TAG, "grpList.get(position).isDefault() if:"+grpList.get(position).isDefault());
                textDrawable.setColor(Color.parseColor("#f0bd5b"));
            }
            else
            {
                Log.d(TAG, "grpList.get(position).isDefault() else:"+grpList.get(position).isDefault());
                textDrawable.setColor(mContext.getResources().getColor(
                    android.R.color.white));
            }
            Drawable[] drawable;
            if(drawInnerText)
            {
                //Log.d(TAG,">drawInnerText>"+drawInnerText);
                TextDrawableCenter textDrawableCenter = new TextDrawableCenter("Save changes");
                textDrawableCenter.setTextSize(15f);                textDrawableCenter.setColor(mContext.getResources().getColor(android.R.color.white));
                drawable = new Drawable[] { textDrawable, mDrawable,textDrawableCenter };
            }
            else
            {
            drawable = new Drawable[] { textDrawable, mDrawable };
            }
    

    textDrawableCenter.setColor(mContext.getResources().getColor(android.R.color.holo_red_light)); LayerDrawable layerDrawable = new LayerDrawable(drawable); return layerDrawable; }

        private Drawable createOvalDrawable(String text,int color) {
            Log.d(TAG, "createOvalDrawable called:");
            ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());
                     shapeDrawable.getPaint().setColor(Color.parseColor(Util.getGroupColor(color)));
            return shapeDrawable;
        }
    }
    

    i m setting wheelView.setSelectedPosition(1); so it should select the item at index1 but this is not happening

    opened by engr-erum 3
  • app:repeatItems=

    app:repeatItems="false" causes crash

    When setting repeatItems to false, I get the below exception. Bug ? Or did I setup something wrong. I use the sample as a base, with same adapter and 40 items

    E/AndroidRuntime( 5803): java.lang.ArrayIndexOutOfBoundsException: length=40; index=-10 E/AndroidRuntime( 5803): at com.lukedeighton.wheelview.WheelView.onDraw(WheelView.java:971) E/AndroidRuntime( 5803): at android.view.View.draw(View.java:15231) E/AndroidRuntime( 5803): at android.view.View.updateDisplayListIfDirty(View.java:14167) E/AndroidRuntime( 5803): at android.view.View.getDisplayList(View.java:14189) E/AndroidRuntime( 5803): at android.view.View.draw(View.java:14959) E/AndroidRuntime( 5803): at android.view.ViewGroup.drawChild(ViewGroup.java:3405) E/AndroidRuntime( 5803): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3198) E/AndroidRuntime( 5803): at android.view.View.updateDisplayListIfDirty(View.java:14162) E/AndroidRuntime( 5803): at android.view.View.getDisplayList(View.java:14189) E/AndroidRuntime( 5803): at android.view.View.draw(View.java:14959) E/AndroidRuntime( 5803): at android.view.ViewGroup.drawChild(ViewGroup.java:3405)

    opened by hrstrand 3
  • CUSTOM PNGS OR IMAGES FOR WHEELVIEW ITEMS INSTEAD OF TEXT

    CUSTOM PNGS OR IMAGES FOR WHEELVIEW ITEMS INSTEAD OF TEXT

    How can i add custom images in background of each item in wheelview instead of texts like 1,2,3. untitled how to add png images instead of text like 1,2,3 in the above image.

    opened by sivaskvs 2
  • java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.VelocityTracker.recycle()' on a null object reference

    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.VelocityTracker.recycle()' on a null object reference

    The issue comes when i make swipe to close the wheel activity. I am reproduce it on Moto 360 1st generation. Have a next log: E/AndroidRuntime: FATAL EXCEPTION: main Process: com.bla.bla PID: 21940 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.VelocityTracker.recycle()' on a null object reference at com.lukedeighton.wheelview.WheelView.onTouchEvent(WheelView.java:931) at android.view.View.dispatchTouchEvent(View.java:9300) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2523) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2523) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254) at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2553) at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254) at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2403) at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1737) at android.app.Activity.dispatchTouchEvent(Activity.java:2771) at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2364) at android.view.View.dispatchPointerEvent(View.java:9520) at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4239) at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4105) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3650) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3703) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3669) at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3796) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3677) at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3853) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3650) at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3703) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3669) at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3677) at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3650) at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5933) at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5907) at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5868) at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6036) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method) at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:176) at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:6007) at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:6059) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858) at android.view.Choreographer.doCallbacks(Choreographer.java:670) at android.view.Choreographer.doFrame(Choreographer.java:600) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5422) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

    opened by AlexandroKurchenko 2
  • Error :  getMaterialColors

    Error : getMaterialColors

    Caused by: java.lang.IllegalArgumentException: Not a primitive field: com.android.tools.fd.runtime.IncrementalChange com.lukedeighton.wheelsample.R$color.$change at java.lang.reflect.Field.getInt(Native Method) at java.lang.reflect.Field.getInt(Field.java:460) at com.lukedeighton.wheelsample.MaterialColor.getMaterialColors(MaterialColor.java:27)

    opened by juamor86 2
  • Crashes when I directly return a drawable in the getDrawable()

    Crashes when I directly return a drawable in the getDrawable()

    I write this in the mainActiviy where the wheel is created

    
    wheelView.setAdapter(new WheelAdapter() {
                @Override
                public Drawable getDrawable(int position) {
                    return getResources().getDrawable(R.drawable.images)
    }
    @Override
    public int getCount() {
              return 10;
                }
    });
    

    It looks stable when left stationary but as soon as I try to rotate it, crashes

    Please do correct me if this is not the way the the adapter is expected to be created

    opened by codingant007 2
  • how to refresh wheelview by using adapter as we do in listview with notifyDataSetChanged ??

    how to refresh wheelview by using adapter as we do in listview with notifyDataSetChanged ??

    i m trying to use this code https://www.dropbox.com/s/ir4xkkbxz88lgp6/SampleWheelView.zip?dl=0 with little changes inside click listener

    wheelView.setOnWheelItemClickListener(new OnWheelItemClickListener() { @Override public void onWheelItemClick(WheelView parent, int position,boolean isSelected) { Toast.makeText(getApplicationContext(),String.format("%d", position), Toast.LENGTH_SHORT).show(); mModelList = new ArrayList(); Model model = new Model("5", "Text One"); mModelList.add(model); Model model1 = new Model("5", "+"); mModelList.add(model1); Model model2 = new Model("7", "This Two"); mModelList.add(model2); Model model3 = new Model("8", "+"); mModelList.add(model3); Model model4 = new Model("9", "Text Three"); mModelList.add(model4); Model model5 = new Model("10", "Text Three"); mModelList.add(model5); wheelView.setWheelItemCount(mModelList.size()); wheelView.setAdapter(new MaterialColorAdapter(getApplicationContext(),mModelList));

            }
        });
    

    but this is throwing error related to arraylist size why this is happening inside this library while aray i m going to provide to an array adapter is already have updated size @LukeDeighton @iffa

    opened by engr-erum 2
  • No rotaion

    No rotaion

    After run app I start rotating wheelview, but wheelview rotate only 0-5 radians and stopped. onWheelAngleChangeListener work fine, even when WheelView stopped

    opened by kovac777 1
  • Not Run in Android Studio 2.1

    Not Run in Android Studio 2.1

    FATAL EXCEPTION: main Process: com.lukedeighton.wheelsample, PID: 3692 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lukedeighton.wheelsample/com.lukedeighton.wheelsample.MainActivity}: java.lang.IllegalArgumentException: Not a primitive field: com.android.tools.fd.runtime.IncrementalChange com.lukedeighton.wheelsample.R$color.$change at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2303) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363) at android.app.ActivityThread.access$800(ActivityThread.java:147) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5234) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) Caused by: java.lang.IllegalArgumentException: Not a primitive field: com.android.tools.fd.runtime.IncrementalChange com.lukedeighton.wheelsample.R$color.$change at java.lang.reflect.Field.getInt(Native Method) at java.lang.reflect.Field.getInt(Field.java:460) at com.lukedeighton.wheelsample.MaterialColor.getMaterialColors(MaterialColor.java:27) at com.lukedeighton.wheelsample.MaterialColor.random(MaterialColor.java:39) at com.lukedeighton.wheelsample.MainActivity.onCreate(MainActivity.java:34) at android.app.Activity.performCreate(Activity.java:5982) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2256) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)  at android.app.ActivityThread.access$800(ActivityThread.java:147)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:135)  at android.app.ActivityThread.main(ActivityThread.java:5234)  at java.lang.reflect.Method.invoke(Native Method)  at java.lang.reflect.Method.invoke(Method.java:372)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) 

    opened by pinakgauswami 1
  • How to smooth rotate or disable empty wheel selection.

    How to smooth rotate or disable empty wheel selection.

    I have a wheel of a user's profile and its maximum have 8 items

    I want a solution for if the user has only 2 items and it scrolls to an empty item and when user touch release wheel smooth scroll to the last item.

    I want to disable empty items scroll for e.g. if have only 2 items scroll is between 0 to 90 Because I have maximum 8 items so 360/8 = 45 45 * 2 = 90

    Only one solution requires 1 or 2. Thank you.

    opened by vivekbdc 0
  • setBackgroundColor

    setBackgroundColor

    I used to add NinepatchDrwable as item but I need to add background color using wheelView.setSelectionColor(R.color.colorAccent) it add another color color

    why?

    opened by MagedAlNaamani 0
Owner
Luke Deighton
Luke Deighton
Custom wheel widget for android

Wheel widget for Android To include the wheel widget in the current layout, you should add in the layout xml this lines: <it.sephiroth.android

Alessandro Crugnola 384 Nov 21, 2022
Drag and drop to reorder items in a list, grid or board for Android. Based on RecyclerView. Also supports swiping items in a list.

DragListView DragListView can be used when you want to be able to re-order items in a list, grid or a board. It also supports horizontal swiping of it

Magnus Woxblom 658 Nov 30, 2022
Android View for displaying and selecting values in a circle-shaped View, with animations and touch gestures.

CircleDisplay Android View for displaying and selecting (by touch) values / percentages in a circle-shaped View, with animations. Features Core featur

Philipp Jahoda 287 Nov 18, 2022
Simple and fantastic wheel view in realistic effect for android.

Overview ![Size](https://img.shields.io/badge/Size-17 KB-e91e63.svg) Contact Preview Demo WheelPicke.APK Include Compile compile 'cn.aigestudio.wheelp

Aige 2.5k Jan 6, 2023
Just a Wheel——A easy way to setEmptyView to ListView、GridView or RecyclerView etc..

中文说明在这里 TEmptyView Just a Wheel—— A easier way to setEmptyView. Without having to write xml file every time. It supports AdapterView(ListView,GridView

Barry 454 Jan 9, 2023
Android library to display a list of items for pick one

PickerUI Android library to display a list of items for pick one with blur effect (if you wish). Support for Android 3.0 and up. It supports portrait

David Pizarro 630 Nov 19, 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 Dec 31, 2022
Spinner with searchable items.

SearchableSpinner Spinner with searchable items. Searchable Spinner is a dialog spinner with the search feature which allows to search the items loade

Mitesh Pithadiya 649 Dec 21, 2022
Overscroll any scrollable items!

ComposeOverscroll Overscroll any scrollable items! Preview compare with iOS demo Preview.for.overscroll.and.nested.invoke.mp4 How to use for column :

null 7 Dec 15, 2022
segmentcontrol widget for android

中文 a simple SegmentControl Widget 使用: 添加依赖到build.gradle: dependencies { compile 'com.7heaven.widgets:segmentcontrol:1.17' } 相关属性: selectedColor 设置

7heaven 614 Nov 26, 2022
Android Thermometer Widget.

Thermometer Android Thermometer Widget. Developer Kofi Gyan ([email protected]) License Copyright 2016 Kofi Gyan. Licensed under the Apache Licen

Kofi Gyan 125 Nov 17, 2022
Android Widget

Circular Counter Circular Counter is an Android Widget I needed to implement for an application I was developing. As it could be useful to more people

Diogo Bernardino 254 Nov 25, 2022
A Pin view widget for Android

PinView A Pin view widget for Android. PinView has a feature that allows you to find out when they have completed all parameters. Support for Android

David Pizarro 287 Nov 14, 2022
This is a sample Android Studio project that shows the necessary code to create a note list widget, And it's an implementation of a lesson on the Pluralsight platform, but with some code improvements

NoteKeeper-Custom-Widgets This is a sample Android Studio project that shows the necessary code to create a note list widget, And it's an implementati

Ibrahim Mushtaha 3 Oct 29, 2022
A library that provides an implementation of the banner widget from the Material design.

MaterialBanner A banner displays a prominent message and related optional actions. MaterialBanner is a library that provides an implementation of the

Sergey Ivanov 252 Nov 18, 2022
It's a flip way to show share widget.

What's FlipShare ? It's a cool way to show share widget. Demo Usage step 1. Confirm your parentView to locate the share widget, and then you can custo

巴掌 630 Sep 5, 2022
TabSlider - An expanding slider widget which displays selected value

TabSlider - An expanding slider widget which displays selected value

null 1 Apr 20, 2022
Android library used to create an awesome Android UI based on a draggable element similar to the last YouTube graphic component.

Draggable Panel DEPRECATED. This project is not maintained anymore. Draggable Panel is an Android library created to build a draggable user interface

Pedro Vicente Gómez Sánchez 3k Dec 6, 2022
TourGuide is an Android library that aims to provide an easy way to add pointers with animations over a desired Android View

TourGuide TourGuide is an Android library. It lets you add pointer, overlay and tooltip easily, guiding users on how to use your app. Refer to the exa

Tan Jun Rong 2.6k Jan 5, 2023