web-dev-qa-db-fra.com

Boîte de dialogue de progression personnalisée avec rotation d'image carrée avec AsyncTask

J'ai créé un dialogue de progression de chargement personnalisé. Et ça marche bien.

Je tourne 12 carrés Images en voici un

enter image description here

Mais quand je veux l'utiliser avec AsynTask, l'animation ne fonctionne pas.

Mon exemple de code est ci-dessous.

Activité où je commence le chargement ... Animation et arrêt.

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

Disposition XML avec un texte simple et une image pour la boîte de dialogue de progression.

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_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:background="#000000"
    Android:gravity="center"
    Android:orientation="vertical" >

    <ImageView
        Android:id="@+id/imageView1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:src="@drawable/progress_sm_w01" />

    <TextView
        Android:id="@+id/textView1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_marginTop="10dp"
        Android:text="Loading..."
        Android:textColor="#ffffff"
        Android:textSize="12sp" />

</LinearLayout>

Liste d'animation contenant 12 images Je tourne avec Angle & Durée

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>

Voici le résultat Écran de chargement ..

enter image description here

Ma question est est-il possible d'atteindre le même chargement Animation avec AsynTask.

Votre petite aide sera appréciée.

13
swiftBoy

Eh bien, merci à @Brontok et à @URAndroid pour leur aide. J'ai résolu mon problème ... donc laissez-moi répondre à ma propre question, Hoe j'ai réalisé cette animation de chargement personnalisé

J'ai ajouté quelques images pour l'animation de rotation d'image

Étape 1 - dans le dossier res/dessinable

  1. progress_sm_w00.png (image transparente vide par défaut)
  2. progress_sm_w01.png (première position d'animation)
  3. progress_sm_w02.png
  4. progress_sm_w03.png
  5. progress_sm_w04.png
  6. progress_sm_w05.png
  7. progress_sm_w06.png
  8. progress_sm_w07.png
  9. progress_sm_w08.png
  10. progress_sm_w09.png
  11. progress_sm_w10.png
  12. progress_sm_w11.png
  13. progress_sm_w12.png (dernière position d'animation).

Exemple: l'un d'eux est ci-dessous, j'ai ajouté 

enter image description here

Étape 2 - dans le dossier res/anim créé le nom du fichier d'animation "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>

Étape 3 - maintenant créé la disposition de vue de chargement personnalisé dans mon écran (activité) où je dois montrer le chargement

exemple . Disposition XML pour mon écran de connexion Facebook

<LinearLayout
         Android:id="@+id/LinearLayout1"
         Android:layout_width="fill_parent"
         Android:layout_height="fill_parent"
         Android:background="#0D000000"
         Android:gravity="center"
         Android:orientation="vertical"
         Android:visibility="gone" >

    <ImageView
    Android:id="@+id/imageView111"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:src="@drawable/progress_sm_w00"
    Android:visibility="gone" />

    <TextView
    Android:id="@+id/textView111"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="10dp"
    Android:text="Searching..."
    Android:textColor="#ffffff"
    Android:textSize="12sp"
    Android:visibility="gone" />

</LinearLayout>

Étape 4 - En code Java (Activité), j'ai créé la vue Chargement et, une fois la méthode OnCreate terminée, j'ai lancé Asyn Task afin que mon animation fonctionne correctement.

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

Étape 5 - Voici l'écran de résultat avec l'animation de chargement en cours.

enter image description here

J'espère que ceci vous aidera. À votre santé!!

32
swiftBoy

Peut-être que vous pouvez utiliser _ GLIDE , par exemple

Glide.with(context)
    .load(imageUrl)
    .asGif()
    .placeholder(R.drawable.loading2)
    .crossFade()
    .into(imageView);

Afficher le fichier GIF avec Glide (bibliothèque de chargement et de mise en cache des images)

1
David Hackro