带有.gif文件的Android自定义进度条

时间:2014-10-10 14:55:34

标签: android android-custom-view android-progressbar

在我的应用中,我有自定义进度条

progress.xml

 <ProgressBar
    android:id="@+id/progressBar1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:progressDrawable="@drawable/loader" />

我的gif文件

My gif image

我想用这张图片创建一个进度条

换句话说,我想在每次从服务器下载数据时显示此图像,并在下载数据后将其删除

或者你可以说,如何将此图像显示为进度条

6 个答案:

答案 0 :(得分:11)

  • 首先将您的Gif图像转换为png切片图像序列。
  • 将进度条声明为图像视图。

    <ImageView
        android:id="@+id/main_progress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:visibility="visible" />
    
  • 使用从gif生成的.png序列图像在drawable文件夹中创建.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>
    
  • 在主要活动中设置代码,如

    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();`
    

答案 1 :(得分:1)

我想我很晚才回答这个问题,但你也可以尝试一下。

  

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%" />

在Java File登录中显示Timer。我在这里使用了10秒计时器。

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

enter image description here

答案 2 :(得分:1)

将您的gif图像放入/ res / raw文件夹

在你的班级中声明mProgressDialog

TransparentProgressDialog mProgressDialog;

然后使用以下代码显示进度对话框

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();

创建一个TransparentProgressDialog类,其中.gif可以使用Glide库加载。

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();
}

}

答案 3 :(得分:0)

我在这篇文章之前轻松解决了这个问题: Custom progress bar with GIF (animated GIF) 使用显示动画GIF的ImageView,当需要显示等待使其可见时,当所有工作都完成时,让它消失!

答案 4 :(得分:0)

我的解决方案是使用动画图标。

1°)在Drawable中创建XML“动画”:

<?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°)在您的布局中放置一个图像视图

3°)在您的活动中输入以下代码:

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;
    }
}

答案 5 :(得分:0)

带有gif的Android进度对话框

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);
 }
}

有关更多信息,http://www.androidcoding.in/2017/11/14/android-custom-progressbar/