Android Matrix的使用过程

来源:互联网 发布:随机森林优化 编辑:程序博客网 时间:2024/05/21 20:09

Matrix是一个强大的计算工具,它能够是一个View里面所有像素的坐标进行各种变换,从而能够达到一般的图形操作所不能达到的效果。可以说不会使用Matrix在制作android特效的路上还是一个初学者。
先说一下矩阵各坐标的含义

这里可以查看Matrix的代码得到。那么这个矩阵分别代表了什么呢,这里通过他们的名字可以看出,scale是缩放,skew是错切,trans是平移,persp代表透视(官方文档中,也没有详细讲解,透视在这里只做简单介绍)。这里需要把矩阵根据他们的作用划分为4块:

我首先上一个模板代码,接下来所有的实验都是在此代码基础上进行改动。

public class MainActivity extends AppCompatActivity {    private Button button;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(new MyView(this));    }}public class MyView extends View {    private int textX=20,textY=20;    private Scroller mScroller;    public MyView(Context context) {        super(context);        setFocusable(true);        mScroller=new Scroller(context);    }    @Override protected void onDraw(Canvas canvas) {        Paint paint = new Paint();        Bitmap bitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.sample)).getBitmap();        Matrix matrix = new Matrix();        canvas.drawBitmap(bitmap, matrix, paint);        matrix.setTranslate(400, 400);        canvas.drawBitmap(bitmap, matrix, paint);        super.onDraw(canvas);    }}
  1. setTranslate
    Public void setTranslate(float x,float y);
    平移,能够改变对象的坐标使其移动。
    2 setScale
    public void setScale(float sx, float sy, float px, float py)
    public void setScale(float sx, float sy)
    放缩,sx,sy代表了x轴和y轴缩放的倍数,px,py代表缩放的中心。

3 setRotate
public void setRotate(float degrees, float px, float py)
public void setRotate(float degrees)
旋转,degrees是角度,px和py是旋转的中心。
使用如下:
matrix.setRotate(180,bitmap.getWidth()/2,bitmap.getHeight()/2);

4 setSinCos
public void setSinCos(float sinValue, float cosValue, float px, float py)
public void setSinCos(float sinValue, float cosValue)
也是旋转,但是根据sin和cos的值来运算的
这个方法乍一看可能有点蒙,其实在前面的原理中,我们讲解了一个旋转的例子,他最终的矩阵效果是这样的:

5 setSkew
public void setSkew(float kx, float ky, float px, float py)
public void setSkew(float kx, float ky)
错切,这里kx,ky分别代表了x,y上的错切因子,px,py代表了错切的中心。
这是一个种像把有弹性的纸,进行拉动一样的效果。

先是set系列的函数只能用一次,如果有几个set函数,结果只会最后一个set函数起作用。
还有preXXXX:以pre开头,例如preTranslate ,右乘
postXXXX:以post开头,例如postScale,这是左乘
这指的是矩阵相乘的循序不同,如下:

可以看出平移和放缩都起了作用。

这里平移收到了放缩的影响,所以这pre和post记得区别。

0 0