返回顶部
首页 > 资讯 > 精选 >android中如何使用graphics.Matrix类
  • 632
分享到

android中如何使用graphics.Matrix类

android 2023-05-30 22:05:43 632人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关Android中如何使用graphics.Matrix类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来

这期内容当中小编将会给大家带来有关Android中如何使用graphics.Matrix类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来初始化它里边的内容,所以创建实例后需要调用reset()方法生成一个标准matrix,或者调用set..一类的函数,比如setTranslate, setRotate,,该函数将会决定matrix如何来改变坐标。SDK里边没有讲述Matrix的3x3矩阵是如何改变点的坐标值的,但是我在代码里边通过打印那9个点的值时,大致可以得到如下结论,9个值[a,b,c,d,e,f,g,h,i],坐标[x,y],当g=0,h=0,i=1,的时候,坐标是这样变换的,x'=a*x+b*y+c;y'=d*x+e*y+f;当调用setTranslate(10,20)之后,matrix的值就变成[1,0,10,0,1,20,0,0,1];这其实还是没有脱离矩阵乘法,只是不知道后三位是如何应用的。了解这个对后边的连接矩阵的理解有好处,连接矩阵其实就是两个矩阵相乘后得到的新矩阵。

public Matrix()
创建一个标准矩阵,应用后点的坐标不会有任何改变

public Matrix(Matrix src)
创建一个src的深度复制,改变规则与src一致

public boolean equals(Object obj)
如果obj为Matrix并且它的值与当前Matrix对象相等的会将会返回true

public void getValues(float[] values)
获取matrix的那9个值

public boolean invert(Matrix inverse)
将当前矩阵反转,并且反转后的值存入inverse中,如果当前矩阵不能反转,那么inverse不变,返回false,反转规则应该是满足 当前矩阵*inverse=标准矩阵,标准矩阵为[1,0,0,0,1,0,0,0,1];不过其实也不用想得那么复杂,比如当前matrix是setTranslate(10,20),那么反转后的matrix就是setTranslate(-10,-20);

public boolean isIdentity()
判断当前矩阵是否为标准矩阵,这个函数比if (getType() == 0)运行的可能更快一些

public void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex, int pointCount)
用当前矩阵改变src中的点的坐标,然后将改变后的值对应的存入dst数组中,其中pointCount表示点的数目,(x,y)=(src[2*k],src[2*k+1])表示一个点的坐标,k取整数值,安卓中用数组存储点的坐标值的时候都是按如此法则存储的。

public void mapPoints(float[] pts)
用当前矩阵改变pts中的值,然后存储在pts中,同上,pts也是存储点的坐标的数组

public void mapPoints(float[] dst, float[] src)
用当前矩阵改变src的值,并且存储到数组dst中

public float mapRadius(float radius)
将一个半径为radius的圆的所有点坐标用matrix进行变换后,计算出该圆的半径并且返回该值。注意:要得到正确的值该圆默认是有中心的,个人注:说实话不明白这个函数有什么用

public boolean mapRect(RectF dst,RectF src)
用matrix改变src的4个顶点的坐标,并将改变后的坐标调整后存储到dst中,(RectF只能存储改变后的左上角和右下角坐标,所以需要调整),返回的值跟rectStaysRect()一样,从字面意思可以认为src改变后仍然是RectF,那么就返回true

public boolean mapRect(RectF rect)
用matrix改变rect的4个顶点的坐标,并将改变后的坐标调整后存储到rect当中

public void mapVectors(float[] dst, float[] src)
用matrix改变dst中的向量值并且存储到src当中,注意:setTranslate(x,y)这样的matrix调用了这个函数后不会有任何反应,这样的matrix应该调用mapPoints

public void mapVectors(float[] vecs)
用matrix改变vecs中的值并且存储到vecs当中,同上,注意:setTranslate(x,y)这样的matrix调用了这个函数后不会有任何反应,这样的matrix应该调用mapPoints

public void mapVectors(float[] dst, int dstIndex, float[] src, int srcIndex, int vectorCount)
同上,只不过vectorCount表示向量的数目,dstIndex,srcIndex分别表示各自的起始位置

public boolean postConcat(Matrix other)
将当前的matrix连接到other之后,并且将连接后的值写入当前matrix。 M‘=other*M,连接后变换的效果,相当于先变换M,然后在other变换

public boolean postRotate(float degrees)
相当于这样:

Matrix other=newMatrix();other.setRotate(degrees);postConcat(other);

先创建设置一个以0,0为原点旋转degrees度的矩阵other,然后将当前的matrix连接到other之后,并且将连接后的值写入当前matrix。

public boolean postRotate(float degrees, float px, float py)
同上,不过改成这样

Matrix other=newMatrix();other.setRotate(degrees,px,py);postConcat(other);

public boolean postScale(float sx, float sy)
同上,无非是改成

other.setScale(sx,sy);

public boolean postScale(float sx, float sy, float px, float py)
同上
public boolean postSkew(float kx, float ky)
public boolean postSkew(float kx, float ky, float px, float py)
public boolean postTranslate(float dx, float dy)
都是一样的,不过是创建的other有所不一样而已

public boolean preConcat(Matrix other)
public boolean preRotate(float degrees)
public boolean preRotate(float degrees, float px, float py)
public boolean preScale(float sx, float sy)
public boolean preScale(float sx, float sy, float px, float py)
public boolean preSkew(float kx, float ky)
public boolean preSkew(float kx, float ky, float px, float py)
public boolean preTranslate(float dx, float dy)
同上边对应的函数功能类似,无非是other被连接在当前matrix之后,然后将连接后的值写入当前matrix当中

public boolean rectStaysRect()
如果该matrix可以将rectF变换成rectF,那么该函数返回true,在标准变换,伸缩变换,平移变换,和多个90度的旋转变换时,该函数是返回true的

public void reset()
将当前matrix设置为标准矩阵

public void set(Matrix src)
将src的内容深度复制给当前矩阵,如果src为null,那么当前矩阵变为标准矩阵

public boolean setConcat(Matrix a,Matrix b)
将当前matrix的值变为a和b的乘积

public boolean setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount)
将当前matrix的值设置为这样的值,对src变换后可以得到dst的数据,pointCount表示点的数目,只能是0-4。设置成功返回true

public boolean setRectToRect(RectF src,RectF dst, Matrix.ScaleToFit stf)
将当前matrix的值设置为这样的值,对src进行变换后可以得到dst,因两者都是RectF,所以该matrix的值只能是伸缩和平移的组合,设置成功了返回true,stf为伸缩参数,这个Matrix.ScaleToFit伸缩参数有什么名堂呢,它有四个常量,每个常量应用后会导致matrix有什么结果呢,根据那4个常量的文字说明可知,CENTER,END,START表示得到的伸缩矩阵m,m对src进行变换后得到dst1,dst1跟src有同样的宽高比例,dst1在dst的内部,不同的地方是CENTER的状态是这样的:dst1.left-dst.left=dst.right-dst1.right,dst1.top-dst.top=dst.bottom-dst1.bottomEND的状态是这样的:dst1.right=dst.right,dst1.bottom=dst.bottom.START的状态是这样的:dst1.left=dst.left,dst1.top=dst.top;至于FILL表示得到的伸缩矩阵m,通过它对src变换后得到的Rect就是dst,完全重合。结论通过RectF(0,0,10,10),  RectF(0,0,20,30)这两个矩阵得到了验证。

public void setRotate(float degrees)
设置当前matrix,使作用于点坐标时使点坐标以点(0,0)为原点旋转degrees度。

public void setRotate(float degrees, float px, float py)
设置当前matrix,使作用于点坐标时使点坐标以点(px,py)为原点旋转degrees度。在转换过程中,该原点不可改变

public void setScale(float sx, float sy, float px, float py)
设置当前matrix,使作用于点坐标时使点坐标以(px,py)为支点伸缩sx,sy倍。(px,py)在转换过程中不能改变。这个解释有点蒙,验证了下发现其实就是x'=(x+px)*sx,y'=(y+py)*sy

public void setScale(float sx, float sy)
这其实就是setScale(sx,sy,0,0);

public void setSinCos(float sinValue, float cosValue)
这其实就是setSinCos(sinValue,cosValue,0,0);

public void setSinCos(float sinValue, float cosValue, float px, float py)
设置当前matrix,以px,py为支点进行旋转变换,变换方式与sinValue,cosValue的值有关,经过验证,可以得到近似换算公式为:

x'=cosValue*x-sinValue*y+(1-cosValue)*px+sinValue*py;y'=sinValue*x+cosValue*y-sinValue*px+(1-cosValue)*py;

public void setSkew(float kx, float ky, float px, float py)
设置当前matrix,以px,py为支点进行倾斜kx,ky.公式变换应该为

x'=x+kx*(y-py),y'=ky*(x-px)+y;

public void setSkew(float kx, float ky)
相当于setSkew(kx,ky,0,0);

public void setTranslate(float dx, float dy)
设置matrix,应用时使点坐标(x,y)各自平移为(x+dx,y+dy);

public void setValues(float[] values)
复制9个数据给matrix,由于matrix的变形,或许这些数据会变成16位的数据,所以用getValues()可能不能得到与初始化相同的数据。不出意外的话,values的后三位要是0,0,1,否则可能该matrix变化后得不到你想要的点坐标

public String toShortString ()
public String toString ()
返回一个字符串用来描述该目标和数据,该类的子类是鼓励重写该函数的,详细描述该对象的类型和数据。默认的描述方式如下

getClass().getName() + '@' + Integer.toHexString(hashCode())

补充源码如下

package com.hahajlu;import Android.app.Activity;import android.content.Context;import android.graphics.canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.RectF;import android.os.Bundle;import android.view.View;public class MatrixActivity extends Activity {    @Override  public void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(new SampleView(this));  }}class SampleView extends View{ Matrix mt1=new Matrix(); Matrix mt2=new Matrix(); public SampleView(Context context) {  super(context); }@Overrideprotected void onDraw(Canvas canvas) { // TODO Auto-generated method stub float p[]=new float[]{100.f,100.f};// mt1.setRotate(90);  mt1.setValues(new float[]{1,0,1,0,1,3,1,2,1});//  mt1.mapPoints(p);// mt1.setScale(0.5f, 0.5f);// mt1.mapPoints(p);// mt1.setTranslate(10.f, 10.f); //mt1.invert(mt2);// mt1.setRectToRect(new RectF(0,0,10,10), new RectF(0,0,20,30), Matrix.ScaleToFit.FILL);// mt1.setScale(0.5f, 0.5f, 20f, 30f);// mt1.setSinCos(0.5f, 0.6f,30.f,20.f);// mt1.setSkew(10f, 15f, 20f, 32f); float values[]=new float[9]; mt1.getValues(values); mt1.mapPoints(p); Paint paint=new Paint(); paint.setColor(Color.BLACK); canvas.drawColor(Color.WHITE); canvas.drawText("为了", p[0], p[1], paint); System.out.println("x="+p[0]+"y="+p[1]); for(int i=0;i<9;i++)  System.out.println("values="+values[i]);// float radiu=mt1.mapRadius(10.f);// System.out.println("radiu="+radiu); super.onDraw(canvas);}}

上述就是小编为大家分享的android中如何使用graphics.Matrix类了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: android中如何使用graphics.Matrix类

本文链接: https://lsjlt.com/news/221622.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • android中如何使用graphics.Matrix类
    这期内容当中小编将会给大家带来有关android中如何使用graphics.Matrix类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来...
    99+
    2023-05-30
    android
  • Paint与Canvas类如何在Android中使用
    本篇文章给大家分享的是有关Paint与Canvas类如何在Android中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Paint类的常用的方法1.setColor方法,用...
    99+
    2023-05-31
    android paint canvas
  • python中类如何使用
    这期内容当中小编将会给大家带来有关python中类如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、类的成员类的成员包括:属性和方法。属性可以分为:静态属性和实例属性方法可以分为:普通方法、类方法...
    99+
    2023-06-15
  • Android中JNI如何使用
    Android中JNI如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.导入C语言的类首先我们需要把C语言写的功能类放入我们的项目中。这里我直接从资料中...
    99+
    2023-06-20
  • Android中如何使用Html.fromHtml
    Android中如何使用Html.fromHtml,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 设置字体颜色的时候,颜色值需要用到转义符:如下代码所示:String&nb...
    99+
    2023-05-31
    android html.fromhtml
  • Android中selector如何使用
    今天就跟大家聊聊有关Android中selector如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android  selector的详解前言:StateListD...
    99+
    2023-05-30
    android selector
  • Android中RecyclerView如何使用
    本篇文章给大家分享的是有关Android中RecyclerView如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。RecyclerView 是在Android suppo...
    99+
    2023-05-30
    android recyclerview
  • Android中AudioTrack如何使用
    Android中AudioTrack如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、Android AudioTrack简介在android中播放声音...
    99+
    2023-05-30
    android
  • Android中SharedPreferences如何使用
    本篇文章为大家展示了Android中SharedPreferences如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android  SharedPreferences详解获取Sh...
    99+
    2023-05-30
    android sharedpreferences
  • Android中OkHttpUtils如何使用
    Android中OkHttpUtils如何使用,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。引入:Android Studio使用前,对于Android Studio的用户,可...
    99+
    2023-05-30
    android okhttputils
  • Android中EfficientAdapte如何使用
    今天就跟大家聊聊有关Android中EfficientAdapte如何使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android ListView之EfficientAdapt...
    99+
    2023-05-30
    android
  • Android 中 ActivityLifecycleCallbacks如何使用
    Android 中 ActivityLifecycleCallbacks如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。MyApplication如下:package...
    99+
    2023-05-30
    android activitylifecyclecallbacks
  • Android中setEmptyView如何使用
    Android中setEmptyView如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Android ListView之setEmptyView正确使用方法&nbs...
    99+
    2023-05-30
    android setemptyview
  • Android 中ContentProvider如何使用
    本篇文章为大家展示了Android 中ContentProvider如何使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Content Provider 的简单介绍: * Android中的Con...
    99+
    2023-05-30
    android contentprovider
  • Android中texttospeech如何使用
    在Android中使用TextToSpeech需要以下步骤:1. 在AndroidManifest.xml文件中添加以下权限:```...
    99+
    2023-08-26
    Android texttospeech
  • 如何正确的使用Android中的图片工具类
    如何正确的使用Android中的图片工具类?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用方法如下:import java.io.ByteArrayOutputStrea...
    99+
    2023-05-31
    android roi
  • J2ME中ITEM类如何使用
    这篇文章给大家介绍J2ME中ITEM类如何使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。J2ME中ITEM类用法一、基本知识1、ITEM类是Form类的派生类。2、通过改变ITEM...
    99+
    2024-04-02
  • CSS中如何使用伪类
    CSS中如何使用伪类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。CSS伪类的语法:selector:pseudo-class{prope...
    99+
    2024-04-02
  • Flex 中ArrayCollection类如何使用
    这期内容当中小编将会给大家带来有关Flex 中ArrayCollection类如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Flex ArrayCollection详解集合是ActionScrip...
    99+
    2023-06-17
  • Java中如何使用Collection类
    Java中如何使用Collection类,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Collection接口Collection是最基本的集合接口,一个Collectio...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作