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

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

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

首先,我们来看一张图片

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

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

/drawable/btn_bg.xml

<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

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

    <solid android:color="#ff0bd38a"/>

</shape>

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

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

<Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/btn_bg"
        android:text="@string/app_name"
        android:textSize="25sp"
        android:textColor="@android:color/white"/>

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

接下来的就是

corners:圆角

android:radius为角的弧度,值越大角越圆。

我们还可以把四个角设定成不同的角度,方法为:

<corners
    android:topRightRadius="20dp"
    android:bottomLeftRadius="20dp"
    android:topLeftRadius="0dp"
    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

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <stroke
        android:width="1dp"
        android:color="#ffaaaaaa"/>

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

    <solid android:color="@android:color/white"/>

</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   -- 定义内容离边界的距离 这个很好理解,不多说了

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

<?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:radius="5dip" />
            <solid android:color="#ffffffff"/>
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <solid android:color="#ff00ff00"/>
            </shape>
        </clip>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <solid android:color="#ff00ff00"/>
            </shape>
        </clip>
    </item>

</layer-list>

调用

<ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:progress="50"
        android:progressDrawable="@drawable/progress_horizontal"/>

其实主要就是

android:progressDrawable="@drawable/progress_horizontal"

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

效果如下

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

在我们上面说到

corners:圆角

android:radius为角的弧度,值越大角越圆。

我们还可以把四个角设定成不同的角度,方法为:

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

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

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <corners
        android:topLeftRadius="18dp"
        android:topRightRadius="0dp"
        android:bottomLeftRadius="18dp"
        android:bottomRightRadius="0dp"/>

    <solid android:color="#ff0bd38a"/>

</shape>

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

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <corners
        android:topLeftRadius="18dp"
        android:topRightRadius="0dp"
        android:bottomLeftRadius="0dp"
        android:bottomRightRadius="18dp"/>

    <solid android:color="#ff0bd38a"/>

</shape>

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

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

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

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

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

非常完美的解决了这个bug

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

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

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

源码下载

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

时间: 2024-12-15 00:02:56

Android drawable 玩转自定义图片以及bug的解决的相关文章

关于Android2.X系统自定义图片圆角BUG的解决

今天在做项目的时候遇到的一个问题. 预期的效果是这样的: 可是在2.X系统得到的却是这样的: 左部分代码如下: <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <solid android:color="@color/white" /

android listview 异步加载图片并防止错位 解决办法

网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertView 但没有异步操作也不会有问题. 我简单分析一下: 当重用 convertView 时,最初一屏显示 7 条记录, getView 被调用 7 次,创建了 7 个 convertView. 当 Item1 划出屏幕, Item8 进入屏幕时,这时没有为 Item8 创建新的 view 实例, Ite

浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

自从Android3.0引入了Fragment之后,使用Activity去嵌套一些Fragment的做法也变得更加流行,这确实是Fragment带来的一些优点,比如说:Fragment可以使你能够将activity分离成多个可重用的组件,每个都有它自己的生命周期和UI,更重要的是Fragment解决了Activity间的切换不流畅,实现了一种轻量及的切换,但是在官方提供的android.support.v4包中,Fragment还是或多或少的存在一些BUG,今天就与大家分享一下这些BUG和解决方

Android Studio 添加httpmime,httpcore遇到的BUG和解决办法。

今天上传文件的时候用了MultipartEntityBuilder,添加了httpcore等2个依赖库,编译运行的时候,studio出现一个奇怪的错误提示: Duplicate files copied in APK META-INF/DEPENDENCIES File 1: /home/bluelife/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.3.1/f7899276dddd01d8a42e

Android实现圆形、圆角和椭圆自定义图片View(使用BitmapShader图形渲染方法)

一.概述 Android实现圆角矩形,圆形或者椭圆等图形,一般主要是个自定义View加上使用Xfermode实现的.实现圆角图片的方法其实不少,常见的就是利用Xfermode,Shader.本文直接继承ImageView,使用BitmapShader方法来实现圆形.圆角和椭圆的绘制,等大家看我本文的方法后,其他的类似形状也就都能举一反三来来画出来了. 二.效果图: 三.BitmapShader简介 BitmapShader是Shader的子类,可以通过Paint.setShader(Shader

[Android] 对自定义图片浏览器经常内存溢出的一些优化

首先关于异步加载图片可以参见 夏安明 的博客:http://blog.csdn.net/xiaanming/article/details/9825113 这篇文章最近有了新的更改,大概看了一下,内容更完善了.而我参考他之前的代码,发现了很多与内存有关的问题,这里记录一下发现的问题和解决方法. 本文地址:http://www.cnblogs.com/rossoneri/p/4284478.html 首先上个功能图: 1.本地图片浏览器做成对话框的形式,可以显示文件夹 2. 图片支持多选 3. 图

Android Drawable Mipmap Vector使用及Vector兼容

原文地址:http://blog.csdn.net/eclipsexys/article/details/51838119 http://blog.csdn.net/qq_15545283/article/details/51472458 一.谷歌在app中图标的适配的历史 在安卓的发展历程中,由于设备碎片化的原故,谷歌在app中图标的适配上做出一步又一步的改进,大体有这么几个阶段: 首先有了drawable-(m|h|xh|xxh|xxxh)dpi 自android studio后,又有了mi

Android Drawable的9种子类 介绍

原文: Android Drawable的9种子类 介绍 Drawable 在android里面 就是代表着图像,注意是图像 而不是图片. 图片是图像的子集.图像除了可以包含图片以外 还可以包含颜色. 换句话说Drawble就是canvas 可以绘制的 一种概念. android 系统自带了很多种drawable.我们最好对自带的drawable 有一种比较熟悉的了解, 这样对我们apk开发很有好处,因为drawable使用 非常简单 基本上就是xml编写 即可.比你自己自定义view的成本要低

Android进阶之绘制-自定义View完全掌握(二)

这是自定义View系列的第二篇博客,我们继续来学习关于自定义View的知识. 今天我们来实现一下广告条案例. 我们要实现的是这样的一个效果. 要想实现这样的效果,我们可以借助ViewPager控件,然后加上自定义的一些控件即可完成.那么现在就开始吧. 新建一个android项目. 修改activity_main.xml文件. <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:a