一、如何创建一个BitmapDrawable对象

Bitmap,代表一个位图图像,Android支持三种格式的位图图像:.png (preferred),.jpg (acceptable), .gif (discouraged)。

括号里的说明,代表这三种格式的图片在Android中的支持情况,.png格式图片优先,.jpg格式也可以,但是效果没有.png好,.gif支持最差。

可以直接使用图片的名称作为资源ID,来直接引用一个位图图片。也可以再XML文件中创建一个资源别名的ID。

在构建应用的时候,Bitmap文件可能会被appt工具压缩自动优化为无损图像。例如,一个真彩色PNG,不需要超过256的颜色可以被转换成一个8位PNG和调色板。这将导致一个图像质量相同,但这需要更少的内存。所以要意识到,在drawable目录中图像的二进制文件在构建程序时可以改变。如果你打算读一个图像作为字节流并将它转换成一个位图,把你的图片放在在res /raw/文件夹里,在那里他们不会被优化。

1、通过Bitmap File

一个bitmap文件就是一个.png、.jpg,.gif格式的文件。Android会对存储在res/drawable/目录下的这些文件创建一个Drawable资源。

文件位置:

       res/drawable/filename.png (.png, .jpg, or .gif)    文件名即资源的ID。

编译资源数据类型:
             指向BitmapDrawable类型的指针。
资源引用:

In Java: R.drawable.filename
In XML: @[package:]drawable/filename
示例:
有这样存储的图片 res/drawable/myimage.png,在layout xml文件中将他显示在视图上。
    android:layout_height="wrap_content"    android:layout_width="wrap_content"    android:src="@drawable/myimage" />

在java代码中检索出为一个Drawable对象。

            
        Resources res=getResources();        Drawable drawable = res.getDrawable(R.drawable.myimage);        //实际上这是一个BitmapDrawable对象        BitmapDrawable bitmapDrawable=(BitmapDrawable)drawable;        //可以在调用getBitmap方法,得到这个位图        Bitmap bitmap=bitmapDrawable.getBitmap();

参考:
  • 2D Graphics
  • BitmapDrawable

2、通过XML Bitmap

一个XML bitmap是一个在XML文件中定义的指向一个bitmap文件的资源。其效果是作为一个原始位图文件的别名,并且可以指定一些额外的属性。

注意:你可以在节点中使用作为它的子节点。比如,当你定义一个state list或者layer list的时候,可以包括一个 android:drawable属性

Note: You can use a element as a child of an element. Forexample, when creating astate list orlayer list,you can exclude the android:drawableattribute from an element and nest a inside it that defines the drawable item.

文件位置:
res/drawable/filename.xml
filename作为资源的ID
编译资源类型
指向BitmapDrawable类型的指针
资源引用
In Java: R.drawable.filename
In XML: @[package:]drawable/filename
语法:
<?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: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"] />
节点介绍:
定义位图的来源和属性

属性:

xmlns:android
类型:String。定义了XML的命名空间,必须是"http://schemas.android.com/apk/res/android"。如果是根元素,那么他是必须的,如果是嵌套在里面,那么就不是必须的。
android:src
类型:Drawable resource。必需。 引用一个drawableresource.
android:antialias
类型:Boolean。是否开启抗锯齿。
android:dither
类型:Boolean。如果位图与屏幕的像素配置不同时,是否允许抖动.(例如:一个位图的像素设置是 ARGB 8888,但屏幕的设置是RGB 565)
android:filter
类型:Boolean。是否允许对位图进行滤波。对位图进行收缩或者延展使用滤波可以获得平滑的外观效果。
android:gravity
类型:关键字。定义位图的重力(gravity),如果位图小于其容器,使用重力指明在何处绘制

必需是下面的属性,多个之间用  |  分隔

Value Description
top Put the object at the top of its container, not changing its size.
bottom Put the object at the bottom of its container, not changing its size.
left Put the object at the left edge of its container, not changing its size.
right Put the object at the right edge of its container, not changing its size.
center_vertical Place object in the vertical center of its container, not changing its size.
fill_vertical Grow the vertical size of the object if needed so it completely fills its container.
center_horizontal Place object in the horizontal center of its container, not changing its size.
fill_horizontal Grow the horizontal size of the object if needed so it completely fills its container.
center Place the object in the center of its container in both the vertical and horizontal axis, notchanging its size.
fill Grow the horizontal and vertical size of the object if needed so it completely fills itscontainer. This is the default.
clip_vertical Additional option that can be set to have the top and/or bottom edges of the child clipped toits container's bounds. The clip is based on the vertical gravity: a top gravity clips thebottom edge, a bottom gravity clips the top edge, and neither clips both edges.
clip_horizontal Additional option that can be set to have the left and/or right edges of the child clipped toits container's bounds. The clip is based on the horizontal gravity: a left gravity clipsthe right edge, a right gravity clips the left edge, and neither clips both edges.
android:tileMode
类型:Keyword
定义了tile模式。当tile模式被启用,位图是重复的,并且gravity属性将被忽略。

必须是下列之一常量值:
Value Description
disabled Do not tile the bitmap. This is the default value.
clamp Replicates the edge color if the shader draws outside of its original bounds
repeat Repeats the shader's image horizontally and vertically.
mirror Repeats the shader's image horizontally and vertically, alternating mirror images so thatadjacent images always seam.
示例:
<?xml version="1.0" encoding="utf-8"?> xmlns:android="http://schemas.android.com/apk/res/android"    android:src="@drawable/icon"    android:tileMode="repeat" />
参考:
  • BitmapDrawable
  • Creatingalias resources

二、BitmapDrawable的使用

一个BitmapDrawable就是封装了一个位图。直接以文件的方式,就是封装了一个原始的位图。以Xml方式,可以对原始的位图进行一系列的处理,比如说抗锯齿,拉伸,对齐等等。

要了解BitmapDrawable的使用,还需要明白Bitmap、BitmapFactory等类。Bitmap代表了一个原始的位图,并且可以对位图进行一系列的变换操作。BitmapFactory提供一系列的方法用于产生一个Bitmap对象。多用在Canvas中。

关于绘图和位图变换以后再学习。BitmapDrawable的使用比较简单,就是在其他的xml文件中直接引用就可以了,不过要注意在xml中定义BitmapDrawable各个属性使用和含义。






更多相关文章

  1. TextView文字阴影效果以及styles文件的使用
  2. 分析Android 根文件系统启动过程(init守护进程分析)
  3. Android 根文件系统启动过程(init进程 详细分析)
  4. 批量反编译Android XML文件Python脚本
  5. android文件管理实现源码
  6. Android 最简单的SD卡文件遍历程序
  7. android JNI java与C++传递String数组(引用类型)

随机推荐

  1. Android 框架类图
  2. android 6.0编译时出现ERROR:Security pro
  3. android 键盘关闭/显示
  4. android 服务器与客户端
  5. Windows环境下搭建Cocos2dx的android开发
  6. Android三种实现定时器的方法
  7. android dialog 背景透明的样式
  8. SurfaceView设置透明效果
  9. android的listView中设置line
  10. Android SDK Manager不能显示所有包的解