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)
メーン义齿
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);
}
}