Android学习16--图形与图像处理

Android系统提供了ImageView显示普通静态图片,也提供了AnimationDrawable来开发逐帧动画,还可通过Animation对普通图片使用补间动画。图形、图像处理不仅对Android系统的应用界面非常重要,而且Android系统上益智类游戏、2D游戏都需要大量的图形、图像处理。

1、使用简单图片

图片不仅可以使用ImageView来显示,也可以作为Button、window的背景。从广义角度看,Android应用中的图片不仅包括*.png、*.jpg、*.gif等各种格式的位图,也包括使用XML资源文件定义的各种Drawable资源。

(1)使用Drawable资源

当我们为Android应用增加了Drawable资源后,Android  SDK会为这份资源在R清单文件中创建一个索引项:R.drawable.file_name。

接下来可以在XML资源文件中通过@drawable/file_name来访问该Drawable对象,也可在java代码中通过R.drawable.file_name访问该Drawable对象。

需要指出的是,R.drawable.file_name是一个int类型的常量,它只代表Drawable对象的ID,如果java程序中需要获取实际的Drawable对象,则可以调用Resources的getDrawable(int id)方法获取。

(2)Bitmap和BitmapFactory

Bitmap代表一张位图,BitmapDrawable里封装的图片就是一个Bitmap对象。开发者为了把一个Bitmap对象包装成BitmapDrawable对象,可调用BitmapDrawable构造器:

BitmapDrawable drawable=new BitmapDrawable(bitmap);

如果需要获取BitmapDrawable所包装的Bitmap对象,则可以调用BitmapDrawable的getBitmap()方法,如下:

Bitmap bitmap=drawable.getBitmap();

除此之外,Bitmap还提供了一些静态方法来创建新的Bitmap对象,如下常用方法:

a、createBitmap(Bitmap source,int x,int y,int width,int height):从源位图source的制定坐标(给定x、y)开始,从中“挖取”宽width、高height的一块出来,创建新的Bitmap对象。

b、createScaleBitmap(Bitmap src,int dstWidth,int dstHeight,boolean filter):对源位图src进行缩放,缩放成宽dstWidth、高dstHeight的新位图。

c、createBitmap(int width,int height,Bitmap.Config config):创建一个宽width、高height的新位图。

d、createBitmap(Bitmap source,int x,int y,int width,int height,Matrix m,boolean filter):从源位图source的指定坐标(x,y)开始,从中挖取宽width、高height的一块出来创建新的Bitmap对象,并按Matrix指定的规则进行变换。

BitmapFactory是一个工具类,它用于提供大量的方法,这些方法可用于从不同的数据源来解析、创建Bitmap对象,BitmapFactory包含如下方法:

a、decodeByteArray(byte[] data,int offset,int length):从指定字节数组的offset位置开始,将长度为length的字节数据解析成Bitmap对象。

b、decodeFile(String pathName):从pathName指定的文件中解析、创建Bitmap对象。

c、decodeFileDescriptor(FileDescriptor fd):用于从FileDescriptor对应的文件中解析、创建Bitmap对象。

d、decodeResource(Resources res,int id):用于根据给定的资源ID从指定资源中解析、创建Bitmap对象

e、decodeStream(InputStream is):用于从指定输入流中解析、创建Bitmap对象。

手机系统的内存比较小,如果系统不停地去解析、创建Bitmap对象,可能由于前面创建Bitmap所占用的内存还没有回收,从而导致程序运行时引发OutOfMemory错误。Android为Bitmap提供了两个方法来判断它是否已回收,以及强制Bitmap回收自己:

boolean isRecycled():返回该Bitmap是否已被回收。

void recycle():强制一个Bitmap对象立即回收自己。

除此之外,如果Android应用需要访问其它存储路径(比如SD卡中)里的图片,都需要借助于BitmapFactory来解析、创建Bitmap对象。

2、绘图

除了使用已有的图片之外,Android应用常常需要在运行时动态生成图片,比如一个手机游戏,游戏界面看上去丰富多彩,而且可以随着用户动作而动态改变,这就需要借助于Android的绘图支持了。

Android的绘图应该继承View组件,并重写它的onDraw(Canvas canvas)方法即可。重写onDraw(Canvas canvas)方法时涉及一个绘图APICanvas,Canvas代表了“依附”于指定View的画布,它提供了一些方法绘制各种图形。

Canvas还提供了如下方法进行变换:

rotate(float degrees,float px,float py):对Canvas执行旋转

scale(float sx,float sy,float px,float py):对Canvas执行缩放

translate(float dx,float dy):移动Canvas。向右移动dx距离(dx为负时向左移),向下移动dy距离(dy为负时向上移动)

Canvas提供的上面的方法还涉及一个API:Paint,Paint代表了Canvas上的画笔,因此Paint类主要用于设置绘制风格,包括画笔颜色、画笔笔触粗细、填充风格等。

在Canvas提供的绘制方法中还用到了一个API:Path,Path代表任意多条直线连接而成的任意图形,当Canvas根据Path绘制时,它可以绘制出任意的形状。

3、逐帧(Frame)动画

逐帧(Frame)是最容易理解的动画,它要求开发者把动画过程的每张静态图片都收集起来,然后由Android来控制依次显示这些静态图片,然后利用人眼“视觉暂留”的原理,给用户造成“动画”的错觉。逐帧动画的动画原理与放电影的原理完全一样。

(1)AnimationDrawable与逐帧动画

逐帧动画通常也是采用XML资源文件进行定义的。定义逐帧动画非常简单,只要在<animation-list.../>元素中使用<item.../>子元素定义动画的全部帧,并指定各帧的持续时间即可。

一旦程序获取了AnimationDrawable对象之后,接下来接可用ImageView把AnimationDrawable显示出来----习惯上把AnimationDrawable设成ImageView的背景即可。

需要指出的是:AnimationDrawable代表的动画默认是不播放的,必须在程序中启动动画播放才可以。AnimationDrawable提供了入戏两个方法来开始、停止动画:

start():开始播放动画

stop():停止播放动画

4、补间(Tween)动画

补间动画就是指开发者只需要指定动画开始、动画结束“关键帧”,而动画变化的“中间帧”由系统计算并补齐。

(1)TWeen动画与Interpolator

对于补间动画而言,开发者无需“逐一”定义动画过程中的每一帧,他只要定义动画开始、结束的关键帧,并指定动画的持续时间即可。

补间动画所定义的开始帧、结束帧其实只是一些简单的变化,比如图形大小的缩放、旋转角度的改变等,Android使用Animation代表抽象的动画类,它包括如下几个子类:

a、AlphaAnimation:透明度改变的动画,其中透明度可从0变化到1。创建时指定开始透明度、结束透明度和持续时间。

b、ScaleAnimation:大小缩放的动画。创建时指定开始缩放比、结束缩放比、持续时间,还要指定“缩放中心”坐标。

c、TranslateAnimation:位移变化的动画,只要设置开始位置、结束位置和持续时间即可。

d、RotateAnimation:旋转动画。创建时指定动画开始旋转角度、结束旋转角度、持续时间,还要指定“旋转中心”坐标。

一旦为补间动画指定了3个必要信息,Android就会根据动画的开始帧、结束帧、动画持续时间计算出需要在中间“补入”多少帧,并计算所有补入帧的图形。当用户浏览补间动画时,他眼中看到的依然是“逐帧动画”。

为了控制在动画期间需要“补入”多少帧,具体在动画运行的哪些时刻补入帧,需要借助于Interpolator。

Interpolator根据特定的算法计算出整个动画所需要动态插入帧的密度和位置。简单的说就是Interpolator负责控制动画的变化速度,这就使得基本的动画效果(Alpha、Scale、Translate、Rotate)能以匀速、加速、减速、抛物线速度等各种速度变化。

Android为Interpolator提供了如下几个实现类,分别用于实现不同动画变化速度:

LinearInterpolator:动画以均匀的速度变化。

AccelerateInterpolator:在动画开始的地方改变速度较慢,然后开始加速。

AccelerateDecelerateInterpolator:在动画开始、结束的地方改变速度较慢,在中间的时候加速。

CycleInterpolator:动画循环播放特定的次数,变化速度按正弦曲线变化。

DecelerateInterpolator:在动画开始的地方改变速度较快,然后开始减速。

为了在动画资源文件中指定补间动画所使用的Interpolator,定义补间动画的<set.../>元素支持一个android:interpolator属性,该属性可指定默认的Interpolator。例如:

@android:anim/linear_interpolator

@android:anim/accelerate_interpolator

@android:anim/accelerate_decelerate_interpolator

一旦在程序中通过AnimationUtils得到代表补间动画的Animation之后,接下来就可以调用View的startAnimation(Animation anim)方法开始对View执行动画了。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值