转自 http://www.jianshu.com/p/6e7ea842d5ce

另外工作原理可以参考http://blog.csdn.net/lan603168/article/details/44705425

ProgressBar 自定义的时候可能会遇到一个问题,希望进度条中的进度的两端都是圆角的(或者进度的末端是圆角的);
如下图:


progress bar rounder

但是根据自定义的shape 或者是 layer-list却总是很难做到,几乎都是被clip成了直角的样子;


progress bar

;

问题的原因就是如下链接中也会有相似的解答:
Android开发中Progress需要两边都是圆角怎么办?


为什么是直角的?原因就是被clip给切了,所以我们不能够用clip,而要使用scale这个标签。而上面链接给出的解答是定义一个.9的图片就能满足要求,由于我们这里是纯色的一个进度,所以没有必要通过再制作一个.9的图片,而只需要通过同样的方法引用我们定义的一个shape就可以了;
见代码:

<ProgressBar    
android:layout_below="@id/text_1"    
android:layout_marginTop="16dp"    
android:layout_width="match_parent"    
android:layout_height="wrap_content"    
android:id="@+id/progressbar_1"   
style="?android:attr/progressBarStyleHorizontal"    
android:max="100"    
android:progress="40"    
android:progressDrawable="@drawable/progress_bar_drawable"    />

progressDrawable 引用的progress_bar_drawable:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">   
     <shape>           
          <corners  android:topRightRadius="20dp"          
            android:bottomRightRadius="20dp" />  
          <solid android:color="#ED30353E"/>        
    </shape>    
   </item>   
   <item android:id="@android:id/secondaryProgress"> 
     <scale android:scaleWidth="100%">            
        <shape>                
            <corners android:topRightRadius="20dp"
               android:bottomRightRadius="20dp"/>
            <solid android:color="#11ce33"/>         
       </shape>        
     </scale>   
   </item>    

  <item android:id="@android:id/progress">  
      <!--       
       <clip>      
       <shape>        
             <corners android:topRightRadius="20dp"  
                  android:bottomRightRadius="20dp"/>   
             <solid android:color="#FF009898"/>      
      </shape>    
      </clip>     
     -->      
  <scale android:scaleWidth="100%"     
       android:drawable="@drawable/progress_bar_ct"   />  
  </item>
</layer-list>

重点就是这个:

<scale android:scaleWidth="100%"     
       android:drawable="@drawable/progress_bar_ct"   />

指定了一个我们自定义的shape:progress_bar_ct.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
 xmlns:android="http://schemas.android.com/apk/res/android"  
  android:shape="rectangle"> 
   <!-- solid指定形状的填充色,只有android:color一个属性 -->   
   <solid android:color="#FF009898" />   
   <!-- padding设置内容区域离边界的间距 -->    
    <!-- corners设置圆角,只适用于rectangle -->    
    <corners android:bottomRightRadius="20dp" 
       android:topRightRadius="20dp"/>    
</shape>

这样就不需要自定义.9的图片了;
PS:由于本人的需求是右端才是圆角,如果需要4个角都是圆角只需要修改一点代码即可;

<corners android:bottomRightRadius="20dp" 
       android:topRightRadius="20dp"/>

修改成:

<corners android:radius="20dp" />

即可;



文/heybik(简书作者)
原文链接:http://www.jianshu.com/p/6e7ea842d5ce
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。