Android drawable 玩转自定义图片以及bug的解决


 

Android drawable 玩转自定义图片以及bug的解决


很久没有空更新博客了,以至于挺多东西都用过之后就忘记了,没有很好的记录下来,之前在工作的时候也是这样,用完就忘记,所以觉得还是很有必要把自己用过的一些东西,解决的一些问题记录下来的,所以以后尽量坚持一周写一次博客,记录一下自己解决的问题,也与大学共享一下,建议大家也写一下博客或笔记什么的,因为在工作中,自己接触的东西并不可能只是自己刚开始的东西,比如说Android,其实在开发一个app或平时在公司工作的时候,还需要用到很多的东西,而且还有可能有一段时间去使用别的语言去开发,如果自己不记录一下,很有可能就会学一样就忘一样,这样不利于自身的发展,所以建议各位还是要记录一下自己的东西才行的。

好了,废话不多说了,我们进入今天的正题,今天主要是有两点,一点就是说一下开发中,一些drawable的小技巧, 还有的就是我之前在开发中,发现的在2.x的android里面的一个drawable的bug

首先,我们来看一张图片


大家实现上面的那个按钮的第一想法就是去找美工MM拿张圆角的背景图片,然后接入背景就可以了,这样子也可以的,但是在做多种尺寸的屏幕适配的时候,这样我们就要加多一步,就是用9path把那背景图片处理一样,这样子做太麻烦了,

其实对于一些纯色的图片或背景,我们都可以在drawable目录下面写一个xml就可以的了,非常的简单,不但不用找美工要图片,还不用自己用9path处理,十分的轻松</p><p>就像上面的那个圆角按钮,就是一个drawable的背景来的,代码如下

/drawable/btn_bg.xml


[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:shape="rectangle" >  
  4.       
  5.     <corners android:radius="8dp"/>  
  6.       
  7.     <solid android:color="#ff0bd38a"/>  
  8.   
  9. </shape>  

是不是非常的简单明了呢,

使用就更简单,把它当成一张图片就好了

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <Button   
  2.         android:layout_width="match_parent"  
  3.         android:layout_height="wrap_content"  
  4.         android:background="@drawable/btn_bg"  
  5.         android:text="@string/app_name"  
  6.         android:textSize="25sp"  
  7.         android:textColor="@android:color/white"/>  

现在解释一下xml里面的东西,在上面的btn_bg.xml里面,在第3行里面,android:shape="rectangle",rectangle代表的是下面写的是一个方块,还有"oval" 椭圆、"line" 线条,"ring"圆环,其实这三个用得都不多

接下来的就是

corners:圆角
android:radius为角的弧度,值越大角越圆。
我们还可以把四个角设定成不同的角度,方法为:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <corners   
  2.     android:topRightRadius="20dp"     
  3.     android:bottomLeftRadius="20dp"     
  4.     android:topLeftRadius="0dp"     
  5.     android:bottomRightRadius="0dp" />   

然后就是

solid      --  填充。
solid:实心,就是填充的意思
android:color指定填充的颜色


还有几个没有用到的

stroke   --  描边。
stroke:描边
android:width="2dp" 描边的宽度,android:color 描边的颜色。
我们还可以把描边弄成虚线的形式,设置方式为:
android:dashWidth="5dp" 
android:dashGap="3dp"
其中android:dashWidth表示'-'这样一个横线的宽度,android:dashGap表示之间隔开的距离。

这个经常用的,我经常用来做一些边框的


就是这样,一些需要到边框的,都可以写一个drawable

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:shape="rectangle" >  
  4.       
  5.     <stroke   
  6.         android:width="1dp"  
  7.         android:color="#ffaaaaaa"/>  
  8.       
  9.     <corners android:radius="8dp"/>  
  10.   
  11.     <solid android:color="@android:color/white"/>  
  12.       
  13. </shape>  

上面的就是那个边框的了,有需要添加边框的都可以写上面那样的一个drawable


还有的就是

gradient   -- 对应颜色渐变。 startcolor、endcolor就不多说了。 android:angle 是指从哪个角度开始变。
gradient:渐变
android:startColor和android:endColor分别为起始和结束颜色,android:angle是渐变角度,必须为45的整数倍。
另外渐变默认的模式为android:type="linear",即线性渐变,可以指定渐变为径向渐变,android:type="radial",径向渐变需要指定半径android:gradientRadius="50"。

这个就非常的少用的了,因为太难控制了,如果图片有多种色彩,还是找美工MM更快一点,自己调的话,还有可能调不出来,所以不推荐使用到它了,

android:angle:渐变的时候,最原始的,即android:angle=“0”时,是从左到右,按照开始颜色到结束颜色来渲染的,android:angle=“90”是从上到下来渲染的,android:angle=“180”是从右到左来渲染的,android:angle=“360”和android:angle=“0”是一样的,所以这里应该是这样的,渲染时按照最原始的渲染色板(把控件内部看作一块可以绕中心旋转的板子)围绕控件中心来旋转相应的度数,即android:angle里面的值就是所需要旋转的角度,只是这个旋转角度必须是45的整数倍

这个是有点复杂的,还是那句,不建议使用,除非真的适用


还有的就是

padding   -- 定义内容离边界的距离 这个很好理解,不多说了


下面给大家演示一下这个怎么用,通过一个自定义进度条来进行演示

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <layer-list xmlns:android="http://schemas.android.com/apk/res/android">  
  3.       
  4.     <item android:id="@android:id/background">  
  5.         <shape>  
  6.             <corners android:radius="5dip" />  
  7.             <solid android:color="#ffffffff"/>  
  8.         </shape>  
  9.     </item>  
  10.       
  11.     <item android:id="@android:id/secondaryProgress">  
  12.         <clip>  
  13.             <shape>  
  14.                 <corners android:radius="5dip" />  
  15.                 <solid android:color="#ff00ff00"/>  
  16.             </shape>  
  17.         </clip>  
  18.     </item>  
  19.       
  20.     <item android:id="@android:id/progress">  
  21.         <clip>  
  22.             <shape>  
  23.                 <corners android:radius="5dip" />  
  24.                 <solid android:color="#ff00ff00"/>  
  25.             </shape>  
  26.         </clip>  
  27.     </item>  
  28.       
  29. </layer-list>  

调用

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <ProgressBar  
  2.         style="?android:attr/progressBarStyleHorizontal"  
  3.         android:layout_width="match_parent"  
  4.         android:layout_height="2dp"  
  5.         android:progress="50"  
  6.         android:progressDrawable="@drawable/progress_horizontal"/>  

其实主要就是

android:progressDrawable="@drawable/progress_horizontal"

把我们编写好的xml指定好就行了

效果如下



好了,下面我们来讲一下,android2.x里面,这个drawable里面的一个bug

在我们上面说到

corners:圆角
android:radius为角的弧度,值越大角越圆。
我们还可以把四个角设定成不同的角度,方法为:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <corners   
  2.     android:topRightRadius="20dp"     
  3.     android:bottomLeftRadius="20dp"     
  4.     android:topLeftRadius="0dp"     
  5.     android:bottomRightRadius="0dp" />   

其实这就是bug来来源,在2.x的android里面bottomRightRadius和bottomLeftTadius是掉转的,可以看一下下面的几张对比图片

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:shape="rectangle" >  
  4.       
  5.     <corners   
  6.         android:topLeftRadius="18dp"  
  7.         android:topRightRadius="0dp"  
  8.         android:bottomLeftRadius="18dp"  
  9.         android:bottomRightRadius="0dp"/>  
  10.   
  11.     <solid android:color="#ff0bd38a"/>  
  12.       
  13. </shape>  


  这个是在2.x里面显示的效果,你会发现,它下面的左右是的掉转的,你要这样写才行的

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:shape="rectangle" >  
  4.       
  5.     <corners   
  6.         android:topLeftRadius="18dp"  
  7.         android:topRightRadius="0dp"  
  8.         android:bottomLeftRadius="0dp"  
  9.         android:bottomRightRadius="18dp"/>  
  10.   
  11.     <solid android:color="#ff0bd38a"/>  
  12.       
  13. </shape>  

但是你这样子写,它到了3.x以上的话就会显示成


这样也是掉转了,十分的坑

后来我就在res目录下面新建一个drawable-v12的目录,把正确的写法,放到这个目录下面去就可以了的

因为3.x之后,都会优先在这个目录下面拿drawable的图片资源,所以这样子就可以拿到正确的写法,不正确的就放在drawable目录下面,以兼容2.x的android

这样修改后就可以得到下面的效果


非常完美的解决了这个bug


其实我们可以依次类推,如果以后发现这样的一些bug也可以这样子类似的来解决的


好了,东西有点多,也有点乱,如果有什么不明白的,请留言,或把代码下载下去看看,里面有所以我在文中提到的xml

好了,下次我们说一下android重启的那些事


源码下载


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值