自定义可绘制ProgressBar / ProgressDialog

通过阅读Google提供的有限文档,我感觉可以通过简单地创建一个将其分配给ProgressBar的style属性的新样式来改变ProgressBar / ProgressDialog的外观(可绘制)。 但我无法得到这个工作正常。 这是我到目前为止所做的:

我创建了一个像这样的形状(mp2.xml)

<?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="ring" android:innerRadiusRatio="4" android:thicknessRatio="4" android:useLevel="false"> <size android:width="50dip" android:height="50dip" /> <gradient android:type="sweep" android:useLevel="false" android:startColor="#300000ff" android:centerColor="#500000ff" android:endColor="#ff0000ff" /> </shape> 

然后像这样创建一个动画(mp3.xml):

 <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="30" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="30" android:toDegrees="60" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="60" android:toDegrees="90" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="90" android:toDegrees="120" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="120" android:toDegrees="150" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="150" android:toDegrees="180" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="180" android:toDegrees="210" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="210" android:toDegrees="240" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="240" android:toDegrees="270" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="270" android:toDegrees="300" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="300" android:toDegrees="330" android:repeatCount="1" /> </item> <item android:duration="70"> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/mp2" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="330" android:toDegrees="360" android:repeatCount="1" /> </item> </animation-list> 

然后像这样创建一个样式(attrs.xml):

 <?xml version="1.0" encoding="utf-8"?> <resources> <style parent="@android:style/Widget.ProgressBar" name="customProgressBar"> <item name="android:progressDrawable">@anim/mp3</item> </style> </resources> 

和在我的main.xml我已经设置了这样的风格:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:drawingCacheQuality="high"> <ProgressBar android:id="@+id/ProgressBar01" android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/customProgressBar"/> </LinearLayout> 

但它仍然表现出与以前一样的可绘制性。 我究竟做错了什么?

我用以下创建自定义进度栏。

文件res/drawable/progress_bar_states.xml声明不同状态的颜色:

 <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <shape> <gradient android:startColor="#000001" android:centerColor="#0b131e" android:centerY="0.75" android:endColor="#0d1522" android:angle="270" /> </shape> </item> <item android:id="@android:id/secondaryProgress"> <clip> <shape> <gradient android:startColor="#234" android:centerColor="#234" android:centerY="0.75" android:endColor="#a24" android:angle="270" /> </shape> </clip> </item> <item android:id="@android:id/progress"> <clip> <shape> <gradient android:startColor="#144281" android:centerColor="#0b1f3c" android:centerY="0.75" android:endColor="#06101d" android:angle="270" /> </shape> </clip> </item> </layer-list> 

和你的布局xml中的代码:

 <ProgressBar android:id="@+id/progressBar" android:progressDrawable="@drawable/progress_bar_states" android:layout_width="fill_parent" android:layout_height="8dip" style="?android:attr/progressBarStyleHorizontal" android:indeterminateOnly="false" android:max="100"> </ProgressBar> 

请享用!

我在使用一个不确定的进度对话框时遇到了一些麻烦,经过一些工作和反复试验,我找到了解决办法。

首先,创建要用于“进度”对话框的动画。 在我的情况下,我用了5个图像。

../res/anim/progress_dialog_icon_drawable_animation.xml:

 <animation-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/icon_progress_dialog_drawable_1" android:duration="150" /> <item android:drawable="@drawable/icon_progress_dialog_drawable_2" android:duration="150" /> <item android:drawable="@drawable/icon_progress_dialog_drawable_3" android:duration="150" /> <item android:drawable="@drawable/icon_progress_dialog_drawable_4" android:duration="150" /> <item android:drawable="@drawable/icon_progress_dialog_drawable_5" android:duration="150" /> </animation-list> 

你想显示ProgressDialog的地方:

 dialog = new ProgressDialog(Context.this); dialog.setIndeterminate(true); dialog.setIndeterminateDrawable(getResources().getDrawable(R.anim.progress_dialog_icon_drawable_animation)); dialog.setMessage("Some Text"); dialog.show(); 

这个解决方案非常简单,为我工作,你可以扩展ProgressDialog,并在内部重写drawable,但是这对于我所需要的来说太复杂了,所以我没有这样做。

尝试设置:

 android:indeterminateDrawable="@drawable/progress" 

它为我工作。 这里也是progress.xml的代码:

 <?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="0" android:toDegrees="360"> <shape android:shape="ring" android:innerRadiusRatio="3" android:thicknessRatio="8" android:useLevel="false"> <size android:width="48dip" android:height="48dip" /> <gradient android:type="sweep" android:useLevel="false" android:startColor="#4c737373" android:centerColor="#4c737373" android:centerY="0.50" android:endColor="#ffffd300" /> </shape> </rotate> 

你的风格应该是这样的:

 <style parent="@android:style/Widget.ProgressBar" name="customProgressBar"> <item name="android:indeterminateDrawable">@anim/mp3</item> </style> 

自定义进度与规模!

 <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" > <item android:duration="150"> <scale android:drawable="@drawable/face_no_smile_eyes_off" android:scaleGravity="center" /> </item> <item android:duration="150"> <scale android:drawable="@drawable/face_no_smile_eyes_on" android:scaleGravity="center" /> </item> <item android:duration="150"> <scale android:drawable="@drawable/face_smile_eyes_off" android:scaleGravity="center" /> </item> <item android:duration="150"> <scale android:drawable="@drawable/face_smile_eyes_on" android:scaleGravity="center" /> </item> </animation-list> 

我做你的代码。我可以运行,但我需要修改两个地方:

  1. name="android:indeterminateDrawable"而不是android:progressDrawable

  2. 修改名称attrs.xml —> styles.xml

我不确定,但在这种情况下,您仍然可以通过在警报对话框中设置单独的布局文件,并使用上面代码的一部分为您的imageview设置动画来完成自定义的AlertDialog。