Custom android music player view.

Overview

InteractivePlayerView

Join the chat at https://gitter.im/iammert/InteractivePlayerView Android Arsenal

Custom android music player view.

Screen

Check it on youtube

Usage(XML)

Define it in your xml file.

 <co.mobiwise.library.InteractivePlayerView
            android:id="@+id/ipv"
            android:layout_width="230dp"
            android:layout_height="230dp"
            app:imageCover="@drawable/imagetest"
            app:emptyColor="#aaffffff"
            app:loadedColor="#fff44336"
            app:selectedAction1="@drawable/shuffle_selected"
            app:selectedAction2="@drawable/like_selected"
            app:selectedAction3="@drawable/replay_selected"
            app:unselectedAction1="@drawable/shuffle_unselected"
            app:unselectedAction2="@drawable/like_unselected"
            app:unselectedAction3="@drawable/replay_unselected" />

IMPORTANT : I designed shuffle, like and replay icons for my demo app. You can create your by using Flat Icon website. Or, if you want to use mine instead of creating new icon set, then you can download my action set from here.

Find view and set necessary values.

InteractivePlayerView ipv = (InteractivePlayerView) findViewById(R.id.ipv);
ipv.setMax(123); // music duration in seconds.
ipv.setOnActionClickedListener(new OnActionClickedListener() {
            @Override
            public void onActionClicked(int id) {
                switch (id){
                    case 1:
                        //Called when 1. action is clicked.
                        break;
                    case 2:
                        //Called when 2. action is clicked.
                        break;
                    case 3:
                        //Called when 3. action is clicked.
                        break;
                    default:
                        break;
                }
            }
        });

Start and stop depends on your player.

ipv.start();
ipv.stop();

Usage (Java)

ipv.setCoverDrawable(R.drawable.imagetest);
ipv.setActionOneImage(R.drawable.shuffle_selected, R.drawable.shuffle_unselected);
ipv.setActionTwoImage(R.drawable.like_selected, R.drawable.like_unselected);
ipv.setActionThreeImage(R.drawable.replay_selected, R.drawable.replay_unselected);
ipv.setProgressEmptyColor(Color.GRAY);
ipv.setProgressEmptyColor(Color.BLACK);

Useful methods

//Loads image from url (By Picasso)
ipv.setCoverURL("http://abc.xyz/1.png");
//edit your current progress
ipv.setProgress(12);
int currentProgress = ipv.getProgress();
//Check if any action selected or not. Or edit.
boolean isSelected = ipv.isAction1Selected();
ipv.setAction1Selected(true);
//Check if ipv is playing
ipv.isPlaying();

Import

Project build.gradle

repositories {
    maven {
        url "https://jitpack.io"
    }
}

Module build.gradle

dependencies {
	   compile 'com.github.iammert:InteractivePlayerView:f4f6490290'
}

Design

Here is original design

Library used

Picasso by Square

License

Copyright 2015 Mert Şimşek.

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.
You might also like...
Android View for displaying and selecting values in a circle-shaped View, with animations and touch gestures.
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

FloatingView can make the target view floating above the anchor view with cool animation
FloatingView can make the target view floating above the anchor view with cool animation

FloatingView FloatingView can make the target view floating above the anchor view with cool animation Links 中文版 README Blog about FloatingView demo.ap

用于做Path动画的自定义View。 I have a path.I have a view. (Oh~),Path(Anim)View.
用于做Path动画的自定义View。 I have a path.I have a view. (Oh~),Path(Anim)View.

PathAnimView 用于做Path动画的自定义View。 I have a path.I have a view. (Oh~),Path(Anim)View. 现已经找到图片-SVG-PATH的正确姿势, Now i have a pic.I have a view. Oh~,Path(A

Useful library to use custom fonts in your android app
Useful library to use custom fonts in your android app

EasyFonts A simple and useful android library to use custom fonts in android apps without adding fonts into asset/resource folder.Also by using this l

Android Library for Custom Switches.
Android Library for Custom Switches.

Android Library for Custom Switches.

Custom wheel widget for android
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

IconicDroid is a custom Android Drawable which allows to draw icons from several iconic fonts.
IconicDroid is a custom Android Drawable which allows to draw icons from several iconic fonts.

IconicDroid IconicDroid is a custom Android Drawable which allows to draw icons from several iconic fonts. Try out the sample application on the Googl

Set custom font in Android application

MagicViews Provides a simple way to set custom font in Android application. Adding to your project Add the library as a dependency to your build.gradl

Custom UI control for android which is showing data as a segments and a value inside them.
Custom UI control for android which is showing data as a segments and a value inside them.

Segmented Bar View for Android Custom UI control for android which is showing data as a segments and a value inside them. Screenshots Install From rep

Comments
  • setCoverDrawable and API level <= 21

    setCoverDrawable and API level <= 21

    Hi ! There is an error on the "getDrawable" call in your method "setCoverDrawable". I fixed it on my fork by adding "getResources" right before "getDrawable", but it looks like the fix doesn't take effect ... Could you fix it on your repo ?

    Thanks !

    Théo

    opened by DubiousCactus 4
  • App crashing

    App crashing "UncaughtException: java.lang.ArithmeticException: divide by zero"

    Bro, My app is crashing whenever i open the activity contains InteractivePlayerView.

    My logcat shows.

    malankaraapp E/UncaughtException: java.lang.ArithmeticException: divide by zero
                                                                                            at co.mobiwise.library.InteractivePlayerView.calculatePastProgress(InteractivePlayerView.java:769)
                                                                                            at co.mobiwise.library.InteractivePlayerView.onDraw(InteractivePlayerView.java:517)
                                                                                            at android.view.View.draw(View.java:15246)
                                                                                            at android.view.View.updateDisplayListIfDirty(View.java:14182)
                                                                                            at android.view.View.getDisplayList(View.java:14204)
                                                                                            at android.view.View.draw(View.java:14974)
                                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                            at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                            at android.view.View.getDisplayList(View.java:14204)
                                                                                            at android.view.View.draw(View.java:14974)
                                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                            at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                            at android.view.View.getDisplayList(View.java:14204)
                                                                                            at android.view.View.draw(View.java:14974)
                                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                            at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                            at android.view.View.getDisplayList(View.java:14204)
                                                                                            at android.view.View.draw(View.java:14974)
                                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                            at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                            at android.view.View.getDisplayList(View.java:14204)
                                                                                            at android.view.View.draw(View.java:14974)
                                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                            at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                            at android.view.View.getDisplayList(View.java:14204)
                                                                                            at android.view.View.draw(View.java:14974)
                                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                            at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                            at android.view.View.getDisplayList(View.java:14204)
                                                                                            at android.view.View.draw(View.java:14974)
                                                                                            at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                            at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                            at android.view.View.draw(View.java:15249)
                                                                                            at android.widget.FrameLayout.draw(FrameLayout.java:598)
                                                                                            at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2667)
                                                                                            at android.view.View.updateDisplayListIfDirty(View.java:14182)
                                                                                            at android.view.View.getDisplayList(View.java:14204)
                                                                                            at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
                                                                                            at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)
                                                                                            at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)
                                                                                            at android.view.ViewRootImpl.draw(ViewRootImpl.java:2531)
                                                                                            at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2353)
                                                                                            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1983)
                                                                                            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
                                                                                            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5896)
                                                                                            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
                                                                                            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
                                                                                            at android.view.Choreographer.doFrame(Choreographer.java:550)
                                                                                            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
                                                                                            at android.os.Handler.handleCallback(Handler.java:739)
                                                                                            at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                            at android.os.Looper.loop(Looper.java:135)
                                                                                            at android.app.ActivityThread.main(ActivityThread.java:5351)
                                                                                            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:947)
                                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)
    11-03 11:30:58.763 22112-22512/com.root5solutions.malankaraapp D/FA: Logging event (FE): _ae, Bundle[{_o=crash, _sc=Player, _si=-6119479215985674536, timestamp=1478152858750, fatal=1}]
    11-03 11:30:58.973 22112-22112/com.root5solutions.malankaraapp D/FirebaseCrashApiImpl: throwable java.lang.ArithmeticException: divide by zero
    11-03 11:30:59.073 22112-22710/com.root5solutions.malankaraapp D/FirebaseCrash: Saving crash
    11-03 11:30:59.113 22112-22112/com.root5solutions.malankaraapp E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                     Process: com.root5solutions.malankaraapp, PID: 22112
                                                                                     java.lang.ArithmeticException: divide by zero
                                                                                         at co.mobiwise.library.InteractivePlayerView.calculatePastProgress(InteractivePlayerView.java:769)
                                                                                         at co.mobiwise.library.InteractivePlayerView.onDraw(InteractivePlayerView.java:517)
                                                                                         at android.view.View.draw(View.java:15246)
                                                                                         at android.view.View.updateDisplayListIfDirty(View.java:14182)
                                                                                         at android.view.View.getDisplayList(View.java:14204)
                                                                                         at android.view.View.draw(View.java:14974)
                                                                                         at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                         at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                         at android.view.View.getDisplayList(View.java:14204)
                                                                                         at android.view.View.draw(View.java:14974)
                                                                                         at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                         at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                         at android.view.View.getDisplayList(View.java:14204)
                                                                                         at android.view.View.draw(View.java:14974)
                                                                                         at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                         at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                         at android.view.View.getDisplayList(View.java:14204)
                                                                                         at android.view.View.draw(View.java:14974)
                                                                                         at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                         at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                         at android.view.View.getDisplayList(View.java:14204)
                                                                                         at android.view.View.draw(View.java:14974)
                                                                                         at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                         at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                         at android.view.View.getDisplayList(View.java:14204)
                                                                                         at android.view.View.draw(View.java:14974)
                                                                                         at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                         at android.view.View.updateDisplayListIfDirty(View.java:14177)
                                                                                         at android.view.View.getDisplayList(View.java:14204)
                                                                                         at android.view.View.draw(View.java:14974)
                                                                                         at android.view.ViewGroup.drawChild(ViewGroup.java:3453)
                                                                                         at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3240)
                                                                                         at android.view.View.draw(View.java:15249)
                                                                                         at android.widget.FrameLayout.draw(FrameLayout.java:598)
                                                                                         at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2667)
                                                                                         at android.view.View.updateDisplayListIfDirty(View.java:14182)
                                                                                         at android.view.View.getDisplayList(View.java:14204)
                                                                                         at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:273)
                                                                                         at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:279)
                                                                                         at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:318)
                                                                                         at android.view.ViewRootImpl.draw(ViewRootImpl.java:2531)
                                                                                         at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2353)
                                                                                         at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1983)
                                                                                         at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
                                                                                         at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5896)
                                                                                         at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
                                                                                         at android.view.Choreographer.doCallbacks(Choreographer.java:580)
                                                                                         at android.view.Choreographer.doFrame(Choreographer.java:550)
                                                                                         at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
                                                                                         at android.os.Handler.handleCallback(Handler.java:739)
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                         at android.os.Looper.loop(Looper.java:135)
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:5351)
                                                                                         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:947)
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)
    

    My code for music player is:

    import android.media.AudioManager;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.util.Log;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.io.IOException;
    
    import co.mobiwise.library.InteractivePlayerView;
    import co.mobiwise.library.OnActionClickedListener;
    
    
    public class Player extends AppCompatActivity implements OnActionClickedListener {
        MediaPlayer mMediaPlayer;
        InteractivePlayerView ipv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_player);
            Bundle b = new Bundle();
            b = getIntent().getExtras();
            final String url = b.getString("audio");
            Log.e("URL: ", url);
            ipv = (InteractivePlayerView) findViewById(R.id.ipv);
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.reset();
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    
    
            //mp3 will be started after completion of preparing...
            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
    
                @Override
                public void onPrepared(MediaPlayer player) {
                    int max = mMediaPlayer.getDuration();
                    Log.e("MAX", String.valueOf(max));
                    player.start();
    //                ipv.setMax(100);
    //                ipv.setProgress(0);
                    Log.e("start: ", url);
                }
    
            });
    
            ipv.setOnActionClickedListener(this);
    
            final ImageView control = (ImageView) findViewById(R.id.control);
            control.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(!ipv.isPlaying()){
                        ipv.start();
                        try {
                            Log.e("preparing: ", url);
                            mMediaPlayer.setDataSource(url);
                            mMediaPlayer.prepareAsync(); // might take long! (for buffering, etc)
                        } catch (IOException e) {
                            Toast.makeText(getApplicationContext(), "mp3 not found", Toast.LENGTH_SHORT).show();
                            e.printStackTrace();
                        }
                        control.setBackgroundResource(R.drawable.pause);
                    }
                    else{
                        ipv.stop();
                        control.setBackgroundResource(R.drawable.play);
                    }
                }
            });
    
        }
        @Override
        public void onActionClicked(int id) {
            switch (id){
                case 1:
                    //Called when 1. action is clicked.
                    break;
                case 2:
                    //Called when 2. action is clicked.
                    break;
                case 3:
                    //Called when 3. action is clicked.
                    break;
                default:
                    break;
            }
        }
    
        @Override
        public void onBackPressed() {
            mMediaPlayer.release();
            finish();
        }
    }
    
    
    

    Can you pls help me to figure it out.

    If you provide a working code with mediaplayer basic controls like play ,pause and update seekbar , It will be a great help for those who like to work with your Player View.

    opened by rubinnellikunnathu 1
  • music progress time shows random numbers

    music progress time shows random numbers

    First of all i liked your player view very much, but when i tried to implement it, im getting some problems. In my player when i tried to to the music progress time , when the music starts ,player shows some random numbers as time. Can you pls help me to fix this : * this is my screenshot* screenshot_2016-09-24-13-29-41

    my code used is :

      ipv = (InteractivePlayerView) v.findViewById(R.id.ipv);
            mPlayer = MediaPlayer.create(getContext(), R.raw.music);//Create MediaPlayer object with MP3 file under res/raw folder
            ipv.setMax(mPlayer.getDuration());
            ipv.setOnActionClickedListener(this);
    
            final ImageView control = (ImageView) v.findViewById(R.id.control);
            control.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mPlayer != null && !ipv.isPlaying()) {
                        ipv.start();
                        mPlayer.start();//Start playing the music
                       final Handler handler = new Handler();
                        Runnable runnable = new Runnable() {
    
                            @Override
                            public void run() {
    //                            while (mPlayer != null && currentPosition < total) {
                                try{
                                    ipv.setProgress(mPlayer.getCurrentPosition());
                                    //do your code here
                                }
                                catch (Exception e) {
                                    // TODO: handle exception
                                }
                                finally{
                                    //also call the same runnable to call it at regular interval
                                    handler.postDelayed(this, 1000);
    //                            }
                            }}
                        };
                        handler.postDelayed(runnable, 1000);
                        control.setBackgroundResource(R.drawable.pause);
                    } else {
                        ipv.stop();
                        if (mPlayer != null && mPlayer.isPlaying()) {//If music is playing already
                            mPlayer.pause();//Stop playing the music
                            control.setBackgroundResource(R.drawable.play);
                        }
                    }
                }
            });
    
    opened by rubinnellikunnathu 4
  • add dynamically

    add dynamically

    hello, i want to add your view ,dynamically.

    InteractivePlayerView cmp2 = new InteractivePlayerView(ReadActivity.this); cmp2.setCoverDrawable(R.mipmap.no_wifi); ll.addView(cmp2);

    but not work

    opened by abbasalim 0
Owner
Mert Şimşek
Software Engineer
Mert Şimşek
This library provides a simple way to add a draggable sliding up panel (popularized by Google Music and Google Maps) to your Android application. Brought to you by Umano.

Note: we are not actively responding to issues right now. If you find a bug, please submit a PR. Android Sliding Up Panel This library provides a simp

Umano: News Read To You 9.4k Dec 31, 2022
A beautiful Android custom View that works similar to a range or seekbar. With animations.

ValueBar A beautiful Android custom View that works similar to a range or seekbar. Selection by gesture. With animations. Supporting API level 11+. De

Philipp Jahoda 147 Nov 20, 2022
An android custom view that displays a circle with a colored arc given a mark

MarkView An android custom view that displays a circle with a colored arc given a mark. Usage Add as a dependency compile 'com.github.xiprox.markv

İhsan Işık 200 Nov 25, 2022
This is a android custom view , like a scratch card effect!

ScratchView This is a android custom view , like a scratch card effect! Last Update 采纳DearZack童鞋的优化思路,把计算擦除面积比例的操作放在手指离开屏幕时,以降低对CPU的占用。 Articles Scrat

D_clock爱吃葱花 316 Nov 29, 2022
An Android custom view to display digits rendered as dots in a grid, with a style like a 1970s LED clock.

#DotMatrixView This is an Android library project providing a custom view that can display things on a grid of dots. When the displayed value changes,

Mark Roberts 48 Apr 21, 2022
NumberPickerView - Custom Android View to provide a user friendly way of picking numbers. 🧪

?? Custom view for Android which provides a modern design and gestures for picking numbers in a user friendly way.

Mirkamal 6 Feb 16, 2022
(Deprecated) A custom view component that mimics the new Material Design Bottom Navigation pattern.

BottomBar (Deprecated) I don't have time to maintain this anymore. I basically wrote the whole library in a rush, without tests, while being a serious

Iiro Krankka 8.4k Dec 29, 2022
a custom view that provides dragged and scaled

DragScaleCircleView A custom imageview that provides the circle window can be dragged and scaled, crop image. How does it look? Why? Sometimes need to

null 514 Dec 22, 2022
A custom view, in which device contact list is displayed

Getting Started This repository contains a custom view, in which device contact list is displayed Implementation Go to Settings.gradle, inside reposit

Ankit Kumar 2 May 7, 2022
A player/ recorder visualizer with the swipe to seek functionality.

iiVisu A player/ recorder visualizer with the swipe to seek functionality. Demo Setup Step 1. Add the JitPack repository to your build file Add it in

Iman Irandoost 126 Nov 25, 2022