带有 .gif 文件的 Android 自定义进度条
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/26302282/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android custom progress bar with .gif file
提问by Nishant Tanwar
In my app i have a custom progress bar
在我的应用程序中,我有一个自定义进度条
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" />
my gif file
我的gif文件
I want to create a progress bar with this image
我想用这张图片创建一个进度条
In other word i want to show this image whenever i download data from server and remove it after downloading the data
换句话说,每当我从服务器下载数据并在下载数据后将其删除时,我都想显示此图像
or you can say , how to show this image as a progress bar
或者你可以说,如何将此图像显示为进度条
回答by Hitesh
- 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.
<?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();`
- 首先将您的 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>
在 Main Activity 中设置如下代码,
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();`
回答by Anuj Sharma
I think I'm late to answer this, But you can try this also.
我想我回答这个问题已经晚了,但你也可以试试这个。
XML
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
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.
在 Java 文件登录以显示计时器。在这里我使用了 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
回答by Monika Moon
Put your gif image in /res/raw folder
将您的 gif 图像放在 /res/raw 文件夹中
In your class declare mProgressDialog
在你的班级中声明 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.
创建一个 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();
}
}
}
回答by Hamed Jaliliani
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!
我之前在这篇文章中轻松解决了这个问题: 带有 GIF(动画 GIF)的自定义进度条 使用显示动画 GIF 的 ImageView,当需要显示等待时让它可见,当所有工作都完成时,让它消失!
回答by AndroLogiciels
My solution is to use an Animated icon.
我的解决方案是使用动画图标。
1°) Create an XML "animated" in Drawable :
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°) Put an imageview in your layout
2°) 在你的布局中放置一个图像视图
3°) Put the following code in your activity :
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;
}
}