Android custom progress bar with .gif file

后端 未结 6 1900
执念已碎
执念已碎 2020-12-20 04:05

In my app i have a custom progress bar

progress.xml

 

        
相关标签:
6条回答
  • 2020-12-20 04:43

    Put your gif image in /res/raw folder

    In your class declare mProgressDialog

    TransparentProgressDialog mProgressDialog;
    

    then use following code to show progress dialog

    if (mProgressDialog == null)
        mProgressDialog = new TransparentProgressDialog(this);
    if (mProgressDialog.isShowing())
        mProgressDialog.dismiss();
        mProgressDialog.setTitle(getResources().getString(R.string.title_progress_dialog));
        mProgressDialog.setCancelable(false);
        mProgressDialog.show();
    

    Create a class TransparentProgressDialog where .gif can be loaded using Glide library.

    public class TransparentProgressDialog extends Dialog {
    
    private ImageView iv;
    
    public TransparentProgressDialog(Context context) {
        super(context, R.style.TransparentProgressDialog);
        WindowManager.LayoutParams wlmp = getWindow().getAttributes();
        wlmp.gravity = Gravity.CENTER_HORIZONTAL;
        getWindow().setAttributes(wlmp);
        setTitle(null);
        setCancelable(false);
        setOnCancelListener(null);
        LinearLayout layout = new LinearLayout(context);
        layout.setOrientation(LinearLayout.VERTICAL);
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        iv = new ImageView(context);
        GlideDrawableImageViewTarget imageViewTarget = new GlideDrawableImageViewTarget(iv);
        Glide.with(context).load(R.raw.gif_loader).into(imageViewTarget);
    
        layout.addView(iv, params);
        addContentView(layout, params);
    }
    
    @Override
    public void show() {
        super.show();
    }
    

    }

    0 讨论(0)
  • 2020-12-20 04:53

    Android progress dialog with gif

    public class CustomProgressDialog extends AlertDialog {
    public CustomProgressDialog(Context context) {
        super(context);
        getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
    }
    
    @Override
    public void show() {
        super.show();
        setContentView(R.layout.custom_progress_dialog);
     }
    }
    

    for more info http://www.androidcoding.in/2017/11/14/android-custom-progressbar/

    0 讨论(0)
  • 2020-12-20 04:55

    I solved it before on this post easily: Custom progress bar with GIF (animated GIF) Use an ImageView that shows an Animated GIF and when need to show waiting make it visible and when works all will be done, make it Gone!

    0 讨论(0)
  • 2020-12-20 04:59
    • First Conver your Gif image to png Slice image sequence.

    • Declare Your Progress bar as Image view.

       <ImageView
           android:id="@+id/main_progress"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center"
           android:visibility="visible" />
      
    • Create .xml file in drawable folder using your .png sequence image those are generated from gif. In this case, Loading_web_animation.xml

       <?xml version="1.0" encoding="utf-8"?>
           <animation-list    xmlns:android="http://schemas.android.com/apk/res/android"
           android:oneshot="false">
       <item
           android:drawable="@mipmap/wblod_0"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_1"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_2"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_3"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_4"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_5"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_6"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_7"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_8"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_9"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_10"
           android:duration="40" />
       <item
           android:drawable="@mipmap/wblod_11"
           android:duration="40" />
       </animation-list>
      
    • In Main Activity set the code like,

       private AnimationDrawable animationDrawable;
       private ImageView mProgressBar;
       mProgressBar.setBackgroundResource(R.drawable.loading_web_animation);
       animationDrawable = (AnimationDrawable)mProgressBar.getBackground();
       mProgressBar.setVisibility(View.VISIBLE);
       animationDrawable.start();
       mProgressBar.setVisibility(View.GONE);
       animationDrawable.stop();`
      
    0 讨论(0)
  • 2020-12-20 05:01

    My solution is to use an Animated icon.

    1°) Create an XML "animated" in Drawable :

    <?xml version="1.0" encoding="utf-8"?>
    <animation-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@drawable/micro_1" android:duration="200" />
        <item android:drawable="@drawable/micro_2" android:duration="200" />
        <item android:drawable="@drawable/micro_3" android:duration="200" />
        <item android:drawable="@drawable/micro_4" android:duration="200" />
        <item android:drawable="@drawable/micro_3" android:duration="200" />
        <item android:drawable="@drawable/micro_2" android:duration="200" />
    </animation-list>
    

    2°) Put an imageview in your layout

    3°) Put the following code in your activity :

    import androidx.appcompat.app.AppCompatActivity;
    import android.app.ProgressDialog;
    import android.graphics.drawable.AnimationDrawable;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.View;
    import android.widget.ImageView;
    
    public class MainActivity extends AppCompatActivity {
        ProgressDialog progressBar;
        private int progressBarStatus = 0;
        private Handler progressBarHandler = new Handler();
        private ImageView micButton;
        //-- for testing progress bar
        private long fileSize = 0;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //-- declare animation
            final AnimationDrawable[] rocketAnimation = new AnimationDrawable[1];
            final ImageView micButton = findViewById(R.id.mic_button);
            micButton.setBackgroundResource(R.drawable.micro_1);
            //-- button listener
            micButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //-- init button with animation
                    micButton.setBackgroundResource(R.drawable.mic_image);
                    rocketAnimation[0] = (AnimationDrawable) micButton.getBackground();
                    startprogress(rocketAnimation[0]);
                }
            });
        }
    
    
        public void startprogress(final AnimationDrawable rocketAnimation) {
             rocketAnimation.start();
            progressBar = new ProgressDialog(MainActivity.this);
             //--reset filesize for demo
            fileSize = 0;
            //-- thread for demo
            new Thread(new Runnable() {
                public void run() {
                    while (progressBarStatus < 100) {
                        // process some tasks
                        progressBarStatus = doSomeTasks();
                        // your computer is too fast, sleep 1 second
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        // Update the progress bar
                        progressBarHandler.post(new Runnable() {
                            public void run() {
                                progressBar.setProgress(progressBarStatus);
                            }
                        });
                    }
    
                    // ok, file is downloaded,
                    if (progressBarStatus >= 100) {
                        // sleep 2 seconds, so that you can see the 100%
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                        // close the progress bar dialog
                        progressBar.dismiss();
                        if(rocketAnimation.isRunning()){
                            rocketAnimation.stop();
                        }
                    }
                }
            }).start();
    
        }
    
        // file download simulator... a really simple
        public int doSomeTasks() {
    
            while (fileSize <= 1000000) { //1000000
    
                fileSize++;
    
                if (fileSize == 100000) {
                    return 10;
                } else if (fileSize == 200000) {
                    return 20;
                } else if (fileSize == 300000) {
                    return 30;
                } else if (fileSize == 400000) {
                    return 40;
                } else if (fileSize == 500000) {
                    return 50;
                } else if (fileSize == 600000) {
                    return 60;
                }
            }
    
            return 100;
        }
    }
    
    0 讨论(0)
  • 2020-12-20 05:05

    I think I'm late to answer this, But you can try this also.

    XML

    <FrameLayout
                    android:id="@+id/progress_container"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerInParent="true">
                    <ProgressBar
                        android:id="@+id/circular_progress"
                        android:layout_width="100dp"
                        android:layout_height="100dp"
                        android:indeterminateDrawable="@drawable/my_progress_indeterminate"
                        />
                    <TextView
                        android:id="@+id/circular_progress_counter"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:textSize="@dimen/text_size_big"
                        android:textColor="@color/white"
                        android:text="10"/>
                </FrameLayout>
    

    my_progress_indeterminate.xml

    <?xml version="1.0" encoding="utf-8"?>
    <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
        android:drawable="@drawable/process_icon"
        android:pivotX="50%"
        android:pivotY="50%" />
    

    In Java File login to show Timer. here I used 10 second timer.

    private void progressTimer() {
            handler = new Handler();
    
            if (maxCount >= 0) {
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        /*
                        Logic to set Time inside Progressbar
                         */
    
                        mCircularProgressCounter.setText(maxCount+"");
    
                        maxCount = maxCount - 1;
                        pickupTimer();
    
                    }
                }, 1000);
            } 
        }
    
    Result
    

    0 讨论(0)
提交回复
热议问题