欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发之图片旋转功能实现方法【基于Matrix】

程序员文章站 2023-12-17 10:23:16
本文实例讲述了android开发之图片旋转功能实现方法。分享给大家供大家参考,具体如下: 在android中进行图像旋转需要使用matrix,它包含了一个3*3的矩阵,专...

本文实例讲述了android开发之图片旋转功能实现方法。分享给大家供大家参考,具体如下:

在android中进行图像旋转需要使用matrix,它包含了一个3*3的矩阵,专门用于进行图像变换匹配。matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。matrix没有机构体,它必须初始化,然后通过reset方法和set方法来实现。

首先介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法 。下面是一个乘法的公式:

Android开发之图片旋转功能实现方法【基于Matrix】

在 android 里面, matrix 由 9 个 float 值构成,是一个 3*3 的矩阵。如下图。

Android开发之图片旋转功能实现方法【基于Matrix】

没专业工具,画的挺难看。解释一下,上面的 sinx 和 cosx ,表示旋转角度的 cos 值和 sin 值,注意旋转角度是按顺时针方向计算的translatex 和 translatey 表示 x 和 y 的平移量scale 是缩放的比例, 1 是不变, 2 是表示缩放 1/2,这样子。

matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在android的api里都提供了set,post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。set是直接设置matrix的值,每次set一次,整个matrix的数组都会变掉。

我们现在通过setrotate设置旋转角度,用creatbitmap创建一个经过旋转等处理的bitmap对象,然后将bitmap绘制到屏幕之上,于是就实现了旋转操作。

下面使用一个示例来说明matix的使用以及旋转的方式及运行效果。

package cn.edu.pku;
import android.app.activity;
import android.os.bundle;
import android.view.keyevent;
public class picturerotateactivity extends activity {
  /** called when the activity is first created. */
  private gamerotateview1 gameview = null;
  @override
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    gameview = new gamerotateview1(this);
    setcontentview(gameview);
  }
  @override
  public boolean onkeydown(int keycode, keyevent event) {
    // todo auto-generated method stub
    if ( gameview == null )
    {
      return false;
    }
    if ( keycode == keyevent.keycode_back)
    {
      this.finish();
      return true;
    }
    return gameview.onkeydown(keycode,event);
  }
  @override
  public boolean onkeyup(int keycode, keyevent event) {
    // todo auto-generated method stub
    super.onkeyup(keycode, event);
    return true;
  }
}

具体图像旋转处理代码如下:

package cn.edu.pku;
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.motionevent;
import android.view.view;
public class gamerotateview1 extends view implements runnable {
  bitmap bitmap = null;
  int bitmapwidth = 0;
  int bitmapheight = 0;
  float angle = 0.0f;
  matrix matrix = new matrix();
  public gamerotateview1(context context) {
    super(context);
    // todo auto-generated constructor stub
    setfocusableintouchmode(true); //设置可以捕捉键盘事件
    //获取图像资源
    bitmap = ((bitmapdrawable) getresources().getdrawable(r.drawable.cute)).getbitmap();
    bitmapwidth = bitmap.getwidth();
    bitmapheight = bitmap.getheight();
    new thread(this).start();
  }
  public void run() {
    // todo auto-generated method stub
    while(!thread.currentthread().isinterrupted()){
      try{
        thread.sleep(100);
      }catch (interruptedexception e) {
        // todo: handle exception
        thread.currentthread().interrupt();
      }
      postinvalidate(); //可以直接在线程中更新界面
    }
  }
  @override
  protected void ondraw(canvas canvas) {
    // todo auto-generated method stub
    super.ondraw(canvas);
    matrix.reset();
    matrix.setrotate(angle); //设置旋转
    //按照matrix的旋转构建新的bitmap
    bitmap bitmapcute = bitmap.createbitmap(bitmap, 0, 0, bitmapwidth, bitmapheight, matrix, true);
    //绘制旋转之后的图像
    gamerotateview1.drawimage(canvas, bitmapcute, (320 - bitmapwidth)/2, 10);
    bitmapcute = null;
  }
  @override
  public boolean onkeydown(int keycode, keyevent event) {
    // todo auto-generated method stub
    if(keycode == keyevent.keycode_dpad_left){
      angle--;
    }else if(keycode == keyevent.keycode_dpad_right){
      angle++;
    }
    return true;
  }
  @override
  public boolean ontouchevent(motionevent event) {
    // todo auto-generated method stub
    return true;
  }
  @override
  public boolean onkeyup(int keycode, keyevent event) {
    // todo auto-generated method stub
    return false;
  }
  @override
  public boolean onkeymultiple(int keycode, int repeatcount, keyevent event) {
    // todo auto-generated method stub
    return true;
  }
  /**
   * 绘制一个bitmap
   * canvas  画布
   * bitmap  图片
   * x      屏幕上的x坐标
   * y      屏幕上的y坐标
   */
  public static void drawimage(canvas canvas, bitmap _bitmap, int x, int y)
  {
    /* 绘制图像 */
    canvas.drawbitmap(_bitmap, x, y, null);
  }

最后我们通过键盘的左右键可以实现图像的选装,在这里实现的图像的右旋转:

Android开发之图片旋转功能实现方法【基于Matrix】

更多关于android相关内容感兴趣的读者可查看本站专题:《android图形与图像处理技巧总结》、《android开发入门与进阶教程》、《android调试技巧与常见问题解决方法汇总》、《android基本组件用法总结》、《android视图view技巧总结》、《android布局layout技巧总结》及《android控件用法总结

希望本文所述对大家android程序设计有所帮助。

上一篇:

下一篇: