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

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值