国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android開發(fā)之圖片旋轉(zhuǎn)功能實現(xiàn)方法【基于Matrix】

2019-12-12 02:02:43
字體:
供稿:網(wǎng)友

本文實例講述了Android開發(fā)之圖片旋轉(zhuǎn)功能實現(xiàn)方法。分享給大家供大家參考,具體如下:

在Android中進行圖像旋轉(zhuǎn)需要使用Matrix,它包含了一個3*3的矩陣,專門用于進行圖像變換匹配。Matrix ,中文里叫矩陣,高等數(shù)學(xué)里有介紹,在圖像處理方面,主要是用于平面的縮放、平移、旋轉(zhuǎn)等操作。Matrix沒有機構(gòu)體,它必須初始化,然后通過reset方法和set方法來實現(xiàn)。

首先介紹一下矩陣運算。加法和減法就不用說了,太簡單了,對應(yīng)位相加就好。圖像處理,主要用到的是乘法 。下面是一個乘法的公式:

在 Android 里面, Matrix 由 9 個 float 值構(gòu)成,是一個 3*3 的矩陣。如下圖。

沒專業(yè)工具,畫的挺難看。解釋一下,上面的 sinX 和 cosX ,表示旋轉(zhuǎn)角度的 cos 值和 sin 值,注意旋轉(zhuǎn)角度是按順時針方向計算的translateX 和 translateY 表示 x 和 y 的平移量scale 是縮放的比例, 1 是不變, 2 是表示縮放 1/2,這樣子。

Matrix的操作,總共分為translate(平移),rotate(旋轉(zhuǎn)),scale(縮放)和skew(傾斜)四種,每一種變換在Android的API里都提供了set,post和pre三種操作方式,除了translate,其他三種操作都可以指定中心點。set是直接設(shè)置Matrix的值,每次set一次,整個Matrix的數(shù)組都會變掉。

我們現(xiàn)在通過setRotate設(shè)置旋轉(zhuǎn)角度,用creatBitmap創(chuàng)建一個經(jīng)過旋轉(zhuǎn)等處理的Bitmap對象,然后將Bitmap繪制到屏幕之上,于是就實現(xiàn)了旋轉(zhuǎn)操作。

下面使用一個示例來說明Matix的使用以及旋轉(zhuǎn)的方式及運行效果。

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

具體圖像旋轉(zhuǎn)處理代碼如下:

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); //設(shè)置可以捕捉鍵盤事件    //獲取圖像資源    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); //設(shè)置旋轉(zhuǎn)    //按照matrix的旋轉(zhuǎn)構(gòu)建新的Bitmap    Bitmap bitmapcute = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, true);    //繪制旋轉(zhuǎn)之后的圖像    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坐標(biāo)   * y      屏幕上的y坐標(biāo)   */  public static void DrawImage(Canvas canvas, Bitmap _bitmap, int x, int y)  {    /* 繪制圖像 */    canvas.drawBitmap(_bitmap, x, y, null);  }

最后我們通過鍵盤的左右鍵可以實現(xiàn)圖像的選裝,在這里實現(xiàn)的圖像的右旋轉(zhuǎn):

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android圖形與圖像處理技巧總結(jié)》、《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)

希望本文所述對大家Android程序設(shè)計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 武邑县| 泸西县| 咸宁市| 北川| 竹溪县| 岚皋县| 夹江县| 阿拉善盟| 卓尼县| 孟连| 东源县| 郸城县| 天等县| 冀州市| 平凉市| 阳西县| 莱芜市| 宁河县| 新余市| 淅川县| 吉安市| 道真| 淮滨县| 米林县| 论坛| 东海县| 邵东县| 恩施市| 安西县| 浏阳市| 云浮市| 昭苏县| 柘城县| 日喀则市| 石阡县| 河北省| 清丰县| 浏阳市| 凤台县| 扶沟县| 平舆县|