Android中进行图像旋转

发布时间:2016-12-9 0:21:00 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Android中进行图像旋转",主要涉及到Android中进行图像旋转方面的内容,对于Android中进行图像旋转感兴趣的同学可以参考一下。

    在Android中进行图像旋转需要使用Matrix,-->矩阵对象,它包含了一个3X3的矩阵,专门用于进行图像变换匹配。Matrix没有结构体,它必须被初始化,通过reset方法 和set 方法来实现。通过setRotate 设置旋转角度,用createBitmap创建一个经过旋转等处理的Bitmap对象,然后将Bitmap对象绘制到屏幕之上,于是就实现了旋转操作。  其实我们要实现一个位图的变化,旋转啊,缩放啊。 无非就有2中思路,一:将一个位图按照需求重画一遍,画后的位图就是我们需要的了,与位图的显示几乎一样。二:就是在原有位图的基础上,缩放原位图,创建一个新的位图。下边 我们就看看这个图片旋转的例子吧。 可以通过手机 左右键来旋转图片。先看一下运行效果吧。 然后是我们的 Activity01类 Java代码   package xiaohang.zhimeng;    import android.app.Activity;  import android.os.Bundle;  import android.view.KeyEvent;    public class Activity01 extends Activity {        private GameView mGameView = null;        @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);            mGameView = new GameView(this);            setContentView(mGameView);      }        public boolean onKeyUp(int keyCode, KeyEvent event) {          super.onKeyUp(keyCode, event);          return true;      }        public boolean onKeyDown(int keyCode, KeyEvent event) {          if (mGameView == null) {              return false;          }          if (keyCode == KeyEvent.KEYCODE_BACK) {              this.finish();              return true;          }          return mGameView.onKeyDown(keyCode, event);      }  }     下边是我们自己定义的View类 GameView Java代码   package xiaohang.zhimeng;    import android.content.Context;  import android.graphics.Bitmap;  import android.graphics.Canvas;  import android.graphics.Matrix;  import android.graphics.drawable.BitmapDrawable;  import android.view.KeyEvent;  import android.view.View;    public class GameView extends View implements Runnable{          //声明Bitmap对象      Bitmap mBitQQ = null;      int    BitQQwidth = 0;      int    BitQQheight = 0;            float   Angle = 0.0f;            //构建Matrix对象      Matrix mMatrix = new Matrix();      public GameView(Context context) {          super(context);                    //装载资源          mBitQQ = ((BitmapDrawable)getResources().getDrawable(R.drawable.xh)).getBitmap();                    //得到图片的高度和宽度          BitQQwidth = mBitQQ.getWidth();          BitQQheight = mBitQQ.getHeight();                    //开启线程          new Thread(this).start();      }            @Override      protected void onDraw(Canvas canvas) {          super.onDraw(canvas);          //重置mMatrix对象          mMatrix.reset();                    //设置旋转          mMatrix.setRotate(Angle);                    //按mMatrix的旋转构建一个新的Bitmap  这里给大家说一下这个方法这几个参数 搞的我比较郁闷了          /*第一个参数不说了          * 第二个 帮助文档翻译过来 是第一个像素源的 X坐标 我不知道是咋回事,如果哪位大哥知道还请给小弟留言          * 这里要提醒大家一下 就是 第二个参数 和第三个参数 0,0 这2个参数 必须 我写一个式子吧          * 0+mBitQQ.getWidt() <= Bitmap.width          * 0+mBitQQ.getHeight() <= Bitmap.height  大家仔细看看 所以这2个参数我觉得只能写0虽然我不知道          * 这2个参数到底用来决定什么。 如果大家谁知道 留言啊 谢谢。 如果不遵守那个式子就会有异常 大家可以看一看此方法的源码 或者自己试试          * 第三个参数和第二个表达意思一样          * 第四个参数可以理解为宽度          * 第五个参数可以理解为高度          * 第六个参数矩阵对象          * 第七个参数 我也不知道是干嘛的 但是 设置为true之后,图片的旋转的过程中 不会失真,就是字会看不清楚。          * 大家可以下载源码试试  这个参数 建议还是设置为true吧。          * */          Bitmap mBitQQ2 = Bitmap.createBitmap(mBitQQ, 0, 0, BitQQwidth, BitQQheight, mMatrix, true);                    //绘制旋转后的图片          GameView.drawImage(canvas, mBitQQ2, (320-BitQQwidth)/2, 10);                    mBitQQ2 = null;      }            //按键按下事件      public boolean onKeyDown(int keyCode, KeyEvent event){          //左方向键          if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {              Angle--;          }else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){              Angle++;          }          return true;      }            //按键弹起事件      public boolean onKeyUp(int keyCode, KeyEvent event){          return true;      }            public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event){          return true;      }      //线程处理      public void run() {          while (!Thread.currentThread().isInterrupted()) {              try {                  Thread.sleep(100);              } catch (Exception e) {                  Thread.currentThread().interrupt();              }              postInvalidate();          }      }            /**      * 绘制一个Bitmap      * @param   canvas  画布      * @param   bitmap  图片      * @param   x       屏幕上的x坐标      * @param   y       屏幕上的y坐标      * */      public static void drawImage(Canvas canvas, Bitmap bitmap, int x ,int y){          //绘制图像          canvas.drawBitmap(bitmap, x, y, null);      }        }  

上一篇:理解嵌入式开发中的一些硬件相关的概念
下一篇:C/C++/C#面试题精选(2)

相关文章

相关评论