使用 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)

如何设置悬停效果(注意:只有方形边框在悬停时应该像钻石形状一样旋转,而不是图像)[关闭]

颤动 - 如何使用画布围绕中心旋转图像

如何从android中的自定义适配器调用Activity asynctask

Android Studio 将自定义适配器添加到 AsyncTask