使用 AsyncTask 进行方形图像旋转的自定义进度对话框
Posted
技术标签:
【中文标题】使用 AsyncTask 进行方形图像旋转的自定义进度对话框【英文标题】:Custom Progress Dialog With Squre Image Rotation With AsynTask 【发布时间】:2013-11-22 22:10:18 【问题描述】:我创建了一个自定义加载进度对话框。而且效果很好。
我正在旋转 12 个正方形图像,这里是其中之一
但是当我想将它与 AsynTask 一起使用时,动画不起作用。
我的示例代码如下。
我开始加载的活动...动画和停止。
MainActivity.java
public class MainActivity extends Activity
AnimationDrawable loadingViewAnim;
TextView loadigText;
ImageView loadigIcon;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadigText = (TextView) findViewById(R.id.textView1);
loadigText.setText("Loading...");
loadigText.setVisibility(View.GONE);
loadigIcon = (ImageView) findViewById(R.id.imageView1);
loadigIcon.setVisibility(View.GONE);
loadigIcon.setBackgroundResource(R.anim.progress_animation_white);
loadingViewAnim = (AnimationDrawable) loadigIcon.getBackground();
//When User Touch on Screen The Loading... Animation Starts With Image Rotation
//If I start below code in AsynTask's onPreExecute method it doesn't work
public boolean onTouchEvent(MotionEvent event)
loadigText.setVisibility(View.VISIBLE);
loadigIcon.setVisibility(View.VISIBLE);
if (event.getAction() == MotionEvent.ACTION_DOWN)
loadingViewAnim.start();
return true;
return super.onTouchEvent(event);
带有用于进度对话框的简单文本和图像的 XML 布局。
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_
android:layout_
android:background="#000000"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_
android:layout_
android:src="@drawable/progress_sm_w01" />
<TextView
android:id="@+id/textView1"
android:layout_
android:layout_
android:layout_marginTop="10dp"
android:text="Loading..."
android:textColor="#ffffff"
android:textSize="12sp" />
</LinearLayout>
动画列表有 12 张图像,我正在旋转角度和持续时间
progress_animation_white.xml
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/progress_sm_w01" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w02" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w03" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w04" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w05" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w06" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w07" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w08" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w09" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w10" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w11" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w12" android:duration="50" />
</animation-list>
这是结果加载屏幕..
我的问题是有没有办法实现相同的加载动画 使用 AsynTask。
您的小帮助将不胜感激。
【问题讨论】:
为什么要使用AsyncTask? onTouchEvent 只会在您触摸屏幕时执行。 @Brontok 是的 同意亲爱的,但是有什么办法可以在 AsynTask 进度加载的情况下旋转方形图像? 因为我想将此自定义进度对话框与我的网络作业一起使用,为此我正在使用 AsynTask。 嗯,你必须在 onPreExecute() 中开始你的动画,现在在 doInBackground() 中执行你的后台操作,并在 onPostExecute() 方法中停止你的动画。正如您在动画中定义的 50 毫秒时间,应该在运行时在 java 代码中完成。 运行时启动动画androidforums.com/application-development/… @Brontok 好的,我会这样做并让您知道,谢谢您的帮助。 【参考方案1】:感谢@Brontok 和@URAndroid 的帮助。我解决了我的问题。 所以让我回答我自己的问题,我实现了自定义加载动画
我为图像旋转动画添加了一些图像
第 1 步 - 在 res/drawable 文件夹中
-
progress_sm_w00.png(默认空白透明图片)
progress_sm_w01.png(第一个动画位置)
progress_sm_w02.png
progress_sm_w03.png
progress_sm_w04.png
progress_sm_w05.png
progress_sm_w06.png
progress_sm_w07.png
progress_sm_w08.png
progress_sm_w09.png
progress_sm_w10.png
progress_sm_w11.png
progress_sm_w12.png(最后一个动画位置)。
示例:下面是我添加的其中之一
第 2 步 - 在 res/anim 文件夹中创建动画文件名“loading_animation.xml”
<item android:drawable="@drawable/progress_sm_w01" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w02" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w03" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w04" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w05" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w06" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w07" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w08" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w09" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w10" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w11" android:duration="50" />
<item android:drawable="@drawable/progress_sm_w12" android:duration="50" />
</animation-list>
第 3 步 - 现在在我的屏幕(活动)中创建了自定义加载视图布局,我需要显示加载
例子。 我的 Facebook 登录屏幕的 XML 布局
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_
android:layout_
android:background="#0D000000"
android:gravity="center"
android:orientation="vertical"
android:visibility="gone" >
<ImageView
android:id="@+id/imageView111"
android:layout_
android:layout_
android:src="@drawable/progress_sm_w00"
android:visibility="gone" />
<TextView
android:id="@+id/textView111"
android:layout_
android:layout_
android:layout_marginTop="10dp"
android:text="Searching..."
android:textColor="#ffffff"
android:textSize="12sp"
android:visibility="gone" />
</LinearLayout>
第 4 步 - 在 java 代码(Activity)中,我创建了 Loading 视图,并在完成 OnCreate 方法后启动了 Asyn Task,以便我的动画正常工作。
public class ResultActivity extends Activity
private static final String TAG = "ResultActivity";
private AnimationDrawable loadingViewAnim=null;
private TextView loadigText = null;
private ImageView loadigIcon = null;
private LinearLayout loadingLayout = null;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
loadingLayout = (LinearLayout)findViewById(R.id.LinearLayout1);
loadingLayout.setVisibility(View.GONE);
loadigText = (TextView) findViewById(R.id.textView111);
loadigText.setVisibility(View.GONE);
loadigIcon = (ImageView) findViewById(R.id.imageView111);
loadigIcon.setVisibility(View.GONE);
loadigIcon.setBackgroundResource(R.anim.loading_animation);
loadingViewAnim = (AnimationDrawable) loadigIcon.getBackground();
// This line is to start Asyn Task only when OnCreate Method get completed, So Loading Icon Rotation Animation work properly
loadigIcon.post(new Starter());
class Starter implements Runnable
public void run()
//start Asyn Task here
new LongOperation().execute("");
private class LongOperation extends AsyncTask<String, Void, String>
@Override
protected String doInBackground(String... params)
//ToDo your Network Job/Request etc. here
return "Executed";
@Override
protected void onPostExecute(String result)
//ToDo with result you got from Task
//Stop Loading Animation
loadingLayout.setVisibility(View.GONE);
loadigText.setVisibility(View.GONE);
loadigIcon.setVisibility(View.GONE);
loadingViewAnim.stop();
@Override
protected void onPreExecute()
//Start Loading Animation
loadingLayout.setVisibility(View.VISIBLE);
loadigText.setVisibility(View.VISIBLE);
loadigIcon.setVisibility(View.VISIBLE);
loadingViewAnim.start();
@Override
protected void onProgressUpdate(Void... values)
第 5 步 - 这是带有进度加载动画的结果屏幕。
希望这会对您有所帮助。干杯!!
【讨论】:
重新第2步:文件需要在文件夹res/drawable
。
上传那些图片文件并分享【参考方案2】:
也许你可以使用GLIDE,例如
Glide.with(context)
.load(imageUrl)
.asGif()
.placeholder(R.drawable.loading2)
.crossFade()
.into(imageView);
Show GIF file with Glide (image loading and caching library)
【讨论】:
以上是关于使用 AsyncTask 进行方形图像旋转的自定义进度对话框的主要内容,如果未能解决你的问题,请参考以下文章
MLKit 旋转面部图像使其笔直(iOS 和 Android)
如何设置悬停效果(注意:只有方形边框在悬停时应该像钻石形状一样旋转,而不是图像)[关闭]