web-dev-qa-db-ja.com

AsyncTaskで正方形の画像を回転するカスタム進行ダイアログ

カスタムの読み込み進捗ダイアログを作成しました。そして、それはうまくいきます。

私は12個の正方形の画像を回転させています

enter image description here

しかし、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_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>

角度と時間の長さで回転している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>

これが結果ロード画面です。

enter image description here

私の質問は、とにかく同じロードアニメーションを達成するためにありますかAsynTaskを使用して

あなたの小さな助けに感謝します。

14
swiftBoy

@Brontokと@URAndroidの協力に感謝します。私は私の問題を解決しました。だから私は自分の質問に答えましょう、Hoeはそのカスタムローディングアニメーションを達成しました

画像回転アニメーション用の画像をいくつか追加しました

ステップ1- res/drawableフォルダー

  1. progress_sm_w00.png(デフォルトの空白の透明画像)
  2. progress_sm_w01.png(最初のアニメーション位置)
  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(最後のアニメーション位置)。

例:これらの1つは以下にあります私は追加しました

enter image description here

ステップ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_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>

ステップ4-でJavaコード(アクティビティ)ロードビューを作成し、OnCreateメソッドの完了後にAsynタスクを開始して、アニメーションが適切に機能するようにしました。

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-これは、進行状況のロードアニメーションを含む結果画面です。

enter image description here

これがお役に立てば幸いです。乾杯!!

33
swiftBoy

多分あなたは [〜#〜] glide [〜#〜] を使うことができます、例えば

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

GlideでGIFファイルを表示(画像の読み込みとキャッシュライブラリ)

0
David Hackro