Android Drawable绘图学习小结
2011-02-11 19:49
399 查看
如何获取res中的资源
数据包package:android.content.res
主要类:Resources
AndroidSDK中的简介:Classforaccessinganapplication’sresources.Classforaccessinganapplication’sresources.Thissitsontopoftheassetmanageroftheapplication(accessiblethroughgetAssets())andprovidesahigher-levelAPIforgettingtypeddatafromtheassets.
其主要接口按照功能,划分为以下三部分:
getXXXX()
例如:
intgetColor(intid)
DrawablegetDrawable(intid)
StringgetString(intid)直接获取res中存放的资源
InputStreamopenRawResource(intid)获取资源的数据流,读取资源数据
voidparseBundleExtras(XmlResourceParserparser,BundleoutBundle)从XML文件中获取数据
Resource为每种资源提供了相应的接口来获取这种资源,除了可以直接获取资源外,还额外提供了以数据流的方式获取资源,这在以后的应用程序开发中会经常使用,那么如何获取Resources了,如下:Resourcesr=this.getContext().getResources();
如何获取资源中的画图对象
数据包package:android.graphics.drawable
主要类:Drawable
AndroidSDK中的简介:ADrawableisageneralabstractionfor“somethingthatcanbedrawn.”MostoftenyouwilldealwithDrawableasthetypeofresourceretrievedfordrawingthingstothescreen;theDrawableclassprovidesagenericAPIfordealingwithanunderlyingvisualresourcethatmaytakeavarietyofforms.
看了以上简介,发现Drawable是个virtualclass,具体如何画图,需要具体分析Drawable的子类,例如:BitmapDrawable
AndroidSDK中的简介:ADrawablethatwrapsabitmapandcanbetiled,stretched,oraligned.YoucancreateaBitmapDrawablefromafilepath,aninputstream,throughXMLinflation,orfromaBitmapobject.ItcanbedefinedinanXMLfilewiththe
其主要接口如下:
BitmapDrawable()
BitmapDrawable(Bitmapbitmap)
BitmapDrawable(Stringfilepath)
BitmapDrawable(InputStreamis)
voiddraw(Canvascanvas)
Drawinitsbounds(setviasetBounds)respectingoptionaleffectssuchasalpha(setviasetAlpha)andcolorfilter(setviasetColorFilter).
finalBitmapgetBitmap()
finalPaintgetPaint()
Drawable是个抽象类,在BitmapDrawable中我们就看到位图的具体操作,在仔细看下BitmapDrawable的构造函数,我们就会发现与Resource中的openRawResource()接口是相对应的,就可以通过以下方法来获取位图:
Resourcesr=this.getContext().getResources();
Inputstreamis=r.openRawResource(R.drawable.my_background_image);
BitmapDrawablebmpDraw=newBitmapDrawable(is);
Bitmapbmp=bmpDraw.getBitmap();
Paint
数据包package:android.graphics
AndroidSDK中的简介:ThePaintclassholdsthestyleandcolorinformationabouthowtodrawgeometries,textandbitmaps.主要就是定义:画刷的样式,画笔的大小/颜色等。
Typeface
数据包package:android.graphics
AndroidSDK中的简介:TheTypefaceclassspecifiesthetypefaceandintrinsicstyleofafont.主要就是定义:字体。
核心类显示资源
数据包package:android.graphics
主要类:Canvas
AndroidSDK中的简介:TheCanvasclassholdsthe“draw”calls.Todrawsomething,youneed4basiccomponents:ABitmaptoholdthepixels,aCanvastohostthedrawcalls(writingintothebitmap),adrawingprimitive(e.g.Rect,Path,text,Bitmap),andapaint(todescribethecolorsandstylesforthedrawing).
按照结构的功能,将主要接口分为以下3部分:
booleanclipXXXX()Region区域操作:DIFFERENCEINTERSECTREPLACEREVERSE_DIFFERENCEUNIONXOR
voiddrawXXXX()画图函数
voidrotate()voidscale()voidskew()voidtranslate()画布操作函数
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给出的例子:
获取Drawable对象:
注意:保持每个资源类型的一至,可以保证你项目状态的一致性,就不用担心有许多不同类型的对象来实例化它。例如:如果使用相同的图像资源来实例化两个Drawable对象。然后修改一个Drawables的属性(例如alpha),然后不幸得是这个效果也会出现在另一个对象上去。所以当处理同一个资源的多个实例对象时,不是直接转换为Drawable,而是应该执行tweenanimation
如何添加资源到ImageView:
从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:AnextensionofLayerDrawablesthatisintendedtocross-fadebetweenthefirstandsecondlayer.ItcanbedefinedinanXMLfilewiththehttp://androidappdocs.appspot.com/reference/android/graphics/drawable/TransitionDrawable.html。
将其定义在res/drawable/expand_collapse.xml:
下面实例化并处理:
ShapeDrawable
当你想去画一些动态的二维图片,一个ShapeDrawable对象可能会对你有很大的帮助。通过ShapeDrawable,你可以通过编程画出任何你想到的图像与样式。
ShapeDrawable继承了Drawable,所以你可以调用Drawable里有的函数,比如视图的背景,通过setBackgroundDrawable()设置。当然,你可以在自定义的视图布局中画你的图形,因为ShapeDrawable有自己的draw()方法。你可以在View.OnDraw()方法期间创建一个视图的子类去画ShapeDrawable。
ShapeDrawable类(像很多其他Drawable类型在android.graphics.drawable包)允许你定义drawable公共方法的各种属性。有些属性你可以需要调整,包括透明度,颜色过滤,不透明度,颜色。
例子:
显示:
在XML中定义方法:如果你想用XML文件配置来取代原有布局来画自定义的drawable,于是你自定义的Drawable类必须重载view(Context,AttributeSet)构造函数。
NinePatchDrawable
NinePatchDrawable绘画的是一个可以伸缩的位图图像,Android会自动调整大小来容纳显示的内容。一个例子就是NinePatch为背景,使用标准的Android按钮,按钮必须伸缩来容纳长度变化的字符
NinePatchDrawable是一个标准的PNG图像,它包括额外的1个像素的边界,你必须保存它后缀为.9.png,并且保持到工程的res/drawable目录中。
这个边界是用来确定图像的可伸缩和静态区域。你可以在左边和上边的线上画一个或多个黑色的1个像素指出可伸缩的部分(你可以需要很多可伸缩部分),它的相对位置在可伸缩部分相同,所以大的部分总是很大的。
你还有可以在图像的右边和下边画一条可选的drawable区域(有效的,内边距线)。如果你的视图对象设置NinePath为背景然后指定特殊的视图字体,它将自行伸缩使所有的文本来适应根据右线与底部线设计好的区域(如果有的话),当然内边距线不包括其中,Android可以使用左边的线与上面的线来定义一个drawable区域。
我们来澄清一下这两条不同的线,左边跟顶部的线来定义哪些图像的像素允许在伸缩时被复制。底部与右边的线用来定义一个相对位置内的图像,视图的内容就放入其中。
使用方法:
参考:AndroidSDKeoeandroid.commoandroid.com
作者:Feisky
出处:http://www.cnblogs.com/feisky/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
数据包package:android.content.res
主要类:Resources
AndroidSDK中的简介:Classforaccessinganapplication’sresources.Classforaccessinganapplication’sresources.Thissitsontopoftheassetmanageroftheapplication(accessiblethroughgetAssets())andprovidesahigher-levelAPIforgettingtypeddatafromtheassets.
其主要接口按照功能,划分为以下三部分:
getXXXX()
例如:
intgetColor(intid)
DrawablegetDrawable(intid)
StringgetString(intid)直接获取res中存放的资源
InputStreamopenRawResource(intid)获取资源的数据流,读取资源数据
voidparseBundleExtras(XmlResourceParserparser,BundleoutBundle)从XML文件中获取数据
Resource为每种资源提供了相应的接口来获取这种资源,除了可以直接获取资源外,还额外提供了以数据流的方式获取资源,这在以后的应用程序开发中会经常使用,那么如何获取Resources了,如下:Resourcesr=this.getContext().getResources();
如何获取资源中的画图对象
数据包package:android.graphics.drawable
主要类:Drawable
AndroidSDK中的简介:ADrawableisageneralabstractionfor“somethingthatcanbedrawn.”MostoftenyouwilldealwithDrawableasthetypeofresourceretrievedfordrawingthingstothescreen;theDrawableclassprovidesagenericAPIfordealingwithanunderlyingvisualresourcethatmaytakeavarietyofforms.
看了以上简介,发现Drawable是个virtualclass,具体如何画图,需要具体分析Drawable的子类,例如:BitmapDrawable
AndroidSDK中的简介:ADrawablethatwrapsabitmapandcanbetiled,stretched,oraligned.YoucancreateaBitmapDrawablefromafilepath,aninputstream,throughXMLinflation,orfromaBitmapobject.ItcanbedefinedinanXMLfilewiththe
<bitmap>element.
其主要接口如下:
BitmapDrawable()
BitmapDrawable(Bitmapbitmap)
BitmapDrawable(Stringfilepath)
BitmapDrawable(InputStreamis)
voiddraw(Canvascanvas)
Drawinitsbounds(setviasetBounds)respectingoptionaleffectssuchasalpha(setviasetAlpha)andcolorfilter(setviasetColorFilter).
finalBitmapgetBitmap()
finalPaintgetPaint()
Drawable是个抽象类,在BitmapDrawable中我们就看到位图的具体操作,在仔细看下BitmapDrawable的构造函数,我们就会发现与Resource中的openRawResource()接口是相对应的,就可以通过以下方法来获取位图:
Resourcesr=this.getContext().getResources();
Inputstreamis=r.openRawResource(R.drawable.my_background_image);
BitmapDrawablebmpDraw=newBitmapDrawable(is);
Bitmapbmp=bmpDraw.getBitmap();
Paint
数据包package:android.graphics
AndroidSDK中的简介:ThePaintclassholdsthestyleandcolorinformationabouthowtodrawgeometries,textandbitmaps.主要就是定义:画刷的样式,画笔的大小/颜色等。
Typeface
数据包package:android.graphics
AndroidSDK中的简介:TheTypefaceclassspecifiesthetypefaceandintrinsicstyleofafont.主要就是定义:字体。
核心类显示资源
数据包package:android.graphics
主要类:Canvas
AndroidSDK中的简介:TheCanvasclassholdsthe“draw”calls.Todrawsomething,youneed4basiccomponents:ABitmaptoholdthepixels,aCanvastohostthedrawcalls(writingintothebitmap),adrawingprimitive(e.g.Rect,Path,text,Bitmap),andapaint(todescribethecolorsandstylesforthedrawing).
按照结构的功能,将主要接口分为以下3部分:
booleanclipXXXX()Region区域操作:DIFFERENCEINTERSECTREPLACEREVERSE_DIFFERENCEUNIONXOR
voiddrawXXXX()画图函数
voidrotate()voidscale()voidskew()voidtranslate()画布操作函数
Region在这里需要特殊说明下:Region就是一个区域,也就是画布(Canvas)中的有效区域,在无效区域上draw,对画布没有任何改变。
Drawable类
Drawable是一个通用的抽象类,它的目的是告诉你什么东西是可以画的。你会发现基于Drawable类扩展出各种绘图的类,见下面的表格,当然你可以继承它来创建你自己的绘图类.
Interfaces
Interfacethatdrawablessuportinganimationsshouldimplement. | |
Implementthisinterfaceifyouwanttocreateananimateddrawablethatextends. |
Classes
Anobjectusedtocreateframe-by-frameanimations,definedbyaseriesofDrawableobjects,whichcanbeusedasaViewobject'sbackground. | |
ADrawablethatwrapsabitmapandcanbetiled,stretched,oraligned. | |
ADrawablethatclipsanotherDrawablebasedonthisDrawable'scurrentlevelvalue. | |
AspecializedDrawablethatfillstheCanvaswithaspecifiedcolor,withrespecttotheclipregion. | |
ADrawableisageneralabstractionfor"somethingthatcanbedrawn."MostoftenyouwilldealwithDrawableasthetypeofresourceretrievedfordrawingthingstothescreen;theDrawableclassprovidesagenericAPIfordealingwithanunderlyingvisualresourcethatmaytakeavarietyofforms. | |
ADrawablewithacolorgradientforbuttons,backgrounds,etc. | |
ADrawablethatinsetsanotherDrawablebyaspecifieddistance. | |
ADrawablethatmanagesanarrayofotherDrawables. | |
AresourcethatmanagesanumberofalternateDrawables,eachassignedamaximumnumericalvalue. | |
Aresizeablebitmap,withstretchableareasthatyoudefine. | |
Drawablethatdrawsitsboundsinthegivenpaint,withoptionalroundedcorners. | |
DrawablesubclassthatwrapsaPicture,allowingthepicturetobeusedwhereeveraDrawableissupported. | |
ADrawablethatcanrotateanotherDrawablebasedonthecurrentlevelvalue. | |
ADrawablethatchangesthesizeofanotherDrawablebasedonitscurrentlevelvalue. | |
ADrawableobjectthatdrawsprimitiveshapes. | |
Baseclassdefinesafactoryobjectthatiscalledeachtimethedrawableisresized(hasanewwidthorheight). | |
LetsyouassignanumberofgraphicimagestoasingleDrawableandswapoutthevisibleitembyastringIDvalue. | |
AnextensionofLayerDrawablesthatisintendedtocross-fadebetweenthefirstandsecondlayer. |
从资源图像文件中创建
一个比较简单的方法是添加一个图片到你的程序中,然后通过资源文件引用这个文件,支持的文件类型有PNG(首选的)JPG(可接受的)GIF(不建议),显然这种对于显示应用程序的图标跟来说是首选的方法,也可以用来显示LOGO,其余的图片可以用在例如游戏中。
把一个图片资源,添加你的文件到你工程中res/drawable/目录中去,从这里,你就可以引用它到你的代码或你的XML布局中,也就是说,引用它也可以用资源编号,比如你选择一个文件只要去掉后缀就可以了(例如:my_image.png引用它是就是my_image)。
注意:SDK指出,为了缩小图片的存储空间,在Build的时候又可能对图片进行压缩,如果不想被压缩,可以将图片放在res/raw/目录中。
SDK给出的例子:
LinearLayoutmLinearLayout; protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); //CreateaLinearLayoutinwhichtoaddtheImageView mLinearLayout=newLinearLayout(this); //InstantiateanImageViewanddefineitsproperties ImageViewi=newImageView(this); i.setImageResource(R.drawable.my_image); i.setAdjustViewBounds(true);//settheImageViewboundstomatchtheDrawable'sdimensions i.setLayoutParams(newGallery.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT)); //AddtheImageViewtothelayoutandsetthelayoutasthecontentview mLinearLayout.addView(i); setContentView(mLinearLayout); }
获取Drawable对象:
Resourcesres=mContext.getResources(); DrawablemyImage=res.getDrawable(R.drawable.my_image);
注意:保持每个资源类型的一至,可以保证你项目状态的一致性,就不用担心有许多不同类型的对象来实例化它。例如:如果使用相同的图像资源来实例化两个Drawable对象。然后修改一个Drawables的属性(例如alpha),然后不幸得是这个效果也会出现在另一个对象上去。所以当处理同一个资源的多个实例对象时,不是直接转换为Drawable,而是应该执行tweenanimation
如何添加资源到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:AnextensionofLayerDrawablesthatisintendedtocross-fadebetweenthefirstandsecondlayer.ItcanbedefinedinanXMLfilewiththe
<transition>element.EachDrawableinthetransitionisdefinedinanested
<item>.有关TransitionDrawable的详细信息查看
将其定义在res/drawable/expand_collapse.xml:
<?xmlversion="1.0"encoding="utf-8"?>
<transitionxmlns:android="http://schemas.android.com/apk/res/android">
<itemandroid:drawable="@drawable/pic1"/>
<itemandroid:drawable="@drawable/pic2"/>
</transition>
下面实例化并处理:
publicclassMainActivityextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Resourcesres=getResources();
TransitionDrawabletrans=(TransitionDrawable)res.getDrawable(R.drawable.expand_collapse);
ImageViewimage=(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公共方法的各种属性。有些属性你可以需要调整,包括透明度,颜色过滤,不透明度,颜色。
例子:
publicclassCustomDrawableViewextendsView{
privateShapeDrawablemDrawable;
publicCustomDrawableView(Contextcontext){
super(context);
intx=10;
inty=10;
intwidth=300;
intheight=50;
mDrawable=newShapeDrawable(newOvalShape());
mDrawable.getPaint().setColor(0xff74AC23);
mDrawable.setBounds(x,y,x+width,y+height);
}
protectedvoidonDraw(Canvascanvas){
mDrawable.draw(canvas);
}
显示:
CustomDrawableViewmCustomDrawableView;
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
mCustomDrawableView=newCustomDrawableView(this);
setContentView(mCustomDrawableView);
}
在XML中定义方法:如果你想用XML文件配置来取代原有布局来画自定义的drawable,于是你自定义的Drawable类必须重载view(Context,AttributeSet)构造函数。
<com.example.shapedrawable.CustomDrawableView android:layout_width="fill_parent" android:layout_height="wrap_content" />
NinePatchDrawable
NinePatchDrawable绘画的是一个可以伸缩的位图图像,Android会自动调整大小来容纳显示的内容。一个例子就是NinePatch为背景,使用标准的Android按钮,按钮必须伸缩来容纳长度变化的字符
NinePatchDrawable是一个标准的PNG图像,它包括额外的1个像素的边界,你必须保存它后缀为.9.png,并且保持到工程的res/drawable目录中。
这个边界是用来确定图像的可伸缩和静态区域。你可以在左边和上边的线上画一个或多个黑色的1个像素指出可伸缩的部分(你可以需要很多可伸缩部分),它的相对位置在可伸缩部分相同,所以大的部分总是很大的。
你还有可以在图像的右边和下边画一条可选的drawable区域(有效的,内边距线)。如果你的视图对象设置NinePath为背景然后指定特殊的视图字体,它将自行伸缩使所有的文本来适应根据右线与底部线设计好的区域(如果有的话),当然内边距线不包括其中,Android可以使用左边的线与上面的线来定义一个drawable区域。
我们来澄清一下这两条不同的线,左边跟顶部的线来定义哪些图像的像素允许在伸缩时被复制。底部与右边的线用来定义一个相对位置内的图像,视图的内容就放入其中。
使用方法:
<Buttonid="@+id/tiny"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
android:text="Tiny"
android:textSize="8sp"
android:background="@drawable/my_button_background"/>
<Buttonid="@+id/big"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerInParent="true"
android:text="Biiiiiiigtext!"
android:textSize="30sp"
android:background="@drawable/my_button_background"/>
参考:AndroidSDKeoeandroid.commoandroid.com
作者:
出处:
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐
- Android Drawable绘图学习笔记
- Android Drawable绘图学习笔记
- Android Drawable绘图学习笔记
- Android Drawable绘图学习笔记
- Android Drawable绘图学习笔记
- Android Drawable绘图学习笔记
- Android Drawable绘图学习笔记
- Android Drawable绘图学习笔记(转)
- Android Drawable绘图学习笔记
- android - Drawable - TransitionDrawable 学习笔记
- Android学习小结2
- Android Drawable Resource学习(十一)、RotateDrawable
- Android Drawable Resource学习(二)、BitmapDrawable和Bitmap
- Android学习之 WebView使用小结
- Android学习之drawable state各个属性详解
- android学习之绘图总结
- Android学习小结(一)#2拾遗
- Android学习面试小结
- Android画图学习总结(三)——Drawable
- Android学习之绘图入门