Android 画图之Matrix(二)

  上一篇Android画图之 Matrix(一) 讲了一下 Matrix的原理和运算方法,涉及到高等数学,有点难以理解。还好 Android 里面提供了对Matrix操作的一系 列方便的接口。

  Matrix的操作,总共分为 translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在 Android的API里都提供了 set, post和pre 三种操作方式,除了translate,其他三种操作都可以指定中心点。  
 
       set是直接设置 Matrix的值,每次 set一次,整个Matrix 的数组都会变掉。  
 
       post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用 post,来完成所需的整个变换。例如,要将一个图片旋 转30度,然后平移到(100,100)的地方,那么可以这样做:

  Matrix  m  =   new   Matrix();
  m.postRotate(30 );
  m.postTranslate(100 ,   100 );     

这样就达到了想要的效果。

  pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用 pre的话 ,就要这样:

Matrix  m  =   new   Matrix();
m.setTranslate(100 ,   100 );
m.preRotate(30 );      

旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行。

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;

public class MyView extends View {

    private Bitmap mBitmap;
    private Matrix mMatrix = new Matrix();

    public MyView(Context context) {
        super(context);
        initialize();
    }

    private    void   initialize()  {      

        Bitmap  bmp  =  ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();
        mBitmap  =  bmp;
    /*首先,将缩放为100*100。这里scale的参数是比例。
        有一点要注意,如果直接用 100/
        bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是
        float 型的,直接用 100f就好。*/
        mMatrix.setScale(100f/bmp.getWidth(),  100f/bmp.getHeight());
                        //平移到(100,100)处
        mMatrix.postTranslate(100 ,   100 );
        //倾斜 x和y轴,以(100,100)为中心。
        mMatrix.postSkew(0.2f,   0.2f,   100 ,   100 );

    }    

    @Override
    protected void onDraw(Canvas canvas) {
        // super.onDraw(canvas); //如果界面上还有其他元素需要绘制,只需要将这句话写上就行了。
        canvas.drawBitmap(mBitmap, mMatrix, null);
    }
}

运行效果如下:

红色的x和 y表示倾斜的角度,下面是 x,上面是 y。看到了没,Matrix就这么简单 。

时间: 2024-10-08 15:40:38

Android 画图之Matrix(二)的相关文章

Android 画图之 Matrix(一)

Matrix  ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 首先介绍一下矩阵运算.加法和减法就不用说了,太简单了,对应位相加就好.图像处理,主要用到的是乘法  .下面是一个乘法的公式: 在  Android  里面,  Matrix  由  9  个  float  值构成,是一个  3*3  的矩阵.如下图. 没专业工具,画的挺难看.解释一下,上面的  sinX  和  cosX  ,表示旋转角度的  cos  值和  sin  值,注意,旋转角

Android画图系列(二)——自己定义View绘制基本图形

这个系列主要是介绍下Android自己定义View和Android画图机制.自己能力有限.假设在介绍过程中有什么错误.欢迎指正 前言 在上一篇Android画图系列(一)--自己定义View基础中我们了解自己定义View相关的基本知识.只是,这些东西依然还是理论,接下来我们就实际绘制一些东西 在本篇文章中,我们先了解下面Canvas,而且画一些主要的图形 Canvas简单介绍 Canvas我们能够称之为画布.能够在上面绘制各种东西.是安卓平台2D图形绘制的基础.非常强大. 一般来说,比較基础的东

Android中图像变换Matrix的原理、代码验证和应用

转自 http://biandroid.iteye.com/blog/1399462 第一部分 Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.Android中的Matrix是一个3 x 3的矩阵,其内容如下: Matrix的对图像的处理可分为四类基本变换: Translate           平移变换 Rotate                旋转变换 Scale                  缩放变换 Skew    

Android常用界面布局(二)

ImageView ScaleType属性, 该属性用以表示显示图片的方式 ①matrix               根据一个3x3的矩阵对其中图片进行缩放 ②fitXY                  将图片非等比例缩放到大小与ImageView相同 ③fitStart               缩放方式同FIT_CENTER,只是将图片显示在左方或上方,而不是居中 ④fitCenter           ImageView的默认状态,大图等比例缩小,小图等比例放大,整体居中显示在Im

Android -- 经验分享(二)

目录                                                                                   自定义两个View进行画图,让其各自刷新重绘 Activity设为singleTop,长按Home键启动的问题 Activity设为singleTop,长按Home键启动问题 Android软键盘挡住界面 Android使用AsyncTask下载图片,最好使用WeakReference Android webview 加载网络视

android产品研发(二十一)-->UI优化

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了android产品研发过程中的代码Review.通过代码Review能够提高产品质量,增强团队成员之间的沟通,提高开发效率,所以良好的产品开发迭代过程中,代码Review是一个必不可少的步骤.那么如何进行代码Review呢?我们主要讲解了团队成员之间的代码Review,代码lint检查,开发规范等方面的知识点,更多关于代码Review相关的知识可参考我的:android产品研发(二十)–>代码Review 本文我们将讲解一下android U

完美解决Android使用Zxing扫描二维码改成竖屏后,后面的预览画面出现了拉伸,扭曲的情况

完美解决解决Android使用Zxing扫描二维码改成竖屏后,后面的预览画面出现了拉伸,扭曲的情况 第一步:找到com.zxing.camera包下的CameraConfigurationManager.java文件中的void initFromCameraParameters(Camera camera)方法 第二步:在 Log.d(TAG, "Screen resolution: " + screenResolution);后加上如下的代码 Point screenResoluti

从零开始学android<RatingBar评分组件.二十三.>

如果现在用户要对某个应用程序打分往往会使用图所示的组件,通过选择的"五角星"的个数来决定最终的打分成绩 这样的功能在Android之中,可以使用RatingBar组件实现,使用此组件可以方便用户的输入,而且很直观,RatingBar类的定义结构如下: java.lang.Object ? android.view.View ? android.widget.ProgressBar ? android.widget.AbsSeekBar ? android.widget.RatingBa

Android学习路线(二十)运用Fragment构建动态UI

要在Android系统上创建一个动态或者多面板的用户界面,你需要将UI组件以及activity行为封装成模块,让它能够在你的activity中灵活地切换显示与隐藏.你可以使用Fragment类来创建这些模块,它们能够表现得有些像嵌套的activity,它们定义着自己的布局,管理自己的生命周期. 当一个fragment指定了它自己的布局,它可以在activity中和其他的fragment配置为不同的组合,这样就能够为不同的屏幕尺寸来修改你的布局配置(在小屏幕上一次展现一个fragment,而在大屏