android中图形图像处理之drawable用法分析
本文实例讲述了android中图形图像处理之drawable用法。分享给大家供大家参考。具体如下:
一、如何获取 res 中的资源
数据包package:android.content.res
主要类:resources
其主要接口按照功能,划分为以下三部分:
getxxxx()
例如:
int getcolor(int id)
drawable getdrawable(int id)
string getstring(int id) 直接获取res中存放的资源
inputstream openrawresource(int id) 获取资源的数据流,读取资源数据
void parsebundleextras(xmlresourceparser parser, bundle outbundle) 从xml文件中获取数据
resource为每种资源提供了相应的接口来获取这种资源,除了可以直接获取资源外,还额外提供了以数据流的方式获取资源,这在以后的应用程序开发中会经常使用,那么如何获取resources了,如下:resources r = this.getcontext().getresources();
二、如何获取资源中的画图对象
数据包package:android.graphics.drawable
主要类:drawable
drawable是个virtual class,具体如何画图,需要具体分析drawable的子类,例如:bitmapdrawable
其主要接口如下:
bitmapdrawable()
bitmapdrawable(bitmap bitmap)
bitmapdrawable(string filepath)
bitmapdrawable(inputstream is)
void draw(canvas canvas)
final bitmap getbitmap()
final paint getpaint()
drawable是个抽象类,在bitmapdrawable中我们就看到位图的具体操作,在仔细看下bitmapdrawable的构造函数,我们就会发现与resource中的openrawresource()接口是相对应的,就可以通过以下方法来获取位图:
resources r = this.getcontext().getresources(); inputstream is = r.openrawresource(r.drawable.my_background_image); bitmapdrawable bmpdraw = new bitmapdrawable(is); bitmap bmp = bmpdraw.getbitmap();
paint
数据包package:android.graphics
android sdk中的简介:the paint class holds the style and color information about how to draw geometries, text and bitmaps. 主要就是定义:画刷的样式,画笔的大小/颜色等。
typeface
数据包 package:android.graphics
android sdk中的简介:the typeface class specifies the typeface and intrinsic style of a font. 主要就是定义:字体。
核心类显示资源
数据包package:android.graphics
主要类:canvas
android sdk中的简介:the canvas class holds the “draw” calls. to draw something, you need 4 basic components: a bitmap to hold the pixels, a canvas to host the draw calls (writing into the bitmap), a drawing primitive (e.g. rect, path, text, bitmap), and a paint (to describe the colors and styles for the drawing).
按照结构的功能,将主要接口分为以下3部分:
boolean clipxxxx() region区域操作:difference intersect replace reverse_difference union xor
void drawxxxx()画图函数
void rotate() void scale() void skew() void translate() 画布操作函数
region在这里需要特殊说明下:region就是一个区域,也就是画布(canvas)中的有效区域,在无效区域上draw,对画布没有任何改变。
drawable类
drawable是一个通用的抽象类,它的目的是告诉你什么东西是可以画的。你会发现基于drawable类扩展出各种绘图的类,见下面的表格,当然你可以继承它来创建你自己的绘图类.
有三种方法可以定义和实例化一个drawable:保存一个图片到你工程资源中,使用xml文件来描述drawable属性或者用一个正常的类去构造。下面我们将讨论两种技术(对一个有开发经验的开发者来说构造并不是最新的技术)。
从资源图像文件中创建
一个比较简单的方法是添加一个图片到你的程序中,然后通过资源文件引用这个文件,支持的文件类型有png(首选的) jpg(可接受的)gif(不建议),显然这种对于显示应用程序的图标跟来说是首选的方法,也可以用来显示logo,其余的图片可以用在例如游戏中。
把一个图片资源,添加你的文件到你工程中res/drawable/目录中去,从这里,你就可以引用它到你的代码或你的xml布局中,也就是说,引用它也可以用资源编号,比如你选择一个文件只要去掉后缀就可以了(例如:my_image.png 引用它是就是my_image)。
注意:sdk指出,为了缩小图片的存储空间,在build的时候又可能对图片进行压缩,如果不想被压缩,可以将图片放在res/raw/目录中。
sdk给出的例子:
linearlayout mlinearlayout; protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); // create a linearlayout in which to add the imageview mlinearlayout = new linearlayout(this); // instantiate an imageview and define its properties imageview i = new imageview(this); i.setimageresource(r.drawable.my_image); i.setadjustviewbounds(true); // set the imageview bounds to match the drawable's dimensions i.setlayoutparams(new gallery.layoutparams(layoutparams.wrap_content, layoutparams.wrap_content)); // add the imageview to the layout and set the layout as the content view mlinearlayout.addview(i); setcontentview(mlinearlayout); }获取drawable对象: resources res = mcontext.getresources(); drawable myimage = res.getdrawable(r.drawable.my_image);
注意:保持每个资源类型的一至,可以保证你项目状态的一致性,就不用担心有许多不同类型的对象来实例化它。例如:如果使用相同的图像资源来实例化两个drawable对象。然后修改一个drawables的属性(例如alpha),然后不幸得是这个效果也会出现在另一个对象上去。所以当处理同一个资源的多个实例对象时,不是直接转换为drawable,而是应该执行tween animation
如何添加资源到imageview:
<imageview android:layout_width="wrap_content" android:layout_height="wrap_content" android:tint="#55ff0000" android:src="@drawable/my_image"/>
从xml文件中创建
到如今,你应该比较熟悉按android的原则去开发一个用户接口,因此,你也应该理解了定义一个xml文件对于对象的作用与灵活的重要性。这个理念无数次用于drawables.
如果你想创建一个drawable对象,而这个对象并不依赖于变量或用户的交换,把它定义到xml中去应该是一个不错的方法。即使你期望在你的应用程序中改变其属性来增加用户体验。你应该考虑把对象放入xml中,因为你可以随时修改其属性。
当你在你的xml中定义了一个drawable,保存这个xml文件到你工程目录下res/drawable目录中,然后通过调用resource.getdrawable()来检索并实例化,传递给它xml文件中的资源id号。任何drawable的子类都支持inflate这个方法,这个方法会通过xml来实例化你的程序。任何drawable都支持xml的扩展来利用特殊的xml属性来帮助定义对象的属性,可以查看任何drawable子类文档来看如何定义xml文件。
如下定义了一个transitiondrawable:an extension of layerdrawables that is intended to cross-fade between the first and second layer. it can be defined in an xml file with the <transition> element. each drawable in the transition is defined in a nested <item>. 有关transitiondrawable的详细信息查看http://androidappdocs.appspot.com/reference/android/graphics/drawable/transitiondrawable.html。
将其定义在res/drawable/expand_collapse.xml:
<?xml version="1.0" encoding="utf-8"?> <transition xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/pic1"/> <item android:drawable="@drawable/pic2"/> </transition>
下面实例化并处理:
public class mainactivity extends activity { /** called when the activity is first created. */ @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); resources res=getresources(); transitiondrawable trans=(transitiondrawable )res.getdrawable(r.drawable.expand_collapse); imageview image = (imageview)findviewbyid(r.id.imageview01); image.setimagedrawable(trans); trans.starttransition(3000); } }shapedrawable
当你想去画一些动态的二维图片,一个shapedrawable对象可能会对你有很大的帮助。通过shapedrawable,你可以通过编程画出任何你想到的图像与样式。
shapedrawable继承了drawable, 所以你可以调用drawable里有的函数,比如视图的背景,通过setbackgrounddrawable()设置。当然,你可以在自定义的视图布局中画你的图形,因为shapedrawable有自己的draw()方法。你可以在view.ondraw()方法期间创建一个视图的子类去画shapedrawable。
shapedrawable类(像很多其他drawable类型在android.graphics.drawable包)允许你定义drawable公共方法的各种属性。有些属性你可以需要调整,包括透明度,颜色过滤,不透明度,颜色。
ninepatchdrawable
ninepatchdrawable 绘画的是一个可以伸缩的位图图像,android会自动调整大小来容纳显示的内容。一个例子就是ninepatch为背景,使用标准的android按钮,按钮必须伸缩来容纳长度变化的字符
ninepatchdrawable是一个标准的png图像,它包括额外的1个像素的边界,你必须保存它后缀为.9.png,并且保持到工程的res/drawable目录中。
这个边界是用来确定图像的可伸缩和静态区域。你可以在左边和上边的线上画一个或多个黑色的1个像素指出可伸缩的部分(你可以需要很多可伸缩部分),它的相对位置在可伸缩部分相同,所以大的部分总是很大的。
你还有可以在图像的右边和下边画一条可选的drawable区域(有效的,内边距线)。如果你的视图对象设置ninepath为背景然后指定特殊的视图字体,它将自行伸缩使所有的文本来适应根据右线与底部线设计好的区域(如果有的话),当然内边距线不包括其中,android可以使用左边的线与上面的线来定义一个drawable区域。
我们来澄清一下这两条不同的线,左边跟顶部的线来定义哪些图像的像素允许在伸缩时被复制。底部与右边的线用来定义一个相对位置内的图像,视图的内容就放入其中。
希望本文所述对大家的android程序设计有所帮助。
上一篇: 对微博营销深入的了解
下一篇: 微博营销的三大优势,你知道都有哪些吗?
推荐阅读
-
android中图形图像处理之drawable用法分析
-
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析_PHP
-
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析_php实例
-
Android入门之AlertDialog用法实例分析
-
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析,ciuristring
-
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析,ciuristring
-
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析_php实例
-
Android编程中Handler原理及用法实例分析
-
Android编程四大组件之Activity用法实例分析
-
Android编程中PopupWindow的用法分析【位置、动画、焦点】