android 从左向右平移_25.Android之图像的平移、旋转及缩放学习

本文介绍了Android中如何使用Bitmap和Matrix进行图像的平移、旋转和缩放操作。通过改变绘制图像的坐标、设置旋转角度和缩放倍数,结合线程更新界面,实现了图像动态变换的效果。
摘要由CSDN通过智能技术生成

Android中提供了Bitmap类来获取图像文件信息,进行图像的平移、旋转及缩放等操作,并可以指定格式保存图像文件。

1.图像绘制

在绘制图像之前,需要从项目目录下的res\drawable中获取所需的图片资源。我们可以通过资源索引来获得该图像对象Bitmap。具体方法如下(在项目目录下的res\drawable中放置了一张名为fuwa.png的图片):

mBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.fuwa)).getBitmap():

其中,getResources()方法的作用是取得资源对象;getDrawable()方法的作用取得资源中的Drawable对象,参数为资源索引id;getBitmap()方法的作用是得到Bitmap对象。

获得图像资源后,可以使用drawBitmap()方法将图像显示到屏幕的(x,y)坐标位置上,具体方法如下:

Canvas.drawBitmap(mBitmap, x, y, null);

此外,要获得图像的信息,可以通过mBitmap.getHight()方法获得该图像的高度,通过mBitmap.getWidth()f方法获得该图像的宽度。

2.图像的平移

由图像的绘制方法,我们知道使用Canvas.drawBitmap(mBitmap, x, y, null)方法可以将图像绘制到屏幕的(x,y)坐标位置上。

所以,要实现图像的平移,只需要改变图像绘制到屏幕上的(x,y)坐标位置即可。

3.图像的旋转

在Android中,可以使用Matrix来进行图像旋转,Matrix是一个3*3的矩阵,专门用于图像变换匹配。Matrix没有结构体,必须被初始化,可以通过reset()或set()方法来实现,如下:

mMatrix.reset();

初始化之后就可以通过setRotate()方法来设置想要的旋转角度,如下:

mMatrix.setRotate();

旋转角度设置完毕后,可以使用creatBitmap()方法创建一个经过旋转处理的Bitmap对象,方法如下:

mBitmapRotate = Bitmap.creatBitmap(mBitmap, 0, 0, mBitmapWidth, mBitmapHight, mMatrix, true);

最后,将该Bitmap对象绘制到屏幕上,便实现了图像旋转的操作。

4.图像的缩放

在Android中,同样可以使用Matrix来实现图像的缩放。使用Matrix的postScale()方法来设置图像缩放的倍数,如下:

mMatrix.postScale();

缩放倍数设置完毕后,同样需要使用creatBitmap()方法创建一个经过缩放处理的Bitmap对象。最后,将该Bitmap对象绘制到屏幕上,便实现了图像缩放的操作。

5.使用线程更新界面

要达到在界面中实时的看到图像的旋转、缩放等效果,可以使用线程处理。在线程处理中加入postInvalidate()方法来实现。如下:

1 //线程处理

2 public voidrun() {3 while (!Thread.currentThread().isInterrupted()) {4 try{5 Thread.sleep(100);6 }7 catch(InterruptedException e) {8 Thread.currentThread().interrupt();9 }10 postInvalidate(); //使用postInvalidate可以直接在线程中更新界面

11 }12 }

6.实例

本实例中,定义了4个变量mBitmapToLeft、mBitmapToTop、mAngle以及mScale。变量mBitmapToLeft表示图像到屏幕左边界的距离,mBitmapToTop表示图像到屏幕顶端的距离,mAngle表示图像旋转的角度,mScale表示图像缩放的倍数。

通过上下左右四个按键可以实现图片的上下左右平行移动,通过menu及back按键可以控制图像的旋转角度,通过音量加减按键可以控制图像缩放的倍数。

在线程中处理这些操作,并调用postInvalidate()方法已到达实时刷新界面的目的。

实例源码如下:

1 packagecom.example.matrixdemo;2

3 importandroid.content.Context;4 importandroid.graphics.Bitmap;5 importandroid.graphics.Canvas;6 importandroid.graphics.Color;7 importandroid.graphics.Matrix;8 importandroid.graphics.drawable.BitmapDrawable;9 importandroid.view.KeyEvent;10 importandroid.view.View;11

12

13 public class MyView extends View implementsRunnable {14

15 Bitmap mBitmap = null; //图像对象

16 Matrix mMatrix = new Matrix(); //Matrix对象

17

18 int mBitmapToLeft = 0; //图像距离屏幕左边界的距离

19 int mBitmapToTop = 0; //图像距离屏幕顶端的距离

20

21 float mAngle = 0.0f; //旋转角度

22 float mScale = 1.0f; //缩放倍数

23

24 publicMyView(Context context) {25 super(context);26

27 mBitmap =((BitmapDrawable) getResources().getDrawable28 (R.drawable.kobe)).getBitmap(); //从资源文件中装载图片

29

30 new Thread(this).start(); //开启线程

31 }32

33 public voidonDraw(Canvas canvas) {34 super.onDraw(canvas);35

36 canvas.drawColor(Color.GRAY); //设置画布底色为灰色

37

38 mMatrix.reset(); //重置Matrix

39 mMatrix.setRotate(mAngle); //设置旋转的角度

40 mMatrix.postScale(mScale, mScale); //设置缩放的倍数41

42 //构建经过处理的新的Bitmap

43 Bitmap mBitmapRotate = Bitmap.createBitmap(mBitmap, 0, 0,44 mBitmap.getWidth(), mBitmap.getHeight(), mMatrix, true);45

46 MyView.drawImage(canvas, mBitmapRotate, mBitmapToLeft, mBitmapToTop);47 }48

49 //按键按下事件

50 public boolean onKeyDown(intkeyCode, KeyEvent event) {51 switch (keyCode) { //处理平移

52 case KeyEvent.KEYCODE_DPAD_UP: //上方向键:上移

53 if (mBitmapToTop > 0){54 mBitmapToTop--;55 }56 break;57 case KeyEvent.KEYCODE_DPAD_DOWN: //下方向键:下移

58 if ((mBitmapToTop + mBitmap.getHeight()) < 800) {59 mBitmapToTop++;60 }61 break;62 case KeyEvent.KEYCODE_DPAD_LEFT: //左方向键:左移

63 if (mBitmapToLeft > 0) {64 mBitmapToLeft--;65 }66 break;67 case KeyEvent.KEYCODE_DPAD_RIGHT: //右方向键:右移

68 if ((mBitmapToLeft + mBitmap.getWidth()) < 480) {69 mBitmapToLeft++;70 }71 break;72 }73

74 switch (keyCode) { //处理旋转事件

75 case KeyEvent.KEYCODE_MENU: //MENU键:顺时针旋转

76 mAngle--;77 break;78 case KeyEvent.KEYCODE_BACK: //BACK键:逆时针旋转

79 mAngle++;80 break;81 }82

83 switch (keyCode) { //处理缩放事件

84 case KeyEvent.KEYCODE_VOLUME_DOWN: //音量减键:缩小

85 if (mScale > 0.5) {86 mScale -= 0.2;87 }88 break;89 case KeyEvent.KEYCODE_VOLUME_UP: //音量加键:放大

90 if (mScale < 1.8) {91 mScale += 0.2;92 }93 break;94 }95 return true;96 }97

98 //按键弹起事件

99 public boolean onKeyUp(intkeyCode, KeyEvent event) {100 return false;101 }102

103 //线程处理

104 public voidrun() {105 while (!Thread.currentThread().isInterrupted()) {106 try{107 Thread.sleep(200);108 }109 catch(InterruptedException e) {110 Thread.currentThread().interrupt();111 }112 postInvalidate(); //使用postInvalidate可以直接在线程中更新界面

113 }114 }115

116 //绘制Bitmap

117 public static void drawImage(Canvas canvas, Bitmap bitmap, int x, inty) {118 canvas.drawBitmap(bitmap, x, y, null);119 }120 }

运行效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值