第七章 实现炫酷效果—图像和动画(1)

第七章实现炫酷效果—图像和动画

学完上一章,相信读者对Android画图核心部分有了一定的了解。为了实现更加炫酷的效果,我们可能会在我们的应用中使用大量的图像和动画效果。

本章我们将详细介绍Android中的各种图像对象的使用,以及动画的使用。学习完本章,相信读者可以独立开发出有着绚丽的视觉效果的Android应用了。

7.1 Android的几种常用图像类型

Android中的图像对象,主要有android.graphics.Bitmap(位图)、android.graphics.drawable.Drawable(基于Drawable类扩展出各种绘图的类)和android.graphics.drawable.Picture。

下面简单介绍一下这几种图像类型,以便对之有个大概的了解。。

1)Bitmap

称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多,如RGB565、RGB8888等等。作为一种逐像素的显示对象执行效率高,但是缺点也很明显,那就是存储效率低。我们将Bitmap理解成为一种存储对象比较好。

2)Drawable

作为Android中通用的图形对象,它可以装载常用格式的图像,比如GIF、PNG、JPG,当然也支持BMP,当然它还提供一些高级的可视化对象,比如渐变、图形等。

3)Picture

相对于Drawable和Bitmap而言,Picture对象就小巧的多,它并不存储实际的像素,仅仅记录了绘制的过程。

下面会对几种图像类型做详细的讲解。

7.2图片的基础—Bitmap(位图)

7.2.1如何获取位图资源

前面我们大概了解了几种图像类的功能,这其中,Bitmap类是一个使用率较高的类。下面详细说明下Bitmap这个类。

先来看看如何获取位图资源。Bitmap对象没有公有的构造方法,所以不能直接创建,只能通过BitmapFactory的几个静态方法创建。

一般的,获取位图资源有以下几种方式:

1)图片放在sd卡中


Bitmap imageBitmap = BitmapFactory.decodeFile(path);

这里path是图片的路径,根目录是/sdcard。

2)图片在项目的res文件夹下面


ApplicationInfo appInfo = getApplicationInfo();

int resID = getResources().getIdentifier(name, "drawablePath", appInfo.packageName);

Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), resID);

这里是通过图片的id,或直接通过R文件来获取(例如R.drawable.bitmapName)图片的。

这里的name,是该图片的名字;drawablePath是该图片存放的目录,appInfo.packageName是应用程序的包。

3)图片放在src目录下


// 图片存放的路径

String path = "com/xiangmu/test.png";

// 得到图片流

InputStream is = getClassLoader().getResourceAsStream(path);

Bitmap mBitmap = BitmapFactory.decodeStream(is);

4)android中有个Assets目录,这里可以存放只读文件


// 图片存放的路径为assets/test.png

String path = "test.png";

InputStream is = getResources().getAssets().open(path);

Bitmap mBitmap = BitmapFactory.decodeStream(is);


经验分享:

一些低版本的Android系统(2.2版本以前)对res/raw和assets文件夹资源大小有限制的,原始文件大小超过1M,将不能从APK中读出。如果你使用AssetManager 或 Resources类的方法来获取InputStream,将抛出java.io.IOException的异常。这一点是特别需要注意的。

所以,为了兼容低版本的Android系统,如果需要放入大于1M的原始文件,可以事先将大文件分割成小文件,然后在程序启动时将文件合并,拷贝到SD卡中,以供程序读取。

7.2.2如果获取位图的信息

很多场合,我们需要获取位图信息,比如位图大小、是否包含透明度、颜色格式等。Bitmap类中支持很多方法,下面简单介绍一些常用的方法,如表7-1所示。


方法


返回值


说明


getWidth()


int


获取位图的宽


getHeight()


int


获取位图的高


hasAlpha()


boolean


是否包含透明度


getConfig()


Config


获取颜色格式

表7-1 Bitmap类中常用的一些方法


经验分享:

通过方法getConfig()得到的是这个位图的颜色格式(android.graphics.Bitmap.Config),了解这个类对Android开发过程还是挺有用的。这是Bitmap的一个内部类。

public enum Config {

ALPHA_8 (2),//表示图形单个像素点由一个字节(8位)来表示,代表8位Alpha位图。

RGB_565 (4),// 5+6+5=16,表示图形单个像素点由两个字节来表示的16位RGB位图。

ARGB_4444 (5),// 4+4+4+4=16,表示图形单个像素点由两个字节来表示的16位ARGB位图。

ARGB_8888 (6);// 8+8+8+8=32,表示图形单个像素点由四个字节来表示的32位ARGB位图。

}

ALPHA_8,ARGB_4444,ARGB_8888都是透明的位图。也就是说字母A代表透明。位图位数越高代表其可以存储的颜色信息越多,当然图像也就越逼真。

7.2.3位图的显示与变换

有了位图,我们就要将它显示出来。显示需要使用核心类Canvas,可以直接通过Canvas类的drawBitmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas。具体的可以参考前面Canvas相关的章节。

位图的变换,还是要用到前面提到的类android.graphics.Matrix。变换可以在画的时候,也可以在加载图片的时候对,原图片进行变换。

在Canvas画的时候进行变换的方法如下:


drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint);

// 指定Matrix绘制位图

drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)

这里主要介绍下在原有位图的基础上,缩放原位图,创建一个新的位图。下面是android.graphics.Bitmap自带的一个方法。


Bitmap.createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

还有一种创建新位图的方法是通过BitmapFactory.decodeFile()方法。在操作Android图片的时候,我们会经常遇到内存溢出的问题,比如加载8M以上的图片的时候,很容易造成内存溢出,因为android规定一个应用可以使用的内存为8M左右,如何优化我们会在后面单独的一章节来介绍。下面我们来看看如何将一个大图变小,来给我们使用:


BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inJustDecodeBounds = true;

// 这里是整个方法的关键,inJustDecodeBounds设为true时将不为图片分配内存。

BitmapFactory.decodeFile("/sdcard/image.jpg",opts);

// 获取图片的原始宽度

int srcWidth = opts.outWidth;

// 获取图片原始高度

int srcHeight = opts.outHeight;

int destWidth = 0;

int destHeight = 0;

// 缩放的比例

double ratio = 0.0;

// 按比例计算缩放后的图片大小,maxLength是长或宽允许的最大长度

if(srcWidth >srcHeight) {

ratio = srcWidth / maxLength;

destWidth = maxLength;

destHeight = (int) (srcHeight / ratio);

}else {

ratio = srcHeight / maxLength;

destHeight = maxLength;

destWidth = (int) (srcWidth / ratio);

}

BitmapFactory.Options newOpts = new BitmapFactory.Options();

// 缩放的比例,缩放是很难按准备的比例进行缩放的,目前我只发现只能通过inSampleSize来进行缩放,其值表明缩放的倍数,SDK中建议其值是2的指数值

newOpts.inSampleSize = (int) ratio + 1;

// inJustDecodeBounds设为false表示把图片读进内存中

newOpts.inJustDecodeBounds = false;

// 设置大小,这个一般是不准确的,是以inSampleSize的为准,但是如果不设置却不能缩放

newOpts.outHeight = destHeight;

newOpts.outWidth = destWidth;

// 获取缩放后图片

Bitmap destBm = BitmapFactory.decodeFile("/sdcard/ image.jpg",newOpts);


经验分享:

对于BitmapFactory.Options. inJustDecodeBounds说明一下。

如果该值设为true,使用BitmapFactory.decodeFile()方法将不返回实际的bitmap同时不会给其分配内存空间而返回的Options里面只包括一些解码边界信息即图片大小信息。

那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以读取图片了,这里要注意的是Options.inSampleSize 不可以小于0。也就是说先将Options的属性inJustDecodeBounds设为true,先获取图片的基本大小信息数据(信息没有保存在bitmap里面,而是保存在options里面),通过options.outHeight和options. outWidth获取的大小信息以及自己想要到得图片大小计算出来缩放比例inSampleSize,然后紧接着将inJustDecodeBounds设为false,就可以根据已经得到的缩放比例得到缩放后的图了。设置新的Options,一定要设置outHeight和outWidth如果不设置将不能缩放。

时间: 2024-11-09 01:43:51

第七章 实现炫酷效果—图像和动画(1)的相关文章

第七章 实现炫酷效果—图像和动画(3)

7.3.6超炫的特效-ShapeDrawable 当你想去使用一些常用的图形,ShapeDrawable对象可能会对你有很大的帮助.当然通过ShapeDrawable,你可以通过编程画出任何你想到的图像与样式,因为ShapeDrawable有自己的draw()方法. ShapeDrawable继承了Drawable,所以你可以调用Drawable里有的函数,使用方法和其他的Drawable的子类差不多.下面我们来介绍它的特色. 通过ShapeDrawable的XML构造文件来了解ShapeDra

第七章 实现炫酷效果—图像和动画(5)

7.7渐变动画-Tween Animation 7.7.1Tween Animation简介 一个Tween动画将对视图对象中的内容进行一系列简单的转换(位置,大小,旋转,透明性).如果你有一个文本视图对象,你可以移动它,旋转它,让它变大或让它变小,如果文字下面还有背景图像,背景图像也会随着文件进行转换. 可以使用XML来定义Tween Animation.首先将动画的XML文件在工程中res/anim目录,这个文件必须包含一个根元素,可以使<alpha><scale> <t

第七章 实现炫酷效果—图像和动画(2)

7.3变化多端-Drawable(绘图类) Drawable资源是Android系统中使用最广泛.最灵活的资源,可以直接使用png.jpg.gif.9.png等图片做为资源文件,也可以使用多种XML文件做为资源文件. 下面详细介绍下各种Drawable资源. 7.3.1Drawable的一些常用子类 Android平台的Drawable代表可以绘制在屏幕上的资源,可以使用getDrawable(int)从资源文件中获取Drawable资源,或者在XML资源文件中采用@drawable方式来引用一

第七章 实现炫酷效果—图像和动画(6)

7.8渐变动画-Frame Animation FrameAnimation是按顺序播放事先做好的图像,跟播放电影类似.可以参考前面的7.3.7章节--<简单的帧动画-AnimationDrawable>. 经验分享: AnimationDrawable也可以通过代码来生成AnimationDrawable对象: AnimationDrawable mAnimationDrawable = new AnimationDrawable(); mAnimationDrawable.addFrame

10大炫酷的HTML5文字动画特效欣赏

文字是网页中最基本的元素,在CSS2.0时代,我们只能在网页上展示静态的文字,只能改变他的大小和颜色,显得枯燥无味.随着HTML5的发展,现在网页中的文字样式变得越来越丰富了,甚至出现了文字动画,HTML5和CSS3的强大之处就在于此.本文分享的10款炫酷的HTML5文字动画特效非常不错,一起来看看吧. 1.HTML5 Canvas粒子效果文字动画特效 之前我们分享过很多超酷的文字特效,其中也有利用HTML5和CSS3的.今天我们要来分享一款基于HTML5 Canvas的文字特效,输入框中输入想

html5跟随鼠标炫酷网站引导页动画特效

html5跟随鼠标炫酷网站引导页动画特效一款非常不错的引导页,文字效果渐变,鼠标跟随出绚丽的条纹.html5炫酷网站引导页,鼠标跟随出特效. 体验效果:http://hovertree.com/texiao/html5/ 效果图: 以下是源代码: 1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Co

开源分享三(炫酷的Android Loading动画)

开源分享三(炫酷的Android Loading动画) 分享GitHub上的一些Loading,为了提升产品用户体验,一个好的Loading必然是不可缺少的,对于一些耗时需要用户等待的页面来说会转移用户注意力,不会显得那么烦躁,所以你可以看到市面上一些App中的各种各样的Loading动画,从这些实现思路上可以打开你们自己的思维,没准也会有创新的Loading动画出现. android-shapeLoadingView 新版58同城加载页面动画. CircleProgress 一个效果很酷炫很创

8个经典炫酷的HTML5 Canvas动画欣赏

HTML5非常强大,尤其是Canvas技术的应用,让HTML5几乎可以完成所有Flash能完成的效果.本文精选了8个经典炫酷的HTML5 Canvas动画欣赏,每一个都提供全部的源代码,希望对你有所帮助. 1.HTML5 Canvas可拖动的弹性大树摇摆动画 今天让我们继续来分享一个炫酷的HTML5动画,它是一款基于HTML5 Canvas的大树摇摆动画,这款HTML5动画的特点是我们可以拖拽树枝,从而让整棵树摇摆起来,这样就真实地模拟了大树从摇摆到静止的整个过程,相当逼真. 在线演示     

经典炫酷的HTML5/jQuery动画应用示例及源码

jQuery是一款普遍受前端开发者欢迎的Javascript框架,但是开发者貌似更关注jQuery开发的插件,海量的jQuery插件让前端开发者非常方便.HTML5的加入让jQuery这个家族更加丰富多彩,因为利用HTML5,我们可以制作更加绚丽动感的动画特效,HTML5结合jQuery,真是我们开发者的福利啊.本文分享了一些经典炫酷的HTML5/jQuery动画应用,喜欢的朋友可以分享和收藏. jquery视差滑块幻灯特效 很传统的一款jQuery焦点图插件,但是该焦点图插件是宽屏的,整体看起