이미지를 처리할 때 mastrix를 사용하면 더욱 다양한 효과를 얻을 수 있다.
주로 사용하는 명령등은 아래와 같다.
matrix.postScale(float x, float y) // 확대, 축소
matrix.postRotate(float degrees) // 이미지 회전
matrix.postSkew(float sx, float sy) // 이미지 비틀기
matrix.postTranslate(float dx, float dy) // 이미지 이동
그리고 적용하는 방법에는 현재의 ImageView에 바로 적용하는 방식
imageview.setImageMatrix(matrix);
와 새로운 파일을 만드는 방법
NewBitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, false);
를 사용하여 imageview.setImageBitmap(NewBitmap); 등을 이용할 수 있는 방법이 있다.
또한 중요한 포인트 중의 하나는
imageview.setScaleType(ScaleType.MATRIX); 를 사용하여 현재 scaletype를 변경해 두어야 합니다.
xml에서 변경코저 한다면
android:scaleType="matrix" 처럼 처리해두어야 합니다.
<ImageView android:layout_height="wrap_content"
android:id="@+id/imageViewForMatrix"
android:src="@drawable/icon"
android:layout_width="fill_parent"
android:scaleType="matrix"
>
아래는 각각에 대한 간단한 샘플을 나타내었습니다.
matrixSample.java
- package com.matrixSample;
- import android.app.Activity;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.graphics.Matrix;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.ImageView.ScaleType;
- public class matrixSample extends Activity {
- Button resetButton, reversxButton, reversyButton, upscaleButton, downscaleButton, moveleftButton, moverightButton, skewButton;
-
- ImageView iv;
- Bitmap bitmap;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
-
- iv = (ImageView) findViewById(R.id.imageViewForMatrix);
- iv.setScaleType(ScaleType.MATRIX);//혹은 현재 xml에서 android:scaleType="matrix" 처리
-
- bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample_image_jpg);
- iv.setImageBitmap(bitmap);
- // iv.setImageBitmap(setReverse());
-
- // y축을 기준으로 x축 바꾸기
- resetButton = (Button) findViewById(R.id.reset);
- resetButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample_image_jpg);
- iv.setImageBitmap(bitmap);
- }
- });
-
-
- // y축을 기준으로 x축 바꾸기
- reversxButton = (Button) findViewById(R.id.reversx);
- reversxButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- //setReverse();
- iv.setImageBitmap(setReverse());
- }
- });
-
- // x축을 기준으로 y축 바꾸기
- reversyButton = (Button) findViewById(R.id.reversy);
- reversyButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- iv.setImageBitmap(setReverseY());
- }
- });
-
-
- upscaleButton = (Button) findViewById(R.id.upscale);
- upscaleButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- iv.setImageBitmap(setScale(1));
- }
- });
-
- downscaleButton = (Button) findViewById(R.id.downscale);
- downscaleButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- iv.setImageBitmap(setScale(2));
- }
- });
-
- moveleftButton = (Button) findViewById(R.id.moveleft);
- moveleftButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- //iv.setImageBitmap(setMove(1));
- setMove(1);
- }
- });
-
- moverightButton = (Button) findViewById(R.id.moveright);
- moverightButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- //iv.setImageBitmap(setMove(2));
- setMove(2);
- }
- });
-
-
- skewButton = (Button) findViewById(R.id.skew);
- skewButton.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- iv.setImageBitmap(setSkew());
- //setSkew();
- }
- });
-
-
- }
-
- private Bitmap setReverse(){
- //private void setReverse(){
- Bitmap rtnBitmap;
- Matrix matrix = new Matrix();
- matrix.postScale(-1, 1); //y 축을 대칭으로 x를 반대로 한다.
-
- //iv.setImageMatrix(matrix);
- //기존 이미지의 크기(height & width)를 구한다.
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
-
- //앞에서 제작된 y축 대칭 매트릭스를 이미지에 적용한다.
- bitmap = rtnBitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, false);
-
- return rtnBitmap;
- }
-
- private Bitmap setReverseY(){
- Bitmap rtnBitmap;
- Matrix matrix = new Matrix();
- matrix.postScale(1, -1); //x 축을 대칭으로 y를 반대로 한다.
-
- //기존 이미지의 크기(height & width)를 구한다.
- //bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample_image_jpg);
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
-
- //앞에서 제작된 y축 대칭 매트릭스를 이미지에 적용한다.
- bitmap = rtnBitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, false);
- return rtnBitmap;
- }
-
- private Bitmap setScale(int flag){
- Bitmap rtnBitmap;
- Matrix matrix = new Matrix();
- switch(flag){
- case 1://확대
- matrix.postScale(1.1f, 1.1f); //
- break;
- case 2://축소
- matrix.postScale(0.9f, 0.9f); //
- break;
- }
-
- //기존 이미지의 크기(height & width)를 구한다.
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
-
- //앞에서 제작된 y축 대칭 매트릭스를 이미지에 적용한다.
- bitmap = rtnBitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, false);
- return rtnBitmap;
- }
-
- //private Bitmap setMove(int flag){
- private void setMove(int flag){
- //Bitmap rtnBitmap;
- Matrix matrix = new Matrix();
- switch(flag){
- case 1://left
- Log.i("setMove", "left");
- matrix.postTranslate(-100, 0); //
- break;
- case 2://right
- Log.i("setMove", "right");
- matrix.postTranslate(100, 0); //
- break;
- }
-
- //기존 이미지의 크기(height & width)를 구한다.
- //int w = bitmap.getWidth();
- //int h = bitmap.getHeight();
-
- //앞에서 제작된 y축 대칭 매트릭스를 이미지에 적용한다.
- iv.setImageMatrix(matrix);//이미지에 매트릭스 적용
- //bitmap = rtnBitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, false);
- //return rtnBitmap;
- }
-
-
- //private void setSkew(){
- private Bitmap setSkew(){
- Bitmap rtnBitmap;
- Matrix matrix = new Matrix();
- matrix.postSkew(0.88f, -0.16f); //
-
- //기존 이미지의 크기(height & width)를 구한다.
- int w = bitmap.getWidth();
- int h = bitmap.getHeight();
-
- //iv.setImageMatrix(matrix);//이미지에 매트릭스 적용
- bitmap = rtnBitmap = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, false);
- return rtnBitmap;
- }
-
- }
res/layout/main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
-
- <ImageView android:layout_height="wrap_content"
- android:id="@+id/imageViewForMatrix"
- android:src="@drawable/icon"
- android:layout_width="fill_parent"
- >
- </ImageView>
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:id="@+id/linearLayout1"
- android:layout_alignParentBottom="true"
- android:orientation="vertical">
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:id="@+id/linearLayout3">
- <Button android:text="enLarge"
- android:id="@+id/upscale"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </Button>
- <Button
- android:text="downScale"
- android:id="@+id/downscale"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </Button>
- <Button
- android:text="Move Left"
- android:id="@+id/moveleft"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </Button>
- <Button
- android:text="Move Right"
- android:id="@+id/moveright"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </Button>
- </LinearLayout>
- <LinearLayout
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:id="@+id/linearLayout2"
- >
- <Button android:text="reset"
- android:id="@+id/reset"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </Button>
- <Button
- android:text="revers X"
- android:id="@+id/reversx"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@id/reset">
- </Button>
- <Button
- android:text="revers Y"
- android:id="@+id/reversy"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </Button>
- <Button
- android:text="SKEW"
- android:id="@+id/skew"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content">
- </Button>
- </LinearLayout>
- </LinearLayout>
- </RelativeLayout>
[출처] http://www.shop-wiz.com/document/android/sample5_use_matrix
http://www.flysky.kr/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-multi-touch-pinch-zoom%EA%B3%BC-touch-scroll%EC%9D%B4-%EA%B0%80%EB%8A%A5%ED%95%9C-imageview/
http://blog.naver.com/monk773/90134152702