本文出自 “阿敏其人” 简书博客,转载或引用请注明出处。
1、BitmapDrawable
Bitmap,代表一个位图图像,Android支持三种格式的位图图像:.png (preferred),.jpg (acceptable), .gif (discouraged)。
括号里的说明,代表这三种格式的图片在Android中的支持情况,.png格式图片优先,.jpg格式也可以,但是效果没有.png好,.gif支持最差。
在构建应用的时候,Bitmap文件可能会被appt工具压缩自动优化为无损图像。例如,一个真彩色PNG,不需要超过256的颜色可以被转换成一个8位PNG和调色板。这将导致一个图像质量相同,但这需要更少的内存。所以要意识到,在drawable目录中图像的二进制文件在构建程序时可以改变。如果你打算读一个图像作为字节流并将它转换成一个位图,把你的图片放在在res /raw/文件夹里,在那里他们不会被优化。
可以直接使用图片的名称作为资源ID,来直接引用一个位图图片。也可以再XML文件中创建一个资源别名的ID。
明明图片拉进去对应的文件之后我们就直接设置为背景,那么谷歌还要弄一个BitmapDrawable干嘛,简单说就是你直接设背景能控制背景怎么对齐吗,能控制背景如何平铺吗,不能。
所以最看得见的好处就是:
- BitmapDrawable可以设定背景的对齐方式
- BitmapDrawable可以设定背景的对齐方式。
有图有真相:
1.1、最简单的BitmapDrawable的使用方法:
在程序的drawable文件面新建一个文件:
内容如下:
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/demo_pic"
android:tileMode="repeat"
>
</bitmap>
然后在activity的布局文件随便写一个TextView,宽高比我们的src对应的图片大一些,然后把刚刚的 根元素为bitmap 的xml文件设为该TextView的背景
然后运行程序,即可看到效果。
1.2 BitmapDrawable 用法简述
BitmapDrawable的xml需要什么?
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/demo_pic"
android:tileMode="repeat"
>
</bitmap>
- 开头
<?xml version="1.0" encoding="utf-8"?>是xml必须的,不必说 - 根元素
BitmapDrawable对应的根元素就是 bitmap,也没什么可说 - 节点
src 节点是必不可少的。
也就是说:在一个根元素是bitmap带src节点的xml文件。
其他的节点就是修饰,比如我们还用到的 tileMode
BitmapDrawable可设置的节点
<?xml version="1.0" encoding="utf-8"?>
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@[package:]drawable/drawable_resource"
android:antialias=["true" | "false"]
android:dither=["true" | "false"]
android:filter=["true" | "false"]
android:mipmap=["true" | "false"]
android:gravity=["top" | "bottom" | "left" | "right" | "center_vertical" |
"fill_vertical" | "center_horizontal" | "fill_horizontal" |
"center" | "fill" | "clip_vertical" | "clip_horizontal"]
android:tileMode=["disabled" | "clamp" | "repeat" | "mirror"] >
</bitmap>
xmlns:android
类型:String。
定义了命名空间,必须是"http://schemas.android.com/apk/res/android"。
如果<bitmap>是根元素,那么他是必须的,
如果是嵌套在<itme>里面,那么就不是必须的。比如我们上面就不用。android:src 资源id
没什么可说,图片资源idandroid:antialias 抗锯齿
是否开启抗锯齿,图片会更加平滑,会降低清楚度,但是基本忽略,所以,开android:dither 抖动效果
是否开启抖动,开。
抖动的作用:让高质量的图片的比较低质量的屏幕上不失真,得到比较好的显示效果。
比如图片的色彩模式是 ARGB8888,但是手机设备的支持RGB555的色彩模式,那么开启这么就可以有效减少失真现象。
(Android中我们创建的Bitmap一般会选择ARGB888模式,ARGB每个通道各占8位,8位1个字节,一个像素4个字节,一个像素的位数总和越高,图片越逼真)
android:filter 过滤效果
开。在图片图片被拉伸或者压缩的时候开启过滤效果可以显示更加好的效果。android:gravity 图片的对齐效果
android:mipmap 纹理映射,as里面就用了这个了。先默认为false(待考究)
gravity 选项的可选项
可选项 | 含义 |
---|---|
top | 保持原有大小,图片至于容器的顶部 |
bottom | 保持原有大小,图片至于容器的底部 |
left | 保持原有大小,图片至于容器的左部 |
right | 保持原有大小,图片至于容器的右部 |
center_vertical | 保持原有大小,图片垂直居中 |
fill_vertical | 图片垂直方向填充容器 |
center_horizontal | 保持原有大小,图片水平居中 |
fill_horizontal | 图片水平方向填充容器 |
center | 保持原有大小,图片同时水平和垂直居中 |
fill | 默认值,同时水平和垂直拉伸 |
clip_vertical | 附加项,表示水平方向的裁剪 |
clip_horizontal | 附加项,表示水平方向的裁剪 |
需要说明的是,这些对其方式可以利用 | 符号同时使用,比如
android:gravity="top|left"
- android:tileMode 平铺模式
**当开启 tileMode 之后 ,gravity 属性会被忽略 **
tileMode 选项的可选项
可选项 | 含义 |
---|---|
disabled | �关闭平铺模式 |
clamp | 大小不变,像素在四周扩散 |
repeat | 常见的水平和垂直方向的平铺 |
mirror | 水平和垂直方向的镜面投影 |
全部节点介绍完了。
总结,节点很多,最需要的关心的(最能看到区别的)就是gravity和tileMode。
1.3 demo示例
这里贴上代码,分别看一下的2个gravity的对其效果和4中tileMode的效果:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="原样"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="原样"
android:background="@mipmap/demo_pic"
android:layout_marginBottom="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="直接src调用,直接调用图片"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="直接src调用,直接调用图片"
android:background="@mipmap/demo_pic"
android:layout_marginBottom="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用drawable下面的bitmap文件"/>
<!--默认是作为背景是整体拉伸的-->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用drawable下面的bitmap文件"
android:background="@drawable/bitmapdrawable_simple"
android:layout_marginBottom="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下面举两个例子说明 gravity节点"
android:textSize="30sp"
/>
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:text="下面举两个例子说明 gravity节点"
android:textSize="30sp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用bitmap文件 gravity top"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="调用bitmap文件 gravity top"
android:background="@drawable/bitmapdraw_gravity_top"
android:layout_marginBottom="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用bitmap文件 gravity left"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="100dp"
android:text="调用bitmap文件 gravity left"
android:background="@drawable/bitmapdraw_gravity_left"
android:layout_marginBottom="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下面说的都是tileMode"
android:layout_marginBottom="10dp"
android:textSize="30sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用bitmap文件 tileMode disabled"/>
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:text="调用bitmap文件 tileMode disabled"
android:background="@drawable/bitmapdraw_tilemode_disabled"
android:layout_marginBottom="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用bitmap文件 tileMode clamp"/>
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:text="调用bitmap文件 tileMode clamp"
android:background="@drawable/bitmapdraw_tilemode_clamp"
android:layout_marginBottom="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用bitmap文件 tileMode report"/>
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:text="调用bitmap文件 tileMode report"
android:background="@drawable/bitmapdraw_tilemode_report"
android:layout_marginBottom="10dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="调用bitmap文件 tileMode mirror"/>
<TextView
android:layout_width="100dp"
android:layout_height="100dp"
android:text="调用bitmap文件 tileMode mirror"
android:background="@drawable/bitmapdraw_tilemode_mirror"
android:layout_marginBottom="10dp"
/>
</LinearLayout>
</ScrollView>
</LinearLayout>
附上xml文件
.
.
bitmapdrawable_simple.xml
<?xml version="1.0" encoding="utf-8"?>
<!--
这是 bitmapdrawable 最简单的用法
根元素 名称必须是 bitmap
src 节点必不可少
也就是说最简答就是: 根元素为bitmap下戴一个有效的src节点
-->
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/demo_pic">
</bitmap>
.
.
bitmapdraw_gravity_left.xml
<?xml version="1.0" encoding="utf-8"?>
<!--android:gravity="left"-->
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:gravity="left"
android:src="@mipmap/demo_pic"></bitmap>
.
.
bitmapdraw_gravity_top.xml
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/demo_pic"
android:gravity="top"
>
</bitmap>
.
.
bitmapdraw_tilemode_clamp.xml
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/demo_pic"
android:tileMode="clamp"
>
</bitmap>
.
.
bitmapdraw_tilemode_disabled.xml
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/demo_pic"
android:tileMode="disabled"
>
</bitmap>
.
.
bitmapdraw_tilemode_mirror.xml
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/demo_pic"
android:tileMode="mirror"
>
</bitmap>
.
.
bitmapdraw_tilemode_report.xml
<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@mipmap/demo_pic"
android:tileMode="repeat"
>
</bitmap>
了解更多的Drawable分类 Drawable图像资源抽象类
本篇完。
相关参考:
《android开发艺术探索》