android中图形图像处理之drawable用法分析

android中图形图像处理之drawable用法分析,第1张

概述本文实例讲述了android中图形图像处理之drawable用法。分享给大家供大家参考。具体如下: @H_301_0@本文实例讲述了androID中图形图像处理之drawable用法。分享给大家供大家参考。具体如下:

@H_301_0@一、如何获取 res 中的资源

@H_301_0@数据包package:androID.content.res

@H_301_0@主要类:Resources

@H_301_0@其主要接口按照功能,划分为以下三部分:

@H_301_0@getXXXX()

@H_301_0@例如:

@H_301_0@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();
 
二、如何获取资源中的画图对象

@H_301_0@数据包package:androID.graphics.drawable

@H_301_0@主要类:Drawable

@H_301_0@Drawable是个virtual class,具体如何画图,需要具体分析Drawable的子类,例如:BitmapDrawable

@H_301_0@其主要接口如下:

@H_301_0@BitmapDrawable()
BitmapDrawable(Bitmap bitmap)
BitmapDrawable(String filepath)
BitmapDrawable(inputStream is)
voID draw(Canvas canvas)
final Bitmap getBitmap()
final Paint getPaint()

@H_301_0@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();
@H_301_0@Paint

@H_301_0@数据包package:androID.graphics

@H_301_0@AndroID SDK中的简介:The Paint class holds the style and color information about how to draw geometrIEs,text and bitmaps. 主要就是定义:画刷的样式,画笔的大小/颜色等。

@H_301_0@Typeface

@H_301_0@数据包 package:androID.graphics

@H_301_0@AndroID SDK中的简介:The Typeface class specifIEs the typeface and intrinsic style of a Font. 主要就是定义:字体。

@H_301_0@核心类显示资源

@H_301_0@数据包package:androID.graphics

@H_301_0@主要类:Canvas

@H_301_0@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).

@H_301_0@按照结构的功能,将主要接口分为以下3部分:

@H_301_0@boolean clipXXXX() Region区域 *** 作:DIFFERENCE INTERSECT REPLACE REVERSE_DIFFERENCE UNION XOR

@H_301_0@voID drawXXXX()画图函数

@H_301_0@voID rotate()  voID scale()  voID skew() voID translate() 画布 *** 作函数
Region在这里需要特殊说明下:Region就是一个区域,也就是画布(Canvas)中的有效区域,在无效区域上draw,对画布没有任何改变。

@H_301_0@Drawable类

@H_301_0@Drawable是一个通用的抽象类,它的目的是告诉你什么东西是可以画的。你会发现基于Drawable类扩展出各种绘图的类,见下面的表格,当然你可以继承它来创建你自己的绘图类.
 
有三种方法可以定义和实例化一个Drawable:保存一个图片到你工程资源中,使用XML文件来描述Drawable属性或者用一个正常的类去构造。下面我们将讨论两种技术(对一个有开发经验的开发者来说构造并不是最新的技术)。

@H_301_0@从资源图像文件中创建

@H_301_0@一个比较简单的方法是添加一个图片到你的程序中,然后通过资源文件引用这个文件,支持的文件类型有PNG(首选的) JPG(可接受的)GIF(不建议),显然这种对于显示应用程序的图标跟来说是首选的方法,也可以用来显示logo,其余的图片可以用在例如游戏中。

@H_301_0@把一个图片资源,添加你的文件到你工程中res/drawable/目录中去,从这里,你就可以引用它到你的代码或你的XML布局中,也就是说,引用它也可以用资源编号,比如你选择一个文件只要去掉后缀就可以了(例如:my_image.png 引用它是就是my_image)。

@H_301_0@注意:SDK指出,为了缩小图片的存储空间,在Build的时候又可能对图片进行压缩,如果不想被压缩,可以将图片放在res/raw/目录中。

@H_301_0@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); 
@H_301_0@注意:保持每个资源类型的一至,可以保证你项目状态的一致性,就不用担心有许多不同类型的对象来实例化它。例如:如果使用相同的图像资源来实例化两个Drawable对象。然后修改一个Drawables的属性(例如Alpha),然后不幸得是这个效果也会出现在另一个对象上去。所以当处理同一个资源的多个实例对象时,不是直接转换为Drawable,而是应该执行tween animation

@H_301_0@如何添加资源到ImageVIEw:

<ImageVIEw   androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:tint="#55ff0000" androID:src="@drawable/my_image"/>
@H_301_0@从XML文件中创建

@H_301_0@到如今,你应该比较熟悉按AndroID的原则去开发一个用户接口,因此,你也应该理解了定义一个XML文件对于对象的作用与灵活的重要性。这个理念无数次用于Drawables.

@H_301_0@如果你想创建一个Drawable对象,而这个对象并不依赖于变量或用户的交换,把它定义到XML中去应该是一个不错的方法。即使你期望在你的应用程序中改变其属性来增加用户体验。你应该考虑把对象放入XML中,因为你可以随时修改其属性。

@H_301_0@当你在你的XML中定义了一个Drawable,保存这个XML文件到你工程目录下res/drawable目录中,然后通过调用Resource.getDrawable()来检索并实例化,传递给它XML文件中的资源ID号。任何Drawable的子类都支持inflate这个方法,这个方法会通过XML来实例化你的程序。任何Drawable都支持XML的扩展来利用特殊的XML属性来帮助定义对象的属性,可以查看任何Drawable子类文档来看如何定义XML文件。

@H_301_0@如下定义了一个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。

@H_301_0@将其定义在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>
@H_301_0@下面实例化并处理:

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
@H_301_0@当你想去画一些动态的二维图片,一个ShapeDrawable对象可能会对你有很大的帮助。通过ShapeDrawable,你可以通过编程画出任何你想到的图像与样式。

@H_301_0@ShapeDrawable继承了Drawable,所以你可以调用Drawable里有的函数,比如视图的背景,通过setBackgroundDrawable()设置。当然,你可以在自定义的视图布局中画你的图形,因为ShapeDrawable有自己的draw()方法。你可以在VIEw.OnDraw()方法期间创建一个视图的子类去画ShapeDrawable。

@H_301_0@ShapeDrawable类(像很多其他Drawable类型在androID.graphics.drawable包)允许你定义drawable公共方法的各种属性。有些属性你可以需要调整,包括透明度,颜色过滤,不透明度,颜色。
 
NinePatchDrawable

@H_301_0@NinePatchDrawable 绘画的是一个可以伸缩的位图图像,AndroID会自动调整大小来容纳显示的内容。一个例子就是NinePatch为背景,使用标准的AndroID按钮,按钮必须伸缩来容纳长度变化的字符

@H_301_0@NinePatchDrawable是一个标准的PNG图像,它包括额外的1个像素的边界,你必须保存它后缀为.9.png,并且保持到工程的res/drawable目录中。

@H_301_0@这个边界是用来确定图像的可伸缩和静态区域。你可以在左边和上边的线上画一个或多个黑色的1个像素指出可伸缩的部分(你可以需要很多可伸缩部分),它的相对位置在可伸缩部分相同,所以大的部分总是很大的。

@H_301_0@你还有可以在图像的右边和下边画一条可选的drawable区域(有效的,内边距线)。如果你的视图对象设置NinePath为背景然后指定特殊的视图字体,它将自行伸缩使所有的文本来适应根据右线与底部线设计好的区域(如果有的话),当然内边距线不包括其中,AndroID可以使用左边的线与上面的线来定义一个drawable区域。

@H_301_0@我们来澄清一下这两条不同的线,左边跟顶部的线来定义哪些图像的像素允许在伸缩时被复制。底部与右边的线用来定义一个相对位置内的图像,视图的内容就放入其中。

@H_301_0@希望本文所述对大家的AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的android中图形图像处理之drawable用法分析全部内容,希望文章能够帮你解决android中图形图像处理之drawable用法分析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1142281.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存