当前位置: 代码迷 >> Android >> Android幼功:使用Matrix控制变换
  详细解决方案

Android幼功:使用Matrix控制变换

热度:99   发布时间:2016-04-28 06:31:35.0
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三种操作 

    • set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉 

    • post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换 

    • pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的 

     

二、变换步骤 

  1. 获取Matrix对象,该Matrix对象即可新创建,也可直接获取其他对象封装的Matrix(例如Transformation对象内部就封装了Matrix); 

  2. 调用Matrix的方法进行平移、旋转、缩放、倾斜等 

  3. 将程序对Matrix所做的变换应用到指定图像或组件 

 

  • 使用实例(chapter08/MatrixTest 

main_activity.xml文件 

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

 

  相关解决方案