Android基本功:Matrix制御変換を使用


一、Matrixを使用して変換を制御する 
MatrixはAndroidが提供するマトリクスツールクラスで、それ自体は画像やコンポーネントを変換することはできませんが、他のAPIと組み合わせてグラフィック、コンポーネントの変換を制御することができます. 
Matrixでは、移動、回転、スケールを制御する方法があります. 
setTranslate(float dx,float dy):Matrixを制御して平行移動する; 
setSkew(float kx,float ky,float px,float py):Matrixがpx,pyを軸として傾き、kx,kyがX,Y方向の傾き距離を制御する. 
setRotate(float degress):Matrixの回転を制御し、degressの回転角度を制御します. 
setRorate(float degress,float px,float py):px、pyを軸として回転するように設定し、degressは回転角度を制御します. 
setScale(float sx,float Sy):Matrixをスケーリングし、sx、syを設定してX、Y方向のスケーリングを制御する. 
setScale(float sx,float sy,float px,float py):Matrixをpx、pyを軸としてスケーリングし、sx、syでX、Y方向のスケーリングを制御する. 

 
AndoridのAPIはset、post、preの3つの操作を提供しています. 
setは直接Matrixの値を設定し、setごとにMatrix全体の配列が変わります. 
postは後乗であり,現在の行列にパラメータを乗じて与えられる行列である.postを連続的に複数回使用して、必要な変換全体を完了することができます. 
preは前乗であり、パラメータが与えるマトリクスに現在のマトリクスを乗算する.したがって、操作は現在のマトリクスの一番前に発生します. 
 

二、変換手順 
新たに作成できるMatrixオブジェクトを取得します.また、Transformationオブジェクトの内部にMatrixがカプセル化されているなど、他のオブジェクトがカプセル化されているMatrixを直接取得することもできます. 
Matrixのメソッドを呼び出して、平行移動、回転、スケール、傾斜などを行います. 
Matrixに対するプログラムの変換を指定した画像またはコンポーネントに適用します. 
 
使用例(chapter 08/MatrixTest) 
メーン义齿 
<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <com.example.matrixtest.MyView 
        android:id="@+id/myView1" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" /> 
</LinearLayout> 
MyView.javaファイル
 
public class MyView extends View { 
    //         
    private Bitmap bitmap; 
    // Matrix   
    private Matrix matrix = new Matrix(); 
 
    //       
    private float sx = 0.0f; 
    //        
    private int width, height; 
    //     
    private float scale = 1.0f; 
    //          
    private boolean isScale = false; 
 
    public MyView(Context context, AttributeSet attrs) { 
        super(context, attrs); 
        //      
        bitmap = ((BitmapDrawable) context.getResources().getDrawable(R.drawable.ic_launcher)).getBitmap(); 
        //      
        width = bitmap.getWidth(); 
        //      
        height = bitmap.getHeight(); 
        //           
        this.setFocusable(true); 
    } 
 
    @Override 
    protected void onDraw(Canvas canvas) { 
        super.onDraw(canvas); 
        //   Matrix 
        matrix.reset(); 
        if (!isScale) { 
            //   matrix 
            matrix.setSkew(sx, 0); 
        } else { 
             //   matrix 
            matrix.setScale(scale, scale); 
        } 
 
        //        Matrix      
        Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width, height,matrix, true); 
        //       
        canvas.drawBitmap(bitmap2, matrix, null); 
    } 
 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
        switch (keyCode) { 
            case KeyEvent.KEYCODE_A: 
                isScale = false; 
                sx += 0.1; 
                postInvalidate(); 
                break; 
          case KeyEvent.KEYCODE_D: 
                isScale = false; 
                sx -= 0.1; 
                postInvalidate(); 
                break; 
         case KeyEvent.KEYCODE_W: 
                isScale = true; 
                if (scale < 2.0) { 
                    scale += 0.1; 
                } 
                postInvalidate(); 
         case KeyEvent.KEYCODE_S: 
             isScale = true; 
             if (scale > 0.5) { 
                 scale -= 0.1; 
             } 
             postInvalidate(); 
             break; 
         default: 
             break; 
        } 
        return super.onKeyDown(keyCode, event); 
    } 
}
        MainActivity.javaファイル 
    public class MainActivity extends Activity { 
        @Override 
        protected void onCreate(Bundle savedInstanceState) { 
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.main_activity); 
        } 
    }