最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年09月13日 10:23:10   作者:pku_android  
這篇文章主要介紹了Android開(kāi)發(fā)之圖片旋轉(zhuǎn)功能實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android基于matrix矩陣操作圖形變換的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下

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

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

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

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

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

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

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

下面使用一個(gè)示例來(lái)說(shuō)明Matix的使用以及旋轉(zhuǎn)的方式及運(yù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;
  }
  /**
   * 繪制一個(gè)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);
  }

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

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

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

相關(guān)文章

最新評(píng)論

南木林县| 清流县| 孝感市| 五原县| 邵东县| 泽普县| 湛江市| 江川县| 乌恰县| 梁河县| 西青区| 安平县| 武川县| 枣强县| 托克逊县| 安吉县| 荆州市| 沈丘县| 许昌市| 泉州市| 通辽市| 临泽县| 甘孜县| 郸城县| 南安市| 洪洞县| 边坝县| 河源市| 大丰市| 左权县| 广安市| 利川市| 三门县| 永德县| 新宁县| 迁安市| 秭归县| 元朗区| 大埔县| 广灵县| 上杭县|