在Android中进行图像旋转需要使用Matrix,-->矩阵对象,它包含了一个3X3的矩阵,专门用于进行图像变换匹配。Matrix没有结构体,它必须被初始化,通过reset方法 和set 方法来实现。通过setRotate 设置旋转角度,用createBitmap创建一个经过旋转等处理的Bitmap对象,然后将Bitmap对象绘制到屏幕之上,于是就实现了旋转操作。 其实我们要实现一个位图的变化,旋转啊,缩放啊。 无非就有2中思路,一:将一个位图按照需求重画一遍,画后的位图就是我们需要的了,与位图的显示几乎一样。二:就是在原有位图的基础上,缩放原位图,创建一个新的位图。下边 我们就看看这个图片旋转的例子吧。 可以通过手机 左右键来旋转图片。先看一下运行效果吧。
然后是我们的 Activity01类
下边是我们自己定义的View类 GameView
![](http://dl.iteye.com/upload/attachment/358214/727365f9-8540-322a-bf40-115814912a94.jpg)
![](http://dl.iteye.com/upload/attachment/358216/2ab1f632-3100-3300-bda6-1e088f37932e.jpg)
![](http://dl.iteye.com/upload/attachment/358218/e8e4ad72-ce71-306d-a884-432567c5c930.jpg)
然后是我们的 Activity01类
- 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
- 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);
- }
- }