`
wen742538485
  • 浏览: 239037 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android图形系统详解二:Drawables

阅读更多
Android提供了一个自定义的2D图形库来绘制图像和图像.在android.graphics.drawable包中你就可以找到这些用于2维绘画的通用类.

  本文讨论使用Drawable对象来作画的基础知识以及如何使用一对Drawable类的派生类.


  Drawable是通常指的那种可以作画的东西的抽象.你将发现Drawable类扩展出了很多特定的可绘图形类,包括BitmapDrawable,ShapeDrawable,PictureDrawable,LayerDrawable,等等.当然,你也可以从它们派生出你自己的类来定义你自己的Drawable对象,当然以你独有的方式来表现.


  有三种方法来定义并实例化一个Drawable:使用一个保存在你的项目资源中的图像;使用一个定义了Drawable属性的XML文件;或使用普通的类对象构造方式.下面,我们将讨论前两种方式(类对象构就是new出一个对象,傻子都知道,所以不说了).




从资源中的图像创建
  添加图形到你的应用的一个简单的方式是从你的项目资源中引用一个图像文件.支持的文件格式有PNG(首选),JPG (可接受)和GIF(不推荐).此技术优先用于程序图标,logo,或其它图形,比如用于游戏中的.


  要使用一个图像资源,只需把你的文件添加到项目的res/drawable/文件夹下.从这里,你可以在你的代码或XMLlayout中引用它.不论从哪里引用,推荐使用一个资源ID,它是不带扩展名的文件名(例如,my_image.png的ID是my_image).


  注:图像资源放在res/drawable/下,可能会在构建过程中自动被aapt工具无损压缩以进行优化.例如,一个不需要超过256种颜色的真彩色PNG可能被转换成一个带有调色板的8位PNG.这将造成保持图像质量不变的情况下,占用更少的内存.所以要注意放在这个文件夹下的图像在构建期间可能会改变.如果你想把一个图像作为比特流读入以转换成一个bitmap,那么应把你的图象放在res/raw/文件夹下,在这里他们不会被优化.




代码例子
下面的代码片段演示了如何使用drawable中的资源创建一个ImageView然后把它添加到layout:



[java] view plaincopy
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); // 设置ImageView与Drawable的宽高比相同 
  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对象处理.要这样做,需从资源创建一个Drawable对象:
[java] view plaincopy
Resources res = mContext.getResources(); 
Drawable myImage = res.getDrawable(R.drawable.my_image); 

  注:不管有多少不同的对象实例化它,你项目中的每个唯一的资源只能保持一种状态.例如,如果你从同一个图像资源实例化了两个Drawable对象,然后用其中一个改变了一个属性(比如alpha),那么它将也影响到另一个.所以当处理一个图像资源的多个实例时,你应该执行一个过渡动画,而不是直接转换Drawable.
XML例子
下面的XML片段演示了如何在XMLlayout中添加一个资源Drawable到一个ImageView.

[html] view plaincopy
<ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:tint="#55ff0000" 
      android:src="@drawable/my_image"/> 
从资源XML创建
  现在,你应该熟悉了andriod下开发用户界面的原则.所以,也了解了在XML中定义对象的强大和灵活性.此理念贯穿了Views到Drawables.如果你想创建一个Drawable对象,而它最初不是依赖于你应用代码所定义的变量或userinteraction,那么最好就去XML中定义这个Drawable.即使你希望你的Drawable在用户使用过程中也可改变它的属性,你也应该考虑在XML中定义对象,因为在它初始化后你也可以改变它的属性.


  一旦你在你的XML中定义了Drawable,就应把文件保存到项目的res/drawable/文件夹下.然后,通过调用Resources.getDrawable()方法获取并实例化这个对象,把你的XML文件的资源ID传给这个函数(见下面的例子).


  任何支持inflate()方法的Drawable的子类都可以被定义在XML中并且被应用所实例化.每个支持XMLinflation的Drawable利用了特定的XML属性来帮助定义对象的属性(见类的的参考文档来了解它们是什么).见每个Drawable的子类的类描述文档来了解如何在XML中定义.


例子

下面是一些定义TransitionDrawable的XML:

[html] view plaincopy
<transition xmlns:android="http://schemas.android.com/apk/res/android"> 
      <item android:drawable="@drawable/image_expand"> 
      <item android:drawable="@drawable/image_collapse"> 
</transition> 

此XML保存在res/drawable/expand_collapse.xml,下面的代码将实例化TransitionDrawable并且把它设置为一个ImageView的内容:


[java] view plaincopy
Resources res = mContext.getResources(); 
      TransitionDrawable transition = (TransitionDrawable) 
res.getDrawable(R.drawable.expand_collapse); 
      ImageView image = (ImageView) findViewById(R.id.toggle_image); 
      image.setImageDrawable(transition); 


然后这个转换就可以通过以下设置运行一秒钟:


transition.startTransition(1000);
分享到:
评论

相关推荐

    android_theme_template:CM12 主题模板

    【Android Theme Template: CM12 主题模板详解】 在Android开发中,个性化主题是一个非常吸引用户的功能,尤其对于那些喜欢自定义手机界面的用户来说。CM12(CyanogenMod 12)是一个基于Android的第三方操作系统,...

    android app 课程表实现源码

    【Android 应用开发:课程表实现源码详解】 在Android平台上开发一款课程表应用是一项常见的任务,它可以帮助用户管理日常的学习计划。本教程将基于提供的"android app 课程表实现源码"来深入探讨如何在Android环境...

    Android 常用开发术语

    ### Android常用开发术语详解 #### 1. APK扩展名 APK,即Android Package Kit,是Android应用的主要分发格式。一个APK文件包含了与特定Android应用相关的所有文件,包括但不限于`AndroidManifest.xml`(应用配置...

    android 入门知识简介

    ### Android入门知识详解 #### 一、新建Android工程项目 在开始Android应用开发之旅之前,首先需要熟悉如何在集成开发环境(IDE)中搭建一个基本的Android应用项目。本章节将详细介绍如何使用Eclipse来创建一个名...

    Android5.0新特性详解之全新的动画

    在Android 5.0中,Vector Drawables的引入也是重大更新之一。它支持SVG格式的矢量图形,这意味着即使在不同分辨率的设备上,图标和图像都能保持清晰,而且这些矢量图形可以用于动画,增加了图形的动态性。 最后,...

    Android style简单学习应用示例.rar

    【Android风格设计与UI元素详解】 在Android平台上,应用程序的用户体验和视觉效果是至关重要的,因为这直接影响到用户的满意度和产品的市场表现。Android风格的设计,通常被称为Material Design,是一种谷歌推出的...

    MyAppPortfolio:Android nanodegree项目0

    - Drawables:图形资源,包括位图、形状和状态列表。 - Themes & Styles:定义应用的整体外观和感觉。 6. **版本控制与协作** - Git:分布式版本控制系统,用于跟踪代码变更和团队协作。 - GitHub或GitLab:...

    布局渲染流程

    - **资源共享**:Android系统将由主题提供的资源(如Bitmaps和Drawables)打包到统一的纹理中,并传递给GPU。这使得资源在需要时可以直接从纹理中获取并进行渲染。 - **减少重复工作**:通过缓存机制减少重复绘制...

    材质:简单的Android应用程序,展示了如何设计材质设计中的分层过渡

    - **animated-vector-drawables**:Android中的动画向量 drawable 支持在运行时动态改变SVG图形,常用于过渡动画中,减少资源大小并提高性能。 3. **实现步骤** - **设置共享元素**:在源视图和目标视图中定义...

    MaterialBird:几乎所有 Android 版本上的 Flappy Bird 材料设计版本

    4. **Java 语言**:作为项目的编程语言,Java 提供了丰富的类库和工具支持游戏开发,如 OpenGL ES 用于图形渲染,Android 的游戏引擎如 LibGDX 可简化游戏开发过程。开发者可能需要深入理解 Java 多线程、对象封装和...

    安卓学习笔记大全

    你可以通过阅读Android开发者文档或使用Android Studio的图形界面来查看和理解各个标签和属性。XML约束文件则用于定义UI元素间的约束关系,主要在Kotlin Android Extensions或Data Binding库中使用。 3. **...

Global site tag (gtag.js) - Google Analytics