1

プログレスダイアログが必要なプロジェクトに取り組んでいます。しかし、progressdialog のスタイルを設定する簡単な方法が見つからなかったので、独自のスタイルを持つカスタム ダイアログ クラスを作成し、その上にフレームごとのアニメーションを表示するのが最も簡単な方法だと考えていました。これが私のコードです:

ダイアログの xml レイアウト:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/dialog_background"
    android:gravity="center"
    android:orientation="horizontal"
    android:padding="10dp" >

    <ImageView
        android:id="@+id/loaddialog_animation"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/loadanimation"
        android:layout_marginRight="10dp" />

    <TextView
        android:id="@+id/loaddialog_text"
        style="@style/SmallText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

ここに私のダイアログクラスがあります:

public class LoadDialog extends Dialog
{
    private TextView message;
    ImageView image;
    AnimationDrawable animation;

    public LoadDialog(Context context)
    {
        super(context, R.style.Dialog);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.load_dialog);

        message = (TextView) findViewById(R.id.loaddialog_text);

        image = (ImageView) findViewById(R.id.loaddialog_animation);
        image.setBackgroundResource(R.drawable.loadanimation);
        animation = (AnimationDrawable) image.getBackground();
    }

    public void setText(String msg)
    {
        message.setText(msg);
    }

    @Override
    public void show()
    {
        super.show();
        animation.start();
    }

    @Override
    public void dismiss()
    {
        animation.stop();
        super.dismiss();
    }   
}

およびアニメーション リソース:

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true" >
    <item android:drawable="@drawable/loadbar_01" android:duration="50" />
    <item android:drawable="@drawable/loadbar_02" android:duration="50" />
    <item android:drawable="@drawable/loadbar_03" android:duration="50"/>
</animation-list>

問題は、アニメーションを表示しようとすると、アニメーションが開始されないことです。この問題については多くのトピックがありますが、私が試したことは次のとおりです。

  1. ダイアログ show() をアクティビティのさまざまな部分に配置します: onResume() と onCreate()。ダイアログを表示したいので、 onWindowFocusChanged() はオプションではありません。ダイアログの表示 -> フォーカスの変更、ダイアログの非表示 -> フォーカスの変更 -> 表示されるダイアログの数は無限です。
  2. 私はanimation.setCallback(image)、animation.setVisible(true、true)、animation.invalidateSelf()を試しましたが、どれもうまくいきません。
  3. 私は image.post() を試して、パラメータとして runnable をそこに入れましたが、アニメーションを開始する run メソッドでは運がありません。

この時点で、オプションが不足し始めています。ダイアログが閉じられるまで、変化する 3 つの画像のみを表示しようとしています。あなたが知っているなら、私が間違っていること、または別の方法を教えてください!

前もって感謝します!

4

2 に答える 2

0

今日も同じ問題に直面しました。animation.start()OnShowListener の onShow() メソッドに配置すると、うまくいきました。

public class CustomProgressDialog extends Dialog 
{
ImageView progressImage;
AnimationDrawable frameAnimation;

public CustomProgressDialog(Context context)
{
    super(context);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.custom_progress);
    getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

    progressImage = (ImageView) findViewById(R.id.custom_progress_image);
    progressImage.setBackgroundResource(R.anim.progress_anim);

    frameAnimation = (AnimationDrawable) progressImage.getBackground();

    OnShowListener osl = new OnShowListener() 
    {
        @Override
        public void onShow(DialogInterface dialog)
        {
            frameAnimation.start();
        }
    }; 
    setOnShowListener(osl);

    OnDismissListener odl = new OnDismissListener() 
    {

        @Override
        public void onDismiss(DialogInterface dialog) 
        {
            frameAnimation.stop();
        }
    };
    setOnDismissListener(odl);
}

}
于 2013-10-24T09:49:27.843 に答える
0

android:oneshot="true" を android:oneshot="false" に変更して、繰り返すようにします。現在は 1 サイクルしか実行していないはずですが、ショーの時間が 50 であるため、これは非常に高速です。私はそれをおそらく200かそこらに変更します..

<?xml version="1.0" encoding="utf-8"?> 
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" >
<item android:drawable="@drawable/loadbar_01" android:duration="200" />
 <item android:drawable="@drawable/loadbar_02" android:duration="200" />
 <item android:drawable="@drawable/loadbar_03" android:duration="200"/>
 </animation-list> 

また、xml レイアウトで画像を設定していますが、背景をアニメーション化しているため、xml レイアウトを次のように変更する必要があります。

<ImageView         android:id="@+id/loaddialog_animation"         android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/loadanimation"
android:layout_marginRight="10dp" /> 

または、次のように、背景ではなく src ファイルを取得するようにコードを変更します。

image = (ImageView) findViewById(R.id.loaddialog_animation);
image.set(R.drawable.loadanimation);
animation = (AnimationDrawable) image.getDrawable();
于 2012-04-18T19:24:22.117 に答える