Android自定义ProgressBar失真或加倍

时间:2014-06-04 15:47:10

标签: android android-drawable android-progressbar

我刚刚遇到了创建我不理解的自定义进度条的问题。我使用common方法创建动画列表,然后将其应用到进度条:

<?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/dw_pb_1"
        android:duration="100"/>
    <item
        android:drawable="@drawable/dw_pb_2"
        android:duration="100"/>
    <item
        android:drawable="@drawable/dw_pb_3"
        android:duration="100"/>

</animation-list>

我将它应用于进度条:

 <ProgressBar
            android:id="@+id/progressBar1"
            android:layout_width="150"
            android:layout_height="150"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dp"
            android:indeterminate="true"
            android:indeterminateDrawable="@drawable/dw_loader" />

但结果如下:

enter image description here

它在原始进度条旁边再次绘制drawable。如果我使用wrap_content到进度条的宽度和高度,这就是我得到的: enter image description here

****解决方案?:我无法想象为什么但是如果我以编程方式设置drawable它可以工作......

4 个答案:

答案 0 :(得分:1)

我有完全相同的问题。问题是ProgressBar会尝试复制它的drawable它有更多的空间。如果没有足够的空间,分别进行裁剪。

您可以通过缩放项目来解决此问题:

<item android:duration="100">
        <scale
            android:drawable="@drawable/@drawable/dw_pb_1"
            android:scaleGravity="center" />
</item>

重复每个项目。

答案 1 :(得分:0)

我可以通过提供适合我的自定义progressdialog课程帮助你。

MyProgressDialog.class

public class MyProgressDialog extends Dialog {

public static MyProgressDialog show(Context context, CharSequence title,
        CharSequence message) {
    return show(context, title, message, false);
}

public static MyProgressDialog show(Context context, CharSequence title,
        CharSequence message, boolean indeterminate) {
    return show(context, title, message, indeterminate, false, null);
}

public static MyProgressDialog show(Context context, CharSequence title,
        CharSequence message, boolean indeterminate, boolean cancelable) {
    return show(context, title, message, indeterminate, cancelable, null);
}

public static MyProgressDialog show(Context context, CharSequence title,
        CharSequence message, boolean indeterminate,
        boolean cancelable, OnCancelListener cancelListener) {
    MyProgressDialog dialog = new MyProgressDialog(context);
    dialog.setTitle(title);
    dialog.setCancelable(cancelable);
    dialog.setOnCancelListener(cancelListener);
    /* The next line will add the ProgressBar to the dialog. */
    dialog.addContentView(new ProgressBar(context), new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    dialog.show();

    return dialog;
}

public MyProgressDialog(Context context) {
    super(context, R.style.NewDialog);
}

并使用它:

MyProgressDialog mProgress = MyProgressDialog.show(context, title, message);

同样拒绝:mProgress.dismiss();

如果您希望透明背景只有进展,请执行以下操作:

 MyProgressDialog mProgress = MyProgressDialog.show(context, null, null);

使用它..

答案 2 :(得分:0)

您只需制作自己的自定义进度条即可。在res / drawable中,创建一个XML文件,将其命名为loading_indertiminate.xml,例如:

<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/loading_spinner"
    android:pivotX="50%"
    android:pivotY="50%" />

而且,在您的布局中,只需为您的Progess栏进行此操作。

<ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_gravity="center"
            android:indeterminateDrawable="@drawable/loading_indertiminate" />

答案 3 :(得分:0)

自Android 6.0版(Marshmallow API Level 23)以来不再出现此问题。 对于以前的版本支持,@ wrecker提供的解决方案仍然有效。