天天看点

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);
  }

}