一、使用Matrix控制变换

  • Matrix是Android提供的一个矩阵工具类,本身不能对图像或组件进行变换,但它可以和其它API结合起来控制图形、组件的变换;

  • Matrix提供了如下方法来控制平移、旋转和缩放

    • setTranslate(floatdx,floatdy):控制Matrix进行平移

    • setSkew(floatkx,floatky,floatpx,floatpy):控制Matrix以px,py为轴心进行倾斜,kx,ky为X,Y方向上的倾斜距离

    • setRotate(floatdegress):控制Matrix进行旋转,degress控制旋转的角度

    • setRorate(floatdegress,floatpx,floatpy):设置以px,py为轴心进行旋转,degress控制旋转角度

    • setScale(floatsx,floatsy):设置Matrix进行缩放,sx,sy控制X,Y方向上的缩放比例

    • setScale(floatsx,floatsy,floatpx,floatpy):设置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);         }     } 

更多相关文章

  1. Android(安卓)MediaCodec踩坑笔记
  2. android 开发 屏幕适配 概念
  3. android 自适应 多屏幕支持
  4. Android中常用的选择图像,跟换图像等(图像放大缩小等)
  5. Android——Matrix类
  6. Android中播放视频的三种方式
  7. Android开发之imageView图片按比例缩放的实现方法
  8. android平台移植总结
  9. android 开发 - 对图片进行虚化(毛玻璃效果,模糊)

随机推荐

  1. Android(安卓)使用AsyncTask后台线程实现
  2. Android(安卓)自动编译、打包生成apk文件
  3. BitRaser for Mobile iOS和Android移动设
  4. Android智能硬件开发心得总结(一)
  5. 详解Android广播机制
  6. Android基础入门知识
  7. android 资源文件学习
  8. 丢失Android系统库或者Conversion to Dal
  9. Android(安卓)Bmob后端云—数据库、服务
  10. 刚进入Android终端即可使用busybox的命令