1

我正在开发一个应该有进度对话框的项目。但是由于我没有找到一种简单的方法来设置进度对话框的样式,我在想,最简单的方法是创建一个具有自己样式的自定义对话框类,并在其上逐帧动画,然后显示它。这是我的代码:

对话框的 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

将 android:oneshot="true" 更改为 android:oneshot="false" 以便重复。它目前应该只做一个周期,因为你的表演时间是 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 回答
0

今天面临同样的问题。将animation.start()onShow() 方法放入 OnShowListener 对我来说是诀窍。

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 回答