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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鸳鸯锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值