2010-05-12 36 views
114

阅读Google提供的有限文档,我感觉可以通过简单地创建一个新样式并将其分配给样式来更改ProgressBar/ProgressDialog的外观(可绘制) ProgressBar的属性。但我无法让这个工作正常。下面是我做的,到目前为止:自定义可绘制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> 

但它仍然显示了同样的绘制前。我究竟做错了什么?

+0

正好是浏览样品,看完之后你对面来了[这里](http://groups.google.com/group/android-developers/browse_thread/thread/51188f7e52a83ded/de8c88581592d059?lnk=raot) 。希望它能解决你的问题。 – reuscam 2010-07-09 20:33:47

+0

我知道如何创建形状/渐变/动画。我在上面创建的那个是基于你引用的帖子(我不得不改变它,因为它看起来非常波涛汹涌,速度很慢)。我只是希望能够使用“风格”来实现这一点。 感谢您的反馈 – Sam 2010-07-12 10:56:45

+0

如果您想完全自定义您的进度条,并真正看中[本博客文章](http://www.jagsaund.com/blog/2011/11/6/customizing- your-progress-bar-part-one.html)它可能超出了你想要的或者可能只是你想要的。希望能帮助到你! – jagsaund 2011-11-12 09:49:02

回答

5

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

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

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

+0

我试过了。它不起作用。 drawable不会改变。 – Sam 2010-10-19 17:00:43

+0

你修改你的android:startColor =“#300000ff”为#FF00ff00,修改其他颜色 – pengwang 2010-10-20 09:13:39

131

我用下面的方法创建一个自定义进度条。

文件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> 

享受!

+0

真棒,它甚至用drawables这种方式 – alkar 2011-01-21 14:05:43

+0

这样的作品,但我不能让它与drawables工作 – 2012-02-22 18:22:41

+0

@YuliaRogovaya是它因为drawable不在剪辑元素中?我无法使其工作;怀疑剪辑元素是关键。 – 2013-05-09 19:29:24

0

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

10

你的风格应该是这样的:

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

尝试设置:

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> 
+0

谢谢,为圆形进度条工作。 – 2012-12-26 14:57:24

+2

如果您想要使用drawable,那么只需在旋转标签中使用'android:drawable =',然后移除该形状。最后是回答旋转进度条问题的人。 – MinceMan 2014-06-17 16:09:14

+1

它设置颜色,但进度条不旋转 – Crawler 2015-08-03 08:09:52

52

我在使用不确定的进度对话框与这里的解决方案有些麻烦,经过一番工作,试验和错误我得到它的工作。

首先,创建要用于进度对话框的动画。在我的情况下,我使用了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,但是,这对于我所需要的来说太复杂了,所以我没有这样做。

+1

感谢您注意“dialog.setIndeterminateDrawable()” – scottyab 2012-07-19 14:08:03

+1

@bindinduff非常感谢您的解决方案,您为我节省了大量时间。 – Zeba 2012-08-30 07:39:37

+0

有没有办法在对话框中只有一个图像,所以没有消息,但在整个对话框中可绘制? – Diego 2013-08-11 20:28:24

6

按比例自定义进度!

<?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>