:octocat: ≑ DirectSelect is a selection widget with an ethereal, full-screen modal popup displaying the available choices when the widget is interact with.

Overview

DIRECT SELECT [JAVA]

Selection widget with an ethereal, full-screen modal popup displaying the available choices


We specialize in the designing and coding of custom UI for Mobile Apps and Websites.

Stay tuned for the latest updates:

Inspired by Virgil Pana shot

Requirements

  • Android 4.0 IceCreamSandwich (API lvl 14) or greater
  • Your favorite IDE

Installation

Just download the package from here and add it to your project classpath, or use it as dependency in your build tool:

  • Gradle:
'com.ramotion.directselect:direct-select:0.1.1'
  • SBT:
libraryDependencies += "com.ramotion.directselect" % "direct-select" % "0.1.1"
  • Maven:
<dependency>
	<groupId>com.ramotion.directselect</groupId>
	<artifactId>direct-select</artifactId>
	<version>0.1.1</version>
</dependency>

Basic usage

Basic usage assumes a simple configuration through xml layout without writing program code, but this doesn't provide the possibility to create cells with custom content layout for your lists and pickers. So, all you need is two elements in your layout:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:ds="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.ramotion.directselect.examples.basic.BasicExampleActivity">

   <com.ramotion.directselect.DSListView
        android:id="@+id/ds_picker"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/ds_list_bg"
        android:visibility="invisible"
        ds:cell_font_size="8sp"
        ds:data_array="@array/months"
        ds:picker_box_view="@id/picker_box"
        ds:scale_animations="true"
        ds:scale_animations_factor="1.3"
        ds:scale_animations_pivot_center="false"
        ds:selected_index="2"
        ds:selector_background="@color/ds_list_selector_bg" />

    <com.ramotion.directselect.DSDefaultPickerBox
        android:id="@+id/picker_box"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="260dp"
        android:background="@color/ds_picker_box_bg"
        android:padding="15dp" />

</FrameLayout>

DSListView represents a list with options for the picker that shows up when the user touches a DSDefaultPickerBox element and hides when the user removes his finger from the screen. DSListView has a couple of custom attributes, some of them are required, some not, here is a list:

  • data_array is a required reference to your selector options represented as array of strings in application resources.
  • picker_box_view is a required reference to implemented picker box element, you can use default implementation provided by the library DSDefaultPickerBox or you can implement your own as shown in the advanced usage example in this repository.
  • selector_background is a drawable or color responsible for a highlighting of selector position when DSListView is shown on the screen. Using the same background as in your PickerBox element you can achieve a pretty nice and clean effect.
  • scale_animations is a boolean that turns on/off scale animations of the selected item. Try it.
  • scale_animations_factor is a float value that defines max scale ratio for scaling animation
  • scale_animations_pivot_center is a boolean that moves pivot point of scale animations to center of your element instead of default left aligned position.
  • selected_index is an integer that represents initially selected option.

Advanced usage

Here everything is more complicated. Let's start from creating layout files.

  1. First of all we need to implement our custom cell layout, in separate xml file, eg advanced_example_country_cell.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/custom_cell_root"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_centerVertical="true">

   <ImageView
       android:id="@+id/custom_cell_image"
       android:layout_width="30dp"
       android:layout_height="30dp"
       android:layout_alignParentLeft="true"
       android:layout_alignParentStart="true"
       android:layout_centerVertical="true"
       android:layout_margin="10dp"
       android:contentDescription="@string/cell_image"
       android:scaleType="centerCrop" />

   <TextView
       android:id="@+id/custom_cell_text"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerVertical="true"
       android:layout_toEndOf="@id/custom_cell_image"
       android:layout_toRightOf="@id/custom_cell_image" />

</RelativeLayout>
  1. Now we need to create a layout for our cell in the list view, advanced_example_country_list_item.xml- it just wraps our newly created cell with FrameLayout for correct element animations and positioning inside the list view.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    android:clipToPadding="false"
    android:paddingLeft="20dp"
    android:paddingRight="20dp">

    <include
        layout="@layout/advanced_example_country_cell"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</FrameLayout>
  1. Third step - creation of our custom picker box layout, a new file named advanced_example_country_picker_box.xml that contains our custom cell layout, and inserts an additional custom elements that must appear only in picker box, like the direction arrows in our example.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/ds_bg_picker_box"
    android:paddingLeft="20dp"
    android:paddingRight="20dp">

    <include
        layout="@layout/advanced_example_country_cell"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content" />

    <ImageView
        android:id="@+id/picker_box_arrows"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:layout_marginEnd="10dp"
        android:layout_marginRight="10dp"
        android:alpha="0.25"
        android:contentDescription="@string/picker_box_arrows_icon"
        android:scaleType="fitCenter"
        android:src="@drawable/ds_picker_box_arrows" />

</RelativeLayout>
  1. Finally, we need to write some code. First of all - we need to prepare a dataset, our cell contains two items - a title and image, so we can't use the default data_array attribute from the basic example. Our structure can be represented by plain old java object with two appropriate fields.
public class AdvancedExampleCountryPOJO {
    private String title;
    private int icon;

    public AdvancedExampleCountryPOJO(String title, int icon) {
        this.title = title;
        this.icon = icon;
    }

    public static List<AdvancedExampleCountryPOJO> getExampleDataset() {
        return Arrays.asList(
                new AdvancedExampleCountryPOJO("Russian Federation", R.drawable.ds_countries_ru),
                new AdvancedExampleCountryPOJO("Canada", R.drawable.ds_countries_ca),
                new AdvancedExampleCountryPOJO("United States of America", R.drawable.ds_countries_us),
                new AdvancedExampleCountryPOJO("China", R.drawable.ds_countries_cn),
                new AdvancedExampleCountryPOJO("Brazil", R.drawable.ds_countries_br),
                new AdvancedExampleCountryPOJO("Australia", R.drawable.ds_countries_au),
                new AdvancedExampleCountryPOJO("India", R.drawable.ds_countries_in),
                new AdvancedExampleCountryPOJO("Argentina", R.drawable.ds_countries_ar),
                new AdvancedExampleCountryPOJO("Kazakhstan", R.drawable.ds_countries_kz),
                new AdvancedExampleCountryPOJO("Algeria", R.drawable.ds_countries_dz)
        );
    }

    // getters, setters, equal, hashcode, etc.
}
  1. Now, to more complex things - we need to somehow provide our dataset to DSListView, for this purpose in Android we have a android.widget.ArrayAdapter class, so we need a custom implementation to map data from our POJO to the actual cell described earlier:
public class AdvancedExampleCountryAdapter extends ArrayAdapter<AdvancedExampleCountryPOJO> {
    private List<AdvancedExampleCountryPOJO> items;
    private Context context;

    public AdvancedExampleCountryAdapter(@NonNull Context context, int resource, @NonNull List<AdvancedExampleCountryPOJO> objects) {
        super(context, resource, objects);
        this.items = objects;
        this.context = context;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        AdvancedExampleCountryAdapter.ViewHolder holder;

        if (null == convertView) {
            LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            assert vi != null;
            convertView = vi.inflate(R.layout.advanced_example_country_list_item, parent, false);
            holder = new AdvancedExampleCountryAdapter.ViewHolder();
            holder.text = convertView.findViewById(R.id.custom_cell_text);
            holder.icon = convertView.findViewById(R.id.custom_cell_image);
            convertView.setTag(holder);
        } else {
            holder = (AdvancedExampleCountryAdapter.ViewHolder) convertView.getTag();
        }
        if (null != holder) {
            holder.text.setText(items.get(position).getTitle());
            holder.icon.setImageResource(items.get(position).getIcon());
        }
        return convertView;
    }

    private class ViewHolder {
        TextView text;
        ImageView icon;
    }
}
  1. Almost done, but before we put it all together, there is one more thing. We almost forgot about our custom picker box to map the selected cell from the list view to the actual displayed picker. So, we need to implement simple view that inflates our layout for the picker box described earlier. To guarantee correctness, work must extend the DSAbstractPickerBox class and implement some abstract methods:
public class AdvancedExampleCountryPickerBox extends DSAbstractPickerBox<AdvancedExampleCountryPOJO> {
    private TextView text;
    private ImageView icon;
    private View cellRoot;

    public AdvancedExampleCountryPickerBox(@NonNull Context context) {
        this(context, null);
    }

    public AdvancedExampleCountryPickerBox(@NonNull Context context,
										   @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public AdvancedExampleCountryPickerBox(@NonNull Context context,
										   @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(@NonNull Context context) {
        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        assert mInflater != null;
        mInflater.inflate(R.layout.advanced_example_country_picker_box, this, true);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        this.text = findViewById(R.id.custom_cell_text);
        this.icon = findViewById(R.id.custom_cell_image);
        this.cellRoot = findViewById(R.id.custom_cell_root);
    }

    @Override
    public void onSelect(AdvancedExampleCountryPOJO selectedItem, int selectedIndex) {
        this.text.setText(selectedItem.getTitle());
        this.icon.setImageResource(selectedItem.getIcon());
    }

    @Override
    public View getCellRoot() {
        return this.cellRoot;
    }
}
  1. Finally - put all parts together in the main activity layout and write some code in MainActivity:
public class AdvancedExampleActivity extends AppCompatActivity {

    @SuppressLint("ClickableViewAccessibility")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.advanced_example_activity);

		// Prepare dataset
        List<AdvancedExampleCountryPOJO> exampleDataSet = AdvancedExampleCountryPOJO.getExampleDataset();

		// Create adapter with our dataset
        ArrayAdapter<AdvancedExampleCountryPOJO> adapter = new AdvancedExampleCountryAdapter(
                this, R.layout.advanced_example_country_list_item, exampleDataSet);

		// Set adapter to our DSListView
        DSListView<AdvancedExampleCountryPOJO> pickerView = findViewById(R.id.ds_county_list);
        pickerView.setAdapter(adapter);

    }
}

That's all. There are still some unmentioned features, like the possibility to change the size and position of the list view and the possibility to change default cell text appearance through cell-font-size settings or through applying your custom style. Full examples with some comments and explanations can be found in this repository. Feel free to report bugs and ask questions.


πŸ“„ License

Direct Select Android is released under the MIT license. See LICENSE for details.

This library is a part of a selection of our best UI open-source projects

If you use the open-source library in your project, please make sure to credit and backlink to www.ramotion.com

πŸ“± Get the Showroom App for Android to give it a try

Try this UI component and more like this in our Android app. Contact us if interested.

Comments
  • Unable showcase data which is from restful api or SQLLite

    Unable showcase data which is from restful api or SQLLite

    we are trying to populate the list of drop down options from a restful api or sqlite. It show the following error.

    rocess: com.ramotion.directselect.examples.advenced, PID: 23396
        java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.widget.ArrayAdapter.getItem(int)' on a null object reference
            at com.ramotion.directselect.DSListView.hideListView(DSListView.java:224)
            at com.ramotion.directselect.DSListView.access$200(DSListView.java:36)
            at com.ramotion.directselect.DSListView$3.onTouch(DSListView.java:313)
            at android.view.View.dispatchTouchEvent(View.java:9941)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2666)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2344)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2672)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2672)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2672)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2672)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2672)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2672)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2358)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2672)
    
    
    public void getData(){
            StringRequest stringRequest = new StringRequest(url, new com.android.volley.Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    GsonBuilder gsonBuilder = new GsonBuilder();
                    Gson gson = gsonBuilder.create();
                    Type listType = new TypeToken<List<ManFact>>(){}.getType();
                    List<ManFact> manFacts = (List<ManFact>) gson.fromJson(response, listType);
                    if(response.length()==0){
                        // Toast.makeText(,"No result",Toast.LENGTH_SHORT).show();
                    }else {
                        try {
                            for (ManFact man : manFacts) {
    
                                impList = Arrays.asList(
                                        new AdvancedExampleCountryPOJO(man.getName(),R.drawable.ic_launcher_background)
                                );
                                stringArray.add(man.getName());
                                sqlUtil.addProduct(new AdvancedExampleCountryPOJO(man.getName(),R.drawable.ic_launcher_background));
                            }
                            ArrayAdapter<AdvancedExampleCountryPOJO> adapter = new AdvancedExampleCountryAdapter(
                                    AdvancedExampleActivity.this, R.layout.advanced_example_country_list_item, sqlUtil.getAllProductList());
    
                            // Set adapter to our DSListView
                            DSListView<AdvancedExampleCountryPOJO> pickerView = findViewById(R.id.ds_county_list);
                            pickerView.setAdapter(adapter);
                        } catch (Exception e) {
                            e.printStackTrace();
                            //oast.makeText(context, e.toString(), Toast.LENGTH_SHORT).show();
                        }
                    }
    
                }
            }, new com.android.volley.Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    if (error == null) {
                        //Toast.makeText(context,"No Internet",Toast.LENGTH_LONG).show();
    
                    }
                }
            });
            RequestQueue requestQueue = Volley.newRequestQueue(this);
            requestQueue.add(stringRequest);
        }
    
    opened by jeevan-antariksh 3
  • How to get selected item's Name(Value)?

    How to get selected item's Name(Value)?

    I am about to change the array of the second Direct-Select according to my selection in the first Direct-Select. I tried to send the selected value from 'onSelect' of the PickerBox class to the main class. then, Second Direct-Select doesn't change & occur error message . Could you give me a hint?

    I'm on this Error 2020-04-06 01:38:56.408 22110-22110/com.ramotion.directselect.examples.advenced E/AndroidRuntime: FATAL EXCEPTION: main Process: com.ramotion.directselect.examples.advenced, PID: 22110 java.lang.IllegalStateException: System services not available to Activities before onCreate() at android.app.Activity.getSystemService(Activity.java:6136) at android.view.LayoutInflater.from(LayoutInflater.java:229) at android.widget.ArrayAdapter.(ArrayAdapter.java:212) at android.widget.ArrayAdapter.(ArrayAdapter.java:206) at android.widget.ArrayAdapter.(ArrayAdapter.java:192) at com.ramotion.directselect.examples.advanced.AdvancedExampleCountryAdapter.(AdvancedExampleCountryAdapter.java:22)

    question 
    opened by ZHENAnet 1
  • Arithmatic Exception When Multiple DefaltPicker Implemented in same layout

    Arithmatic Exception When Multiple DefaltPicker Implemented in same layout

    It gives runtime error when implement more than 1 basic default picker in same activity. Here is log:

    java.lang.ArithmeticException: divide by zero at com.ramotion.directselect.DSListView.onWindowFocusChanged(DSListView.java:173) at android.view.View.dispatchWindowFocusChanged(View.java:13688) at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1480) at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1484) at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1484) at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1484) at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1484) at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1484) at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1484) at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:1484) at android.view.ViewRootImpl.handleWindowFocusChanged(ViewRootImpl.java:2870) at android.view.ViewRootImpl.access$1100(ViewRootImpl.java:142) at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:4533) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:214) at android.app.ActivityThread.main(ActivityThread.java:7356) 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:930)

    opened by jinkalpatelshivalik 1
  • not getting index no

    not getting index no

    I an tankful to the ramotion team who made this project open source because it is wonderful.

    but i am getting a problem that i am not getting the index no of selected item programmatically in the basic codes so please help me i will be very thankful to you............

    opened by viskum 1
  • different data_array set programmatically

    different data_array set programmatically

    how can I set different ds:data_array lists in DSListView according to user need. I have eighteen chapters in one DSListView by list and each chapter has a different array list. I want to give the array list to that particular chapter selected by the user.

    question 
    opened by venkat8995 1
  • Crashing while choosing the last element in the basic list

    Crashing while choosing the last element in the basic list "DSListView"

    DSListView stringDSListView; stringDSListView = findViewById(R.id.ds_sport_list);

        ArrayList<String> al = new ArrayList<>();
        al.add("umar");
        al.add("akshay");
        al.add("arun");
    
        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line,al);
        stringDSListView.setAdapter(arrayAdapter);
    

    This is the code and following is the logcat :

    java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 at java.util.ArrayList.get(ArrayList.java:437) at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:394) at com.ramotion.directselect.DSListView.hideListView(DSListView.java:225) at com.ramotion.directselect.DSListView.access$200(DSListView.java:37) at com.ramotion.directselect.DSListView$4.run(DSListView.java:411) 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:7711) 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)

    opened by Umarlovesall 0
Owner
Ramotion
UI Engineering, UI/UX Design and Front-End Development Agency
Ramotion
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
Animated-splash-screen - Animate your Splash Screen using Lottie files.

Animated Splash Screen This small project shows how you can add animation into your android projects or create beautiful looking Splash Screen or Laun

Aashish Ace 0 Jan 2, 2022
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
Chandrasekar Kuppusamy 799 Nov 14, 2022
Shake screen animation workplace

shake-screen-compose-playground Shake screen animation workplace Playground for a shake screen animation. Created new Animatable so Offset can be anim

Greg Kluska 2 Feb 14, 2022
Android - A ListView adapter with support for multiple choice modal selection

MultiChoiceAdapter MultiChoiceAdapter is an implementation of ListAdapter which adds support for modal multiple choice selection as in the native Gmai

Manuel Peinado Gallego 855 Nov 11, 2022
Big image viewer supporting pan and zoom, with very little memory usage and full featured image loading choices. Powered by Subsampling Scale Image View, Fresco, Glide, and Picasso. Even with gif and webp support! 🍻

BigImageViewer Big image viewer supporting pan and zoom, with very little memory usage and full featured image loading choices. Powered by Subsampling

Piasy 3.9k Dec 30, 2022
πŸš€πŸžπŸ’ͺ Collection of Images, Modifiers, utility functions for Jetpack Compose to expand and enrich displaying, manipulating, scaling, resizing, zooming, and getting cropped ImageBitmap based on selection area

Collection of Images, Modifiers, utility functions for Jetpack Compose to expand and enrich displaying, manipulating, scaling, resizing, zooming, and getting cropped ImageBitmap based on selection area, before/after image to with handle to show partial of both images and more is cooking up

Smart Tool Factory 207 Dec 26, 2022
Modal Sheet library for Jetpack Compose

Modal Sheet Modal Sheet library for Jetpack Compose. Motivation Sometimes we want bottom sheets to behave as real modals, thus overlaying all content

Oleksandr Balan 51 Dec 25, 2022
Twidere-Android Twidere is a powerful twitter client for Android 1.6+ 1 , which gives you a full Holo experience and nearly full Twitter's feature.

Twidere for Android Material Design ready and feature rich Twitter/Mastodon/Fanfou app for Android 4.1+. Enjoy Fediverse now! Twidere-Android is maint

Twidere Project 2.7k Jan 2, 2023
Proof of concept of custom widgets and apps running on the Z Flip3 cover screen. Adds a widget to Z Flip3 cover screen that lets you launch a web browser-like app on the cover.

SubUI-browser Proof of concept of custom widgets and apps running on the Z Flip3 cover screen. Adds a widget to Z Flip3 cover screen that lets you lau

null 35 Dec 24, 2022
:octocat: Navigation toolbar is a slide-modeled UI navigation controller made by @Ramotion

NAVIGATION TOOLBAR Navigation toolbar is a Kotlin slide-modeled UI navigation controller. We specialize in the designing and coding of custom UI for M

Ramotion 804 Dec 9, 2022
:octocat: Drawable of badge.

Badge Preview Integration Add the JitPack repository to your root build.gradle: repositories { maven { url "https://jitpack.io" } } Add the depend

nekocode 952 Dec 8, 2022
:octocat: A demo project based on MVVM architecture and material design & animations.

GithubFollows A simple demo project based on MVVM clean architecture and material design & animations. Architecture Specs & Open-source libraries Mini

Jaewoong Eum 288 Dec 25, 2022
:octocat: πŸ“ƒ FoldingCell is a material design expanding content cell inspired by folding paper material made by @Ramotion

FOLDING CELL [JAVA] Expanding content cell with animation inspired by folding paper card material design. We specialize in the designing and coding of

Ramotion 4.9k Dec 7, 2022
:octocat: A demo project based on MVVM architecture and material design & animations.

GithubFollows A simple demo project based on MVVM clean architecture and material design & animations. Architecture Specs & Open-source libraries Mini

Jaewoong Eum 289 Jan 4, 2023
An Android Jetpack Compose library for displaying on-screen messages

InfoBar Compose An Android Jetpack Compose library for displaying on-screen messages. Unlike the built-in Snackbar from the Compose Material library,

Radu Salagean 78 Dec 20, 2022
A simple and customizable Android full-screen image viewer with shared image transition support, "pinch to zoom" and "swipe to dismiss" gestures

Stfalcon ImageViewer A simple and customizable full-screen image viewer with shared image transition support, "pinch to zoom" and "swipe to dismiss" g

Stfalcon LLC 1.9k Jan 5, 2023
Customizable Android full screen image viewer for Fresco library supporting "pinch to zoom" and "swipe to dismiss" gestures. Made by Stfalcon

This project is no longer supported. If you're able to switch from Fresco to any other library that works with the Android's ImageView, please migrate

Stfalcon LLC 1.8k Dec 19, 2022
Customizable Android full screen image viewer for Fresco library supporting "pinch to zoom" and "swipe to dismiss" gestures. Made by Stfalcon

This project is no longer supported. If you're able to switch from Fresco to any other library that works with the Android's ImageView, please migrate

Stfalcon LLC 1.8k Dec 19, 2022