Android中进行图像旋转

来源:互联网 发布:python连接db2数据库 编辑:程序博客网 时间:2024/03/29 04:12
    在Android中进行图像旋转需要使用Matrix,-->矩阵对象,它包含了一个3X3的矩阵,专门用于进行图像变换匹配。Matrix没有结构体,它必须被初始化,通过reset方法 和set 方法来实现。通过setRotate 设置旋转角度,用createBitmap创建一个经过旋转等处理的Bitmap对象,然后将Bitmap对象绘制到屏幕之上,于是就实现了旋转操作。  其实我们要实现一个位图的变化,旋转啊,缩放啊。 无非就有2中思路,一:将一个位图按照需求重画一遍,画后的位图就是我们需要的了,与位图的显示几乎一样。二:就是在原有位图的基础上,缩放原位图,创建一个新的位图。下边 我们就看看这个图片旋转的例子吧。 可以通过手机 左右键来旋转图片。先看一下运行效果吧。






然后是我们的 Activity01类
Java代码  收藏代码
  1. package xiaohang.zhimeng;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.KeyEvent;  
  6.   
  7. public class Activity01 extends Activity {  
  8.   
  9.     private GameView mGameView = null;  
  10.   
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.   
  15.         mGameView = new GameView(this);  
  16.   
  17.         setContentView(mGameView);  
  18.     }  
  19.   
  20.     public boolean onKeyUp(int keyCode, KeyEvent event) {  
  21.         super.onKeyUp(keyCode, event);  
  22.         return true;  
  23.     }  
  24.   
  25.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  26.         if (mGameView == null) {  
  27.             return false;  
  28.         }  
  29.         if (keyCode == KeyEvent.KEYCODE_BACK) {  
  30.             this.finish();  
  31.             return true;  
  32.         }  
  33.         return mGameView.onKeyDown(keyCode, event);  
  34.     }  
  35. }  


  下边是我们自己定义的View类 GameView
Java代码  收藏代码
  1. package xiaohang.zhimeng;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Matrix;  
  7. import android.graphics.drawable.BitmapDrawable;  
  8. import android.view.KeyEvent;  
  9. import android.view.View;  
  10.   
  11. public class GameView extends View implements Runnable{  
  12.   
  13.   
  14.     //声明Bitmap对象  
  15.     Bitmap mBitQQ = null;  
  16.     int    BitQQwidth = 0;  
  17.     int    BitQQheight = 0;  
  18.       
  19.     float   Angle = 0.0f;  
  20.       
  21.     //构建Matrix对象  
  22.     Matrix mMatrix = new Matrix();  
  23.     public GameView(Context context) {  
  24.         super(context);  
  25.           
  26.         //装载资源  
  27.         mBitQQ = ((BitmapDrawable)getResources().getDrawable(R.drawable.xh)).getBitmap();  
  28.           
  29.         //得到图片的高度和宽度  
  30.         BitQQwidth = mBitQQ.getWidth();  
  31.         BitQQheight = mBitQQ.getHeight();  
  32.           
  33.         //开启线程  
  34.         new Thread(this).start();  
  35.     }  
  36.       
  37.     @Override  
  38.     protected void onDraw(Canvas canvas) {  
  39.         super.onDraw(canvas);  
  40.         //重置mMatrix对象  
  41.         mMatrix.reset();  
  42.           
  43.         //设置旋转  
  44.         mMatrix.setRotate(Angle);  
  45.           
  46.         //按mMatrix的旋转构建一个新的Bitmap  这里给大家说一下这个方法这几个参数 搞的我比较郁闷了  
  47.         /*第一个参数不说了 
  48.          * 第二个 帮助文档翻译过来 是第一个像素源的 X坐标 我不知道是咋回事,如果哪位大哥知道还请给小弟留言 
  49.          * 这里要提醒大家一下 就是 第二个参数 和第三个参数 0,0 这2个参数 必须 我写一个式子吧 
  50.          * 0+mBitQQ.getWidt() <= Bitmap.width 
  51.          * 0+mBitQQ.getHeight() <= Bitmap.height  大家仔细看看 所以这2个参数我觉得只能写0虽然我不知道 
  52.          * 这2个参数到底用来决定什么。 如果大家谁知道 留言啊 谢谢。 如果不遵守那个式子就会有异常 大家可以看一看此方法的源码 或者自己试试 
  53.          * 第三个参数和第二个表达意思一样 
  54.          * 第四个参数可以理解为宽度 
  55.          * 第五个参数可以理解为高度 
  56.          * 第六个参数矩阵对象 
  57.          * 第七个参数 我也不知道是干嘛的 但是 设置为true之后,图片的旋转的过程中 不会失真,就是字会看不清楚。 
  58.          * 大家可以下载源码试试  这个参数 建议还是设置为true吧。 
  59.          * */  
  60.         Bitmap mBitQQ2 = Bitmap.createBitmap(mBitQQ, 00, BitQQwidth, BitQQheight, mMatrix, true);  
  61.           
  62.         //绘制旋转后的图片  
  63.         GameView.drawImage(canvas, mBitQQ2, (320-BitQQwidth)/210);  
  64.           
  65.         mBitQQ2 = null;  
  66.     }  
  67.       
  68.     //按键按下事件  
  69.     public boolean onKeyDown(int keyCode, KeyEvent event){  
  70.         //左方向键  
  71.         if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {  
  72.             Angle--;  
  73.         }else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){  
  74.             Angle++;  
  75.         }  
  76.         return true;  
  77.     }  
  78.       
  79.     //按键弹起事件  
  80.     public boolean onKeyUp(int keyCode, KeyEvent event){  
  81.         return true;  
  82.     }  
  83.       
  84.     public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){  
  85.         return true;  
  86.     }  
  87.     //线程处理  
  88.     public void run() {  
  89.         while (!Thread.currentThread().isInterrupted()) {  
  90.             try {  
  91.                 Thread.sleep(100);  
  92.             } catch (Exception e) {  
  93.                 Thread.currentThread().interrupt();  
  94.             }  
  95.             postInvalidate();  
  96.         }  
  97.     }  
  98.       
  99.     /** 
  100.      * 绘制一个Bitmap 
  101.      * @param   canvas  画布 
  102.      * @param   bitmap  图片 
  103.      * @param   x       屏幕上的x坐标 
  104.      * @param   y       屏幕上的y坐标 
  105.      * */  
  106.     public static void drawImage(Canvas canvas, Bitmap bitmap, int x ,int y){  
  107.         //绘制图像  
  108.         canvas.drawBitmap(bitmap, x, y, null);  
  109.     }  
  110.       
  111. }