zoukankan      html  css  js  c++  java
  • 25.Android之图像的平移、旋转及缩放学习

    在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 }

    运行效果:

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

  • 相关阅读:
    手把手的教你激活PyCharm --Pycharm激活详细教程(二)(非常详细,非常实用)
    api-ms-win-crt-process-l1-1-0.dll 丢失的处理,遇到问题和完美解决
    关于pycharm安装出现的interpreter field is empty,无法创建项目存储位置
    手把手的教你安装PyCharm --Pycharm安装详细教程(一)(非常详细,非常实用)
    谷歌浏览器的各种插件网址Chrome插件(谷歌浏览器)-超级详细
    selenium之 chromedriver与chrome版本映射表(更新至v2.43)
    火狐l浏览器所有版本
    1、MySQL主从同步机制及同步中的问题处理
    PyCharm证书过期:Your license has expired
    Git的使用--如何将本地项目上传到Github(三种简单、方便的方法)(二)(详解)
  • 原文地址:https://www.cnblogs.com/benchao/p/5110987.html
Copyright © 2011-2022 走看看