精华内容
下载资源
问答
  • 图形图像处理技术

    2020-06-12 16:50:30
    Paint类代表画笔,用来描述图形的颜色和风格,如线宽、颜色、透明度和填充效果等信息。使用Paint类时,首先需要创建该类的对象,这可以通过该类提供的构造方法来实现。通常情况下,只需要使用无 参数的构造方法

    常用绘图类

    在Android中,绘制图像时最常应用的就是Paint类、Canvas类、Bitmap类和BitmapFactory类。其中,Paint类代表画笔,Canvas类代表画布。在Android中也是如此, 通过Paint类和Canvas类即可绘制图像。下面将对这4个类进行详细介绍。

    Paint类

    Paint类代表画笔,用来描述图形的颜色和风格,如线宽、颜色、透明度和填充效果等信息。使用Paint类时,首先需要创建该类的对象,这可以通过该类提供的构造方法来实现。通常情况下,只需要使用无 参数的构造方法来创建一个使用默认设置的Paint对象,具体代码如下:

    Paint paint=new Paint();
    

    创建Paint类的对象后,还可以通过该对象提供的方法来对画笔的默认设置进行改变,例如,改变画笔的颜色、笔触宽度等。用于改变画笔设置的常用方法如表所示。
    setARGB(inta, int r, int g, int b) 用于设置颜色,各参数值均为0~255之间的整数,分别用于表示透明度、红色、绿色和蓝色值
    setColor(intcolor) 用于设置颜色,参数color可以通过Color类提供的颜色常量指定,也可以通过Color.rgb(int red,int green,int blue)方法指定 setAlpha(inta) 用于设置透明度,值为0~255之间的整数
    setAntiAlias(boolean aa) 用于指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢
    setDither(boolean dither) 用于指定是否使用图像抖动处理,如果使用,会使图像颜色更加平滑和饱满,使图像更加清晰 setPathEffect(PathEffecteffect) 用于设置绘制路径时的路径效果,如点划线
    setShader(Shader shader) 用于设置渐变,可以使用LinearGradient(线性渐变)、RadialGradient(径向渐变)或者SweepGradient(角度渐变) setShadowLayer(float radius, float dx, float dy, intcolor)
    用于设置阴影,参数radius为阴影的角度;dx和dy为阴影在x轴和y轴上的距离;color为阴影的颜色。如果参数radius的值为0, 那么将没有阴影 setStrokeCap(Paint.Cap cap) 用于当画笔的填充样式为STROKE或FILL_AND_STROKE时,设置笔刷的图形样式,参数值可以是Cap.BUTT、 Cap.ROUND或Cap.SQUARE。主要体现在线的端点上
    setStrokeJoin(Paint.Join join) 用于设置画笔转弯处的连接风格,参数值为Join.BEVEL、Join.MITER或Join.ROUND
    setStrokeWidth(float width) 用于设置笔触的宽度
    setStyle(Paint.Stylestyle) 用于设置填充风格,参数值为Style.FILL、Style.FILL_AND_STROKE或Style.STROKE
    setTextAlign(Paint.Align align) 用于设置绘制文本时的文字对齐方式,参数值为Align.CENTER、Align.LEFT或Align.RIGHT
    setTextSize(float textSize) 用于设置绘制文本时的文字的大小 setFakeBoldText(boolean fakeBoldText) 用于设置是否为粗体文字 setXfermode(Xfermode xfermode) 用于设置图形重叠时的处理方式,如合并、取交集或并集,经常用来制作橡皮的擦除效果

    例如,要定义一个画笔,指定该画笔的颜色为红色,并带一个浅灰色的阴影,可以使用下面的代码:

    Paint paint=new Paint(); 
    paint.setColor(Color. RED); 
    paint.setShadowLayer(2, 3, 3, Color.rgb(180, 180, 180));
    

    说明:关于如何在画布上绘制矩形
    分别定义一个线性渐变、径向渐变和角度渐变的画笔,并应用这3个画笔绘制3个矩形。

    Paint paint=new Paint(); //定义一个默认的画笔 
    //线性渐变 
    Shader shader=new LinearGradient(0, 0, 50, 50, Color.RED, Color.GREEN, Shader.TileMode.MIRROR); 
    paint.setShader(shader); //为画笔设置渐变器 
    canvas.drawRect(10, 70, 100, 150, paint); //绘制矩形 
    
    //径向渐变 
    shader=new RadialGradient(160, 110, 50, Color.RED, Color.GREEN, Shader.TileMode.MIRROR); 
    paint.setShader(shader); //为画笔设置渐变器 
    canvas.drawRect(115,70,205,150, paint); //绘制矩形 
    
    //角度渐变 
    shader=new SweepGradient(265,110,new int[]{Color.RED,Color.GREEN,Color.BLUE},null); 
    paint.setShader(shader); //为画笔设置渐变器 
    canvas.drawRect(220, 70, 310, 150, paint); //绘制矩形
    

    Canvas类

    Canvas类代表画布,通过该类提供的方法,可以绘制各种图形(如矩形、圆形和线条等)。通常情况下,要在Android中绘图,需要先创建一个继承自View类的视图,并且在该类中重写其onDraw(Canvas canvas)方法,然后在显示绘图的Activity中添加该视图。下面将通过一个具体的实例来说明如何创建用于绘图的画布。

    实现创建绘图画布的功能。

    (1)创建一个名称为DrawView的类(该类继承自android.view.View类),并添加构造方法和重写onDraw(Canvascanvas)方法,关键代码如下:

    public class DrawView extends View { 
    	/*** 功能:构造方法 */ 
    	public DrawView(Context context, AttributeSet attrs) { 
    		super(context, attrs); 
    	}
    	
    	/** 功能:重写onDraw()方法 */ 
    	@Override 
    	protected void onDraw(Canvas canvas) { 
    		super.onDraw(canvas); 
    	} 
    }
    

    说明:上面加粗的代码为重写onDraw()方法的代码。在重写的onDraw()方法中,可以编写绘图代码,参数canvas就是要进行绘图的画布。
    (2)修改新建项目的res\layout目录下的布局文件main.xml,将默认添加的线性布局管理器和TextView组件删除,然后添加一个帧布局管理器,并在帧布局管理器中添加步骤(1)中创建的自定义视图。修改后 的代码如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:layout_width="fill_parent" 
    	android:layout_height="fill_parent" 
    	android:orientation="vertical" > 
    	
    	<com.mingrisoft.DrawView android:id="@+id/drawView1" 
    		android:layout_width="wrap_content" a
    		ndroid:layout_height="wrap_content" /> 
    </FrameLayout>
    

    (3)在DrawView的onDraw()方法中,添加以下代码,用于绘制一个带阴影的红色矩形。

    aint paint=new Paint(); //定义一个采用默认设置的画笔 
    paint.setColor(Color.RED); //设置颜色为红色 
    paint.setShadowLayer(2, 3, 3, Color.rgb(180, 180, 180)); //设置阴影 
    canvas.drawRect(40, 40, 200, 100, paint); //绘制矩形
    

    Bitmap类

    Bitmap类代表位图,是Android系统中图像处理的一个重要类。使用该类,不仅可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,而且还可以指定格式保存图像文件。对于这些操作,都可以通过 Bitmap类提供的方法来实现。Bitmap类提供的常用方法如表所示。

    compress(Bitmap.CompressFormat format, int quality, OutputStreamstream) 用于将Bitmap对象压缩为指定格式并保存到指定的文件输出流中,其中format参数值可以是Bitmap.CompressFormat.PNG、 Bitmap.CompressFormat. JPEG和Bitmap.CompressFormat.WEBP
    createBitmap(Bitmap source, int x, int y, int width, int height, Matrixm, boolean filter) 用于从源位图的指定坐标点开始,“挖取”指定宽度和高度的一块图像来创建新的Bitmap对象,并按Matrix指定规则进行变 换
    createBitmap(int width, int height, Bitmap.Config config) 用于创建一个指定宽度和高度的新的Bitmap对象
    createBitmap(Bitmap source, int x, int y, int width, int height) 用于从源位图的指定坐标点开始,“挖取”指定宽度和高度的一块图像来创建新的Bitmap对象
    createBitmap(int[]colors, int width, int height, Bitmap.Config config) 使用颜色数组创建一个指定宽度和高度的新的Bitimap对象,其中,数组元素的个数为width*height
    createBitmap(Bitmap src) 用于使用源位图创建一个新的Bitmap对象
    createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter) 用于将源位图缩放为指定宽度和高度的新的Bitmap对象
    isRecycled() 用于判断Bitmap对象是否被回收
    recycle() 强制回收Bitmap对象

    说明:表中给出的方法不包括对图像进行缩放和旋转的方法,关于如何使用Bitmap类对图像进行缩放和旋转,将在下节进行介绍

    例如,创建一个包括4个像素(每个像素对应一种颜色)的Bitmap对象的代码如下

    Bitmap bitmap=Bitmap.createBitmap(new int[]{Color.RED,Color.GREEN,Color.BLUE,Color.MAGENTA}, 4, 1, Config.RGB_565);
    

    BitmapFactory类

    在Android中,还提供了一个BitmapFactory类,该类为一个工具类,用于从不同的数据源来解析、创建Bitmap对象。BitmapFactory类提供的创建Bitmap对象的常用方法如表
    decodeFile(String pathName) 用于从给定的路径所指定的文件中解析、创建Bitmap对象
    decodeFileDescriptor(FileDescriptor fd) 用于从FileDescriptor对应的文件中解析、创建Bitmap对象
    decodeResource(Resources res, int id) 用于根据给定的资源id,从指定的资源中解析、创建Bitmap对象
    decodeStream(InputStreamis) 用于从指定的输入流中解析、创建Bitmap对象

    例如,要解析SD卡上的图片文件img01.jpg并创建对应的Bitmap对象,可以使用下面的代码:

    String path="/sdcard/pictures/bccd/img01.jpg"; 
    Bitmap bm=BitmapFactory.decodeFile(path);
    

    要解析Drawable资源中保存的图片文件img02.jpg并创建对应的Bitmap对象,可以使用下面的代码:

    Bitmap bm=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.img02);
    

    绘制2D图像

    Android提供了非常强大的本机二维图形库,用于绘制2D图像。在Android应用中,比较常用的是绘制几何图形、文本、路径和图片等,下面分别进行介绍。

    绘制制几几何何图形

    常见的几何图形包括点、线、弧、圆形、矩形等。在Android中,Canvas类提供了丰富的绘制几何图形的方法,通过这些方法,可以绘制出各种几何图形。常用的绘制几何图形的方法如表所示。
    说明:表9.4中给出的绘图效果使用的画笔均为以下代码所定义的画笔。
    Paint paint=new Paint(); //创建一个采用默认设置的画笔
    paint.setAntiAlias(true); //使用抗锯齿功能
    paint.setColor(Color.RED); //设置颜色为红色
    paint.setStrokeWidth(2); //笔触的宽度为2像素
    paint.setStyle(Style.STROKE); //填充样式为描边

    实现绘制由5个不同颜色的圆形组成的图案。
    (1)修改新建项目的res\layout目录下的布局文件main.xml,将默认添加的线性布局管理器和TextView组件删除,然后添加一个帧布局管理器,用于显示自定义的绘图类。修改后的代码如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:id="@+id/frameLayout1" 
    	android:layout_width="fill_parent" 
    	android:layout_height="fill_parent" 
    	android:orientation="vertical" > 
    </FrameLayout>
    

    (2)打开默认创建的MainActivity,在该文件中,创建一个名称为MyView的内部类,该类继承自android.view.View类,并添加构造方法和重写onDraw(Canvascanvas)方法,关键代码如下:

    public class MyView extends View{ 
    	public MyView(Context context) { 
    		super(context); 
    	}
    	
    	@Override 
    	protected void onDraw(Canvas canvas) { 
    		super.onDraw(canvas); 
    	} 
    }
    

    (3)在MainActivity的onCreate()方法中,获取布局文件中添加的帧布局管理器,并将步骤(2)中创建的MyView视图添加到该帧布局管理器中,关键代码如下

    FrameLayout ll=(FrameLayout)findViewById(R.id.frameLayout1); //获取布局文件中添加的帧布局管理器 
    ll.addView(new MyView(this)); //将自定义的MyView视图添加到帧布局管理器中
    

    (4)在MyView的onDraw()方法中,首先指定画布的背景色,然后创建一个采用默认设置的画笔,并设置该画笔使用抗锯齿功能,接着设置画笔笔触的宽度,再设置填充样式为描边,最后设置画笔颜色并绘 制圆形。具体代码如下:

    canvas.drawColor(Color.WHITE); //指定画布的背景色为白色 
    Paint paint=new Paint(); //创建采用默认设置的画笔 
    paint.setAntiAlias(true); //使用抗锯齿功能 
    paint.setStrokeWidth(3); //设置笔触的宽度 
    paint.setStyle(Style.STROKE); //设置填充样式为描边 
    paint.setColor(Color.BLUE); canvas.drawCircle(50, 50, 30, paint); //绘制蓝色的圆形 
    paint.setColor(Color.YELLOW); canvas.drawCircle(100, 50, 30, paint); //绘制黄色的圆形 
    paint.setColor(Color.BLACK); canvas.drawCircle(150, 50, 30, paint); //绘制黑色的圆形 
    paint.setColor(Color.GREEN); canvas.drawCircle(75, 90, 30, paint); //绘制绿色的圆形 
    paint.setColor(Color.RED); canvas.drawCircle(125, 90, 30, paint); //绘制红色的圆形
    

    绘制路径

    绘制一条路径可以分为创建路径和将定义好的路径绘制在画布上两部分

    1. 创建路径
      要创建路径,可以使用android.graphics.Path类来实现。Path类包含一组矢量绘图方法,如画圆、矩形、弧、线条等。常用的绘图方法如表所示。
      addArc(RectF oval, floatstartAngle, floatsweepAngle) 添加弧形路径
      addCircle(float x, float y, float radius, Path.Direction dir) 添加圆形路径
      addOval(RectF oval, Path.Direction dir) 添加椭圆形路径
      addRect(RectF rect, Path.Direction dir) 添加矩形路径
      addRoundRect(RectF rect, float rx, float ry, Path.Direction dir) 添加圆角矩形路径
      moveTo(float x, float y) 设置开始绘制直线的起始点
      lineTo(float x, float y) 在moveTo()方法设置的起始点与该方法指定的结束点之间画一条直线,如果在调用该方法之前没使用moveTo()方法设置 起始点,那么将从(0,0)点开始绘制直线
      quadTo(float x1, float y1, float x2, float y2) 用于根据指定的参数绘制一条线段轨迹
      close() 闭合路径

    说明:在使用addCircle()、addOval()、addRect()和addRoundRect()方法时,需要指定Path.Direction类型的常量,可选值为Path.Direction.CW(顺时针)和Path.Direction.CCW(逆时针)。

    例如,要创建一个顺时针旋转的圆形路径,可以使用下面的代码:

    Path path=new Path(); //创建并实例化一个path对象 
    path.addCircle(150, 200, 60, Path.Direction.CW); //在path对象中添加一个圆形路径 
    
    

    要创建一个折线,可以使用下面的代码:

    Path mypath=new Path(); //创建并实例化一个mypath对象 
    mypath.moveTo(50, 100); //设置起始点 
    mypath.lineTo(100, 45); //设置第1段直线的结束点 
    mypath.lineTo(150, 100); //设置第2段直线的结束点 
    mypath.lineTo(200, 80); //设置第3段直线的结束点
    

    要创建一个三角形路径,可以使用下面的代码:
    Path path=new Path(); //创建并实例化一个path对象
    path.moveTo(50,50); //设置起始点
    path.lineTo(100, 10); //设置第1条边的结束点,也是第2条边的起始点
    path.lineTo(150, 50); //设置第2条边的结束点,也是第3条边的起始点
    path.close(); //闭合路径

    说明:在创建三角形路径时,如果不使用close()方法闭合路径,那么绘制的将是两条线组成的折线。

    绘制图片

    在Android中,Canvas类不仅可以绘制几何图形、文件和路径,还可用来绘制图片。要想使用Canvas类绘制图片,只需要使用Canvas类提供的如表所示的方法将Bitmap对象中保存的图片绘制到画布上即 可。

    drawBitmap(Bitmap bitmap, Rectsrc, RectF dst, Paint paint) 用于从指定点绘制从源位图中“挖取”的一块
    drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 用于在指定点绘制位图
    drawBitmap(Bitmap bitmap, Rectsrc, Rect dst, Paint paint) 用于从指定点绘制从源位图中“挖取”的一块

    例如,从源位图上“挖取”从(0,0)点到(500,300)点的一块图像,然后绘制到画布的(50,50)点到(450,350)点所指区域,可以使用下面的代码:
    Rect src=new Rect(0,0,500,300); //设置挖取的区域
    Rect dst=new Rect(50,50,450,350); //设置绘制的区域
    canvas.drawBitmap(bm, src, dst, paint); //绘制图片

    为图形添加特效

    在Android中,不仅可以绘制图形,还可以为图形添加特效。例如,对图形进行旋转、缩放、倾斜、平移和渲染等,下面将分别进行介绍。

    旋转图像

    使用Android提供的android.graphics.Matrix类的setRotate()、postRotate()和preRotate()方法,可以对图像进行旋转
    说明:在Android API中,提供了setXXX()、postXXX()和preXXX()3种方法,其中,setXXX()方法用于直接设置Matrix的值,每使用一次setXXX()方法,整个Matrix都会改变;postXXX()方法用于采用后乘的方式 为Matrix设置值,可以连续多次使用post完成多个变换;preXXX()方法用于采用前乘的方式为Matrix设置值,使用preXXX()方法设置的操作最先发生。

    由于这3个方法除了方法名不同外,语法格式等均相同,下面将以setRotate()方法为例来进行介绍。setRotate()方法有以下两种语法格式。
    [√]setRotate(float degrees)

    使用该语法格式可以控制Matrix进行旋转,float类型的参数用于指定旋转的角度。例如,创建一个Matrix的对象,并将其旋转30°,可以使用下面的代码:
    Matrix matrix=new Matrix(); //创建一个Matrix的对象
    matrix.setRotate(30); //将Matrix的对象旋转30°

    [√]setRotate(float degrees, float px, float py) 使用该语法格式可以控制Matrix以参数px和py为轴心进行旋转,float类型的参数用于指定旋转的角度。例如,创建一个Matrix的对象,并将其以(10,10)为轴心旋转30°,可以使用下面的代码:

    Matrix matrix=new Matrix(); //创建一个Matrix的对象
    matrix.setRotate(30,10,10); //将Matrix的对象旋转30°

    创建Matrix的对象并对其进行旋转后,还需要应用该Matrix对图像或组件进行控制。在Canvas类中提供了一个drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)方法,可以在绘制图像的同时应用Matrix上的 变化。例如,需要将一个图像旋转30°后绘制到画布上,可以使用下面的代码:

    Paint paint=new Paint();
    Bitmap bitmap=BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.rabbit); Matrix matrix=new Matrix(); matrix.setRotate(30); canvas.drawBitmap(bitmap, matrix, paint);

    使用BitmapShader渲染图像

    在Android中,提供的BitmapShader类主要用来渲染图像。如果需要将一张图片裁剪成椭圆形或圆形等形状并显示到屏幕上,就可以使用BitmapShader类来实现。使用BitmapShader来渲染图像的基本步骤如 下。
    (1)创建BitmapShader类的对象,可以通过以下构造方法进行创建:
    其中,参数bitmap用于指定一个位图对象,通常是要用来渲染的原图像;参数tileX用于指定在水平方向上图像的重复方式;参数tileY用于指定在垂直方向上图像的重复方式。 例如,要创建一个在水平方向上重复、在垂直方向上镜像的BitmapShader对象,可以使用下面的代码:

    BitmapShader bitmapshader= new BitmapShader(bitmap_bg,TileMode.REPEAT,TileMode.MIRROR);

    说明:Shader.TileMode类型的参数包括CLAMP、MIRROR和REPEAT 3个可选值,其中,CLAMP为使用边界颜色来填充剩余的空间;MIRROR为采用镜像方式;REPEAT为采用重复方式。

    (2)通过Paint的setShader()方法来设置渲染对象。

    (3)在绘制图像时,使用已经设置了setShader()方法的画笔。

    Android中的动画

    在应用Android进行项目开发时,特别是在进行游戏开发时,经常需要涉及动画。Android中的动画通常可以分为逐帧动画和补间动画两种。下面将分别介绍如何实现这两种动画。

    实现逐帧动画

    逐帧动画就是顺序播放事先准备好的静态图像,利用人眼的“视觉暂留”原理,给用户造成动画的错觉。实现逐帧动画比较简单,只需要以下两个步骤。

    (1)在Android XML资源文件中定义一组用于生成动画的图片资源,可以使用包含一系列子标记的标记来实现,具体语法格式如下:

    <animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:oneshot="true|false" > 
    	<item android:drawable="@drawable/图片资源源名名1" android:duration="integer" /><!-- 省略了部分<item></item>标记 --> 
    	<item android:drawable="@drawable/图片资源源名名n" android:duration="integer" />
    </animation-list>
    

    在上面的语法中,android:oneshot属性用于设置是否循环播放,默认值为true,表示循环播放;android:drawable属性用于指定要显示的图片资源;android:duration属性指定图片资源持续的时间。

    (2)使用步骤(1)中定义的动画资源。通常情况下,可以将其作为组件的背景使用。例如,可以在布局文件中添加一个线性布局管理器,然后将该布局管理器的android:background属性设置为所定义的动画 资源。也可以将定义的动画资源作为ImageView的背景使用。

    说明:在Android中还支持在Java代码中创建逐帧动画。具体的步骤是:首先创建AnimationDrawable对象,然后调用addFrame()方法向动画中添加帧,每调用一次addFrame()方法,将添加一个帧。

    实现补间动画

    补间动画就是通过对场景里的对象不断进行图像变化来产生动画效果。在实现补间动画时,只需要定义动画开始和结束的关键帧,其他过渡帧由系统自动计算并补齐。在Android中,提供了4种补间动 画。

    1. 透明度渐变动画((AlphaAnimation) 透明度渐变动画就是指通过View组件透明度的变化来实现View的渐隐渐显效果。它主要通过为动画指定开始时的透明度、结束时的透明度以及持续时间来创建动画。同逐帧动画一样,也可以在XML文 件中定义透明度渐变动画的资源文件,基本的语法格式如下:
    <set xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:interpolator="@[package:]anim/interpolator_resource"> 
    	
    	<alphaandroid:repeatMode="reverse|restart" 
    		android:repeatCount="次数|infinite" 
    		android:duration="Integer" 
    		android:fromAlpha="float" 
    		android:toAlpha="float" /> 
    </set>
    

    在上面的语法中,各属性说明
    android:interpolator 用于控制动画的变化速度,使得动画效果可以匀速、加速、减速或抛物线速度等各种速度变化,其属性值如下表所示 android:repeatMode 用于设置动画的重复方式,可选值为reverse(反向)或restart(重新开始)
    android:repeatCount 用于设置动画的重复次数,属性可以是代表次数的数值,也可以是infinite(无限循环)
    android:duration 用于指定动画持续的时间,单位为毫秒
    android:fromAlpha 用于指定动画开始时的透明度,值为0.0代表完全透明,值为1.0代表完全不透明
    android:toAlpha 用于指定动画结束时的透明度,值为0.0代表完全透明,值为1.0代表完全不透明

    @android:anim/linear_interpolator 动画一直在做匀速改变
    @android:anim/accelerate_interpolator 动画在开始的地方改变较慢,然后开始加速
    @android:anim/decelerate_interpolator 动画在开始的地方改变速度较快,然后开始减速
    @android:anim/accelerate_decelerate_interpolator 动画在开始和结束的地方改变速度较慢,在中间的时候加速
    @android:anim/cycle_interpolator 动画循环播放特定的次数,变化速度按正弦曲线改变
    @android:anim/bounce_interpolator 动画结束的地方采用弹球效果
    @android:anim/anticipate_overshoot_interpolator 在动画开始的地方先向后退一小步,再开始动画,到结束的地方再超出一小步,最后回到动画结束的地方
    @android:anim/overshoot_interpolator 动画快速到达终点并超出一小步,最后回到动画结束的地方
    @android:anim/anticipate_interpolator 在动画开始的地方先向后退一小步,再快速到达动画结束的地方

    例如,定义一个让View组件从完全透明到完全不透明、持续时间为2秒钟的动画,可以使用下面的代码:

    <set xmlns:android="http://schemas.android.com/apk/res/android"> 
    
    	<alpha android:fromAlpha="0" 
    		android:toAlpha="1" 
    		android:duration="2000"/> 
    		
    </set>
    
    1. 旋转动画((RotateAnimation)
      旋转动画就是通过为动画指定开始时的旋转角度、结束时的旋转角度以及持续时间来创建动画。在旋转时,还可以通过指定轴心点坐标来改变旋转的中心。同透明度渐变动画一样,也可以在XML文件中 定义旋转动画资源文件,基本的语法格式如下:
    <set xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:interpolator="@[package:]anim/interpolator_resource"> 
    	
    	<rotate android:fromDegrees="float" 
    		android:toDegrees="float" 
    		android:pivotX="float" 
    		android:pivotY="float" 
    		android:repeatMode="reverse|restart" 
    		android:repeatCount="次数|infinite" 
    		android:duration="Integer"/>
    		
    </set>
    

    在上面的语法中,各属性说明如表

    android:interpolator 用于控制动画的变化速度,使得动画效果可以匀速、加速、减速或抛物线速度等各种速度变化,其属性值见表9.8 android:fromDegrees 用于指定动画开始时的旋转角度
    android:toDegrees 用于指定动画结束时的旋转角度
    android:pivotX 用于指定轴心点的X坐标
    android:pivotY 用于指定轴心点的Y坐标
    android:repeatMode 用于设置动画的重复方式,可选值为reverse(反向)或restart(重新开始)
    android:repeatCount 用于设置动画的重复次数,属性可以是代表次数的数值,也可以是infinite(无限循环)
    android:duration 用于指定动画持续的时间,单位为毫秒

    例如,定义一个让图片从0°转到360°、持续时间为2秒钟、中心点在图片的中心的动画,可以使用下面的代码:

    <rotate android:fromDegrees="0" 
    	android:toDegrees="360" 
    	android:pivotX="50%" 
    	android:pivotY="50%" 
    	android:duration="2000"> 
    </rotate>
    
    1. 缩放动画(ScaleAnimation)
      缩放动画就是通过为动画指定开始时的缩放系数、结束时的缩放系数以及持续时间来创建动画。在缩放时,还可以通过指定轴心点坐标来改变缩放的中心。同透明度渐变动画一样,也可以在XML文件中 定义缩放动画资源文件,基本的语法格式如下:
    <set xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:interpolator="@[package:]anim/interpolator_resource"> 
    	
    	<scaleandroid:fromXScale="float" 
    		android:toXScale="float" 
    		android:fromYScale="float" 
    		android:toYScale="float" 
    		android:pivotX="float" 
    		android:pivotY="float" 
    		android:repeatMode="reverse|restart" 
    		android:repeatCount="次数|infinite" 
    		android:duration="Integer"/> 
    </set>
    

    在上面的语法中,各属性说明如表

    <scale android:fromXScale="1" 
    	android:fromYScale="1" 
    	android:toXScale="2.0" 
    	android:toYScale="2.0" 
    	android:pivotX="50%"
    	android:pivotY="50%" 
    	android:duration="2000"/>
    
    1. 平移动画(Translate Animation)
      平移动画就是通过为动画指定开始时的位置、结束时的位置以及持续时间来创建动画。同透明度渐变动画一样,也可以在XML文件中定义平移动画资源文件,基本的语法格式如下:
    <set xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:interpolator="@[package:]anim/interpolator_resource"> 
    	
    	<translate android:fromXDelta="float" 
    		android:toXDelta="float" 
    		android:fromYDelta="float" 
    		android:toYDelta="float" 
    		android:repeatMode="reverse|restart" 
    		android:repeatCount="次数|infinite" 
    		android:duration="Integer"/> 
    </set>
    

    android:interpolator 用于控制动画的变化速度,使得动画效果可以匀速、加速、减速或抛物线速度等各种速度变化,其属性值见表9.8 android:fromXDelta 用于指定动画开始时水平方向上的起始位置
    android:toXDelta 用于指定动画结束时水平方向上的起始位置
    android:fromYDelta 用于指定动画开始时垂直方向上的起始位置
    android:toYDelta 用于指定动画结束时垂直方向上的起始位置
    android:repeatMode 用于设置动画的重复方式,可选值为reverse(反向)或restart(重新开始)
    android:repeatCount 用于设置动画的重复次数,属性可以是代表次数的数值,也可以是infinite(无限循环)
    android:duration 用于指定动画持续的时间,单位为毫秒

    例如,定义一个让图片从(0,0)点到(300,300)点、持续时间为2秒钟的动画,可以使用下面的代码:

    <translate android:fromXDelta="0" 
    	android:toXDelta="300" 
    	android:fromYDelta="0" 
    	android:toYDelta="300" 
    	android:duration="2000"> 
    </translate>
    

    范例1:忐忑的精灵

    使用逐帧动画实现一个忐忑的精灵动画。
    (1)在新建项目的res目录中,首先创建一个名称为anim的目录,并在该目录中添加一个名称为fairy.xml的XML资源文件,然后在该文件中定义组成动画的图片资源,具体代码如下:

    <?xml version="1.0" encoding="utf-8"?> 
    	<animation-list xmlns:android="http://schemas.android.com/apk/res/android" > 
    	
    	<item android:drawable="@drawable/img001" android:duration="60"/> 
    	<item android:drawable="@drawable/img002" android:duration="60"/> 
    	<item android:drawable="@drawable/img003" android:duration="60"/> 
    	<item android:drawable="@drawable/img004" android:duration="60"/> 
    	<item android:drawable="@drawable/img005" android:duration="60"/> 
    	<item android:drawable="@drawable/img006" android:duration="60"/> 
    	
    </animation-list>
    

    (2)修改新建项目的res\layout目录下的布局文件main.xml,将默认添加的TextView组件删除,然后为默认添加的线性布局管理器设置android:id和android:background属性。将android:background属性为步骤(1)中 创建的动画资源,修改后的代码如下:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    	android:layout_width="fill_parent" 
    	android:layout_height="fill_parent" 
    	android:background="@anim/fairy" 
    	android:id="@+id/ll" 
    	android:orientation="vertical" > 
    </LinearLayout>
    

    (3)打开默认创建的MainActivity,在该文件中,首先创建一个名称为MyView的内部类,该类继承自android.view.View类,并添加构造方法和重写onDraw(Canvascanvas)方法,然后在onCreate()方法中获取布局 文件中添加的帧布局管理器,并将MyView视图添加到该帧布局管理器中。

    LinearLayout ll=(LinearLayout)findViewById(R.id.ll); //获取布局文件中添加的线性布局管理器 
    final AnimationDrawable anim=(AnimationDrawable)ll.getBackground(); //获取AnimationDrawable对象 
    //为线性布局管理器添加单击事件监听器 
    ll.setOnClickListener(new OnClickListener() { 
    	@Override 
    	public void onClick(View v) { 
    		if(flag){ 
    			anim.start(); //开始播放动画 
    			flag=false; 
    		}else{
    			anim.stop(); //停止播放动画 
    			flag=true; 
    		} 
    	} 
    });
    

    9.4.4 范例2:旋转、平移、缩放和透明度渐变的补间动画

    (1)在新建项目的res目录中,创建一个名称为anim的目录,并在该目录中创建实现旋转、平移、缩放和透明度渐变的动画资源文件。
    ① 创建名称为anim_alpha.xml的XML资源文件,在该文件中定义一个实现透明度渐变的动画,该动画的渐变过程为“完全不透明→完全透明→完全不透明”,具体代码如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <set xmlns:android="http://schemas.android.com/apk/res/android"> 
    	<alpha android:fromAlpha="1" 
    		android:toAlpha="0" 
    		android:fillAfter="true" 
    		android:repeatMode="reverse" 
    		android:repeatCount="1" 
    		android:duration="2000"/> 
    </set>
    

    ② 创建名称为anim_rotate.xml的XML资源文件,在该文件中定义一个实现旋转的动画,该动画为从0°旋转到720°,再从360°旋转到0°,具体代码如下:

    <set xmlns:android="http://schemas.android.com/apk/res/android"> 
    	<rotate android:interpolator="@android:anim/accelerate_interpolator" 
    		android:fromDegrees="0" 
    		android:toDegrees="720"
    		android:pivotX="50%" 
    		android:pivotY="50%" 
    		android:duration="2000"> 
    	</rotate> 
    	
    	<rotate android:interpolator="@android:anim/accelerate_interpolator" 
    		android:startOffset="2000" 
    		android:fromDegrees="360" 
    		android:toDegrees="0" 
    		android:pivotX="50%" 
    		android:pivotY="50%" 
    		android:duration="2000"> 
    	</rotate> 
    </set>
    

    ③ 创建名称为anim_scale.xml的XML资源文件,在该文件中定义一个实现缩放的动画,该动画首先将原图像放大2倍,再逐渐收缩为图像的原尺寸,具体代码如下

    <?xml version="1.0" encoding="utf-8"?> 
    <set xmlns:android="http://schemas.android.com/apk/res/android"> 
    	<scale android:fromXScale="1" 
    		android:interpolator="@android:anim/decelerate_interpolator" 
    		android:fromYScale="1" 
    		android:toXScale="2.0"
    		android:toYScale="2.0" 
    		android:pivotX="50%" 
    		android:pivotY="50%" 
    		android:fillAfter="true" 
    		android:repeatCount="1" 
    		android:repeatMode="reverse" 
    		android:duration="2000"/> 
    </set>
    

    ④ 创建名称为anim_translate.xml的XML资源文件,在该文件中定义一个实现平移的动画,该动画为从屏幕的左侧移动到屏幕的右侧,再从屏幕的右侧返回到左侧,具体代码如下:

    <?xml version="1.0" encoding="utf-8"?> 
    <set xmlns:android="http://schemas.android.com/apk/res/android"> 
    	<translate android:fromXDelta="0" 
    		android:toXDelta="860" 
    		android:fromYDelta="0" 
    		android:toYDelta="0" 
    		android:fillAfter="true" 
    		android:repeatMode="reverse" 
    		android:repeatCount="1" 
    		android:duration="2000"> 
    	</translate> 
    </set>
    

    (2)修改新建项目的res\layout目录下的布局文件main.xml,将默认添加的TextView组件删除,然后在默认添加的线性布局管理器中添加一个水平线性布局管理器和一个ImageView组件,再向该水平线性布局 管理器中添加4个Button组件,最后设置ImageView组件的左边距和要显示的图片。

    (3)打开默认创建的MainActivity,在onCreate()方法中,首先获取动画资源文件中创建的动画资源,然后获取要应用动画效果的ImageView,再获取“旋转”按钮,并为该按钮添加单击事件监听器,在重写的 onClick()方法中,播放旋转动画。具体代码如下:

    final Animation rotate=AnimationUtils.loadAnimation(this, R.anim.anim_rotate); //获取旋转动画资源 
    final Animation translate=AnimationUtils.loadAnimation(this, R.anim.anim_translate); //获取平移动画资源 
    final Animation scale=AnimationUtils.loadAnimation(this, R.anim.anim_scale); //获取缩放动画资源 
    final Animation alpha=AnimationUtils.loadAnimation(this, R.anim.anim_alpha); //获取透明度变化动画资源 
    final ImageView iv=(ImageView)findViewById(R.id.imageView1); //获取要应用动画效果的
    ImageView Button button1=(Button)findViewById(R.id.button1); //获取“旋转”按钮 
    button1.setOnClickListener(new OnClickListener() { 
    	@Override 
    	public void onClick(View v) { 
    		iv.startAnimation(rotate); //播放旋转动画 
    	} 
    });
    

    获取“平移”按钮,并为该按钮添加单击事件监听器,在重写的onClick()方法中,播放平移动画,关键代码如下

    iv.startAnimation(translate); //播放平移动画
    

    获取“缩放”按钮,并为该按钮添加单击事件监听器,在重写的onClick()方法中,播放缩放动画,关键代码如下:

    iv.startAnimation(scale); //播放缩放动画
    

    获取“透明度渐变”按钮,并为该按钮添加单击事件监听器,在重写的onClick()方法中,播放透明度渐变动画,关键代码如下

    iv.startAnimation(alpha);
    
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,909
精华内容 1,163
关键字:

图形图像处理技术