天天看點

Android Marix

/**********************************************
   * Matrix是Android提供的一個工具類,可以與其他API結合實作圖形元件的變化。
   * 
   * 可以實作元件的平移,傾斜,旋轉,縮放等。 步驟:
   * 
   * 1.擷取Matrix對象。Matrix ma trix = new Matrix();
   * 
   * 2.調用Matrix方法進行平移,旋轉,縮放,傾斜 如旋轉Matrix: matrix.setSkew(sx, 0);
   * 縮放:matrix.setScale(scale, scale);
   * 
   * 3.應用到元件Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, width,
   * height, matrix, true);
   * 
   * 
   **********************************************/      

API

public void setTranslate(float dx, float dy)  // 控制Matir進行平移

public void setSkew(float kx, float ky, float px, float py) // 控制Matirx以px,py進行傾斜,kx,ky為X、Y方向上的距離
public void setSkew(float kx, float ky)  // 控制Matirx進行傾斜,kx,ky為X,Y方向上的距離

public void setRotate(float degrees, float px, float py) //以px,py為軸心進行旋轉 degrees為旋轉角度
public void setRotate(float degrees) // 控制Matrix進行旋轉,degrees為旋轉角度
  
public void setScale(float sx, float sy, float px, float py) // 控制Maritx以px,py為軸心進行縮放,sx,sy控制X,Y方向上的縮放比例
public void setScale(float sx, float sy) // 控制Maritx以px,py為軸心進行縮放,sx,sy控制X,Y方向上的縮放比例      
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 set) {
    super(context, set);
    // TODO Auto-generated constructor stub
    // 獲得位圖
    bitmap = ((BitmapDrawable) context.getResources().getDrawable(
        R.drawable.icon1)).getBitmap();
    // 獲得位圖寬高
    width = bitmap.getWidth();
    height = bitmap.getHeight();
    // 是目前視圖獲得焦點
    this.setFocusable(true);

  }

  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // 重置Matirx
    matrix.reset();
    if (!isScale) {
      // 旋轉Matrix
      matrix.setSkew(sx, 0);

    } else {
      // 縮放Matrix
      matrix.setScale(scale, scale);
    }
    // 根據原始位圖和Matrix建立新圖檔
    Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,
        matrix, true);
    // 繪制新位圖
    canvas.drawBitmap(newBitmap, matrix, null);
  }

  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    // 向左傾斜
    case KeyEvent.KEYCODE_A:
      isScale = false;
      sx += 0.1;
      postInvalidate(); // 在非UI程序中使用  應該就是onDraw中
      break;

    case KeyEvent.KEYCODE_D:
      isScale = false;
      sx -= 0.1;
      postInvalidate(); // 在非UI程序中使用
      break;
    // 放大
    case KeyEvent.KEYCODE_W:
      isScale = true;
      if (scale < 2.0)
        scale += 0.1;
      postInvalidate(); // 在非UI程序中使用
      break;
    // 縮小
    case KeyEvent.KEYCODE_S:
      isScale = true;
      if (scale > 0.5)
        scale -= 0.1;
      postInvalidate(); // 在非UI程序中使用
      break;
    default:
      break;
    }
    return super.onKeyDown(keyCode, event);
  }

}