25.Android之图像的平移、旋转及缩放学习

摘要:
您可以使用drawBitmap()的(x,null)方法在屏幕上显示图像。您可以将图像绘制到屏幕的(x,null)方法。您可以使用矩阵旋转图像。可以使用creatBitmap()方法创建旋转的位图对象,该对象实现图像旋转操作。您还可以使用Matrix实现图像缩放。使用Matrix的postScale()方法设置图像缩放倍数。

在Android中,项目目录下的resdrawable用来放置该项目的图片资源。

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

1.图像绘制

  在绘制图像之前,需要从项目目录下的resdrawable中获取所需的图片资源。我们可以通过资源索引来获得该图像对象Bitmap。具体方法如下(在项目目录下的resdrawable中放置了一张名为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 void run() {
 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 package com.example.matrixdemo;
  2 
  3 import android.content.Context;
  4 import android.graphics.Bitmap;
  5 import android.graphics.Canvas;
  6 import android.graphics.Color;
  7 import android.graphics.Matrix;
  8 import android.graphics.drawable.BitmapDrawable;
  9 import android.view.KeyEvent;
 10 import android.view.View;
 11 
 12 
 13 public class MyView extends View implements Runnable {
 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     public MyView(Context context) {
 25         super(context);
 26             
 27         mBitmap = ((BitmapDrawable) getResources().getDrawable
 28                 (R.drawable.kobe)).getBitmap();          // 从资源文件中装载图片
 29         
 30         new Thread(this).start();             //开启线程
 31     }
 32 
 33     public void onDraw(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(int keyCode, 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(int keyCode, KeyEvent event) {
100         return false;
101     }
102         
103      // 线程处理
104     public void run() {
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, int y) {
118         canvas.drawBitmap(bitmap, x, y, null);
119     }
120 }

运行效果:

25.Android之图像的平移、旋转及缩放学习第1张

转载:http://www.cnblogs.com/menlsh/archive/2012/12/02/2798802.html

免责声明:文章转载自《25.Android之图像的平移、旋转及缩放学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt学习 之 Socket通信RocketMQ多master迁移至多master多slave模式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IDEA中设置注释模板的方法

  IDEA中设置注释模板主要分为两个部分,分别是创建java文件时类的注释和方法的注释。   这里为大家详细介绍一下方法,按MyEclipse的风格设置(MyEclipse的请看:MyEclipse中设置注释模板的方法),大家可以根据自己的习惯生成自己喜欢的注释模板。效果如下:   一、设置类的注释模板 1、选择File→Settings→Editor→...

SpringMVC拦截器详解

拦截器是每个Web框架必备的功能,也是个老生常谈的主题了。 本文将分析SpringMVC的拦截器功能是如何设计的,让读者了解该功能设计的原理。 重要接口及类介绍1. HandlerExecutionChain类   由HandlerMethod和Interceptor集合组成的类,会被HandlerMapping接口的getHandler方法获取。 2....

.net 中的async,await理解

理解: 1、async修饰的方法可理解为异步方法(必须要配合await,否则和普通方法无异)2、当async方法执行遇到await,则立即将控制权转移到async方法的调用者3、由调用者决定是否需要等待async方法执行完再继续往下执行4、await会挂起当前方法,即阻塞当前方法继续往下执行,转交控制权给调用者 注意:如果调用一个async方 法,却不使用...

黑鹰破解笔记(2)

一、概论 壳出于程序作者想对程序资源压缩、注册保护的目的,把壳分为压缩壳和加密壳两种UPX ASPCAK TELOCK PELITE NSPACK ...ARMADILLO ASPROTECT ACPROTECT EPE SVKP ...顾名思义,压缩壳只是为了减小程序体积对资源进行压缩,加密壳是程序输入表等等进行加密保护。当然加密壳的保护能力要强得多!...

网络管理snmp实验

一、实验目的: 1)学习教材“8.1Windows管理命令”,熟练掌握操作系统自带的基本网络测试工具,课外完成。 2)学习并掌握snmputil命令的格式及基本使用。 二、实验要求提示: 1)分别使用Snmputil, SnmpUtilG试验(相关软件和资料见“资料/其他 ”)。 2)先对自己使用的计算机,再两人一组、对同学的计算机进行网管实验。 1)查看...

WebService(axis2),整合springmvc

 1.导入jar 2.在spring.xml中添加 <!-- axis2start --> <bean id="testWSService" class="com.sh.test.WsTestServer"></bean> <bean id="testWSService1" class="com....