自定义可绘制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>
我做你的代码。我可以运行,但我需要修改两个地方:
-
name="android:indeterminateDrawable"
而不是android:progressDrawable
-
修改名称attrs.xml —> styles.xml
我不确定,但在这种情况下,您仍然可以通过在警报对话框中设置单独的布局文件,并使用上面代码的一部分为您的imageview设置动画来完成自定义的AlertDialog。