Android的Matrix利用数学原理实现图片平移、旋转等操作详解
  很庆幸自己的线性代数学的还可以,理解Matrix的矩阵变换完全没有问题。Matrix矩阵实现图片的平移旋转等操作涉及到线性代数问题,感兴趣它的具体实现的话可以参考一下上面的博客,非常详细,非常好。如果不想深究也可以简单的理解为BitMap的像素点通过某种方式(Matrix)移动了相应的位置,这样就实现了图片的变换。不管怎样,先学会如何使用它就可以了。
  注:我们所使用的Matrix变换必须有一个Bitmap基础,因此,代码中需要先获得Bitmap。

一、总体使用的简单展示

 平移变换

//参数:移动到的位置的放大倍数matrix.postTranslate(mBitmapwidth*2,mBitmapheight*2);canvas.drawBitmap(mbitmap,matrix, mpaintline);

旋转变换

        matrix.postRotate(180);         canvas.drawBitmap(mbitmap,matrix, mpaintline);

缩放变换

//参数:缩放倍数matrix.postScale(2, 2);canvas.drawBitmap(mbitmap,matrix, mpaintline);

错切变换

//x轴不变,y轴进行拉伸matrix.postSkew(0, 1);  canvas.drawBitmap(mbitmap,matrix, mpaintline);

对称(关于x轴对称 倒影)

float[] matrix_value=new float[]{1f,0f,0f,0f,-1f,0f,0f,0f,1f};              matrix.setValues(matrix_value);         canvas.drawBitmap(mbitmap,matrix, mpaintline);

对称(关于Y轴对称 镜像)

float[] matrix_value1=new float[]{-1f,0f,0f,0f,1f,0f,0f,0f,1f};             matrix.setValues(matrix_value1);        matrix.postTranslate(mBitmapwidth*2, mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

关于它的使用我们也是需要自定义一个class继承View,在布局中类名加包名进行添加布局。

二、平移变换

//原图加平移    matrix.reset();        canvas.drawBitmap(mbitmap, matrix, mpaintline);        //平移        matrix.reset();        matrix.postTranslate(mBitmapwidth*2,mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

三、旋转变换

//原图加旋转加平移matrix.reset();        matrix.postRotate(180);        matrix.postTranslate(mBitmapwidth*3,mBitmapheight* 2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

四、缩放变换

    matrix.reset();        matrix.postScale(2, 2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        matrix.reset();        //将原图绘制出来        canvas.drawBitmap(mbitmap, matrix, mpaintline);

五、错切变换

        matrix.reset();        matrix.postSkew(0, 1);        matrix.postTranslate(mBitmapwidth*3,mBitmapheight*3);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

六、对称变换


1、关于x轴对称

    //对称  关于x轴对称    倒影        matrix.reset();        float[] matrix_value=new float[]{1f,0f,0f,0f,-1f,0f,0f,0f,1f};              matrix.setValues(matrix_value);        matrix.postTranslate(0, mBitmapheight*3);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

2、关于Y轴对称

    //对称  关于y轴   镜像        matrix.reset();        float[] matrix_value1=new float[]{-1f,0f,0f,0f,1f,0f,0f,0f,1f};             matrix.setValues(matrix_value1);        matrix.postTranslate(mBitmapwidth*2, mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);

七、附完整代码

public class MyBitmapView extends View{    private int width;    private int height;    private Paint mpaintline;    private Bitmap mbitmap;    private int mBitmapwidth;    private int mBitmapheight;    private Matrix matrix;    public MyBitmapView(Context context) {        super(context);    }    public MyBitmapView(Context context, AttributeSet attrs) {        super(context, attrs);        mpaintline = new Paint();        mpaintline.setColor(Color.RED);        mpaintline.setStrokeWidth(10);        mpaintline.setAntiAlias(true);        mbitmap=BitmapFactory.decodeResource(getResources(), R.drawable.yourimg);        mBitmapwidth=mbitmap.getWidth();        mBitmapheight=mbitmap.getHeight();        Log.d("图片信息","高:"+ mbitmap.getHeight()+"宽:"+mbitmap.getWidth());        matrix=new Matrix();    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);//  canvas.drawBitmap(mbitmap, 20, 20, mpaintline);        //放缩        matrix.reset();        matrix.postScale(2, 2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        matrix.reset();        canvas.drawBitmap(mbitmap, matrix, mpaintline);        //平移        matrix.reset();        matrix.postTranslate(mBitmapwidth*2,mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        //旋转        matrix.reset();        matrix.postRotate(180);        matrix.postTranslate(mBitmapwidth*3,mBitmapheight* 2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        //错切        matrix.reset();        matrix.postSkew(0, 1);        matrix.postTranslate(mBitmapwidth*3,mBitmapheight*3);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        //对称  关于x轴对称    倒影        matrix.reset();        float[] matrix_value=new float[]{1f,0f,0f,0f,-1f,0f,0f,0f,1f};              matrix.setValues(matrix_value);        matrix.postTranslate(0, mBitmapheight*3);        canvas.drawBitmap(mbitmap,matrix, mpaintline);        //对称  关于y轴   镜像        matrix.reset();        float[] matrix_value1=new float[]{-1f,0f,0f,0f,1f,0f,0f,0f,1f};             matrix.setValues(matrix_value1);        matrix.postTranslate(mBitmapwidth*2, mBitmapheight*2);        canvas.drawBitmap(mbitmap,matrix, mpaintline);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);    }}

更多相关文章

  1. Android(安卓)zip文件中读取图片实现Gallery放大缩小,移动,图片弹
  2. Android共享动画兼容实现
  3. Android(安卓)图像处理(类型转换,比例缩放,倒影,圆角)
  4. android图片的旋转和缩放
  5. Android平台上利用opencv进行图像的缩放
  6. Bitmap的加载和Cache
  7. android&&ScaleType android:scaleType="centerCrop"这个属性把
  8. Android中关于Bitmap的裁剪缩放和创建
  9. Android多点触摸缩放图片-android学习之旅(四)

随机推荐

  1. TX Android电面问题
  2. Android实现IOS越界回弹的效果
  3. 自己写的一套应用管理系统(包含一套app系
  4. Android中AnimationDrawable使用的简单实
  5. android的应用程序调用另一个应用程序的
  6. Android studio 使用NDK 实现串口 动态库
  7. Android 设备关闭实体按键
  8. Android的Touch事件处理机制介绍
  9. android imageview显示不全或者gilde加载
  10. Android Studio 之一个项目的不同视图结