setScale,preScale和postScale的区别

setScale,preScale和postScale的区别下面是Matrix3*3的矩阵结构[java] viewplaincopy1.   {MSCALE_X,MSKEW_X,MTRANS_X,  2.   MSKEW_Y,MSCALE_Y,MTRANS_Y,  3.   MPERSP_0,MPERSP_1,MPERSP_2}  一、首先介绍Scale缩放的控制scale就是缩放,我们调用Matrix的setSc

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

下面是Matrix3*3的矩阵结构

[java] view plaincopy

1.    {MSCALE_X,MSKEW_X,MTRANS_X,  

2.    MSKEW_Y,MSCALE_Y,MTRANS_Y,  

3.    MPERSP_0,MPERSP_1,MPERSP_2}  

一、首先介绍Scale缩放的控制

scale就是缩放,我们调用Matrix的setScale、preScale、postScale,实际在内部,就是通过修改MSCALE_X和MSCALE_Y来实现的。

下面就是一个简单的例子

[java] view plaincopy

1.    public class MatrixTestActivity extends Activity {  

2.        private int screenWidth;  

3.        private int screenHeight;  

4.        private int bitmapWidth;  

5.        private int bitmapHeight;  

6.        private float baseScale;  

7.        private float originalScale;  

8.      

9.        @Override  

10.      public void onCreate(Bundle savedInstanceState) {  

11.          super.onCreate(savedInstanceState);  

12.          setContentView(R.layout.main);  

13.          // 获得屏幕的宽高  

14.          screenWidth = getWindow().getWindowManager().getDefaultDisplay().getWidth();  

15.          screenHeight = getWindow().getWindowManager().getDefaultDisplay().getHeight();  

16.          // 加载Imageview和获得图片的信息  

17.          final ImageView imageView = (ImageView) findViewById(R.id.imgView);  

18.          final Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.a);  

19.          bitmapWidth = bitmap.getWidth();  

20.          bitmapHeight = bitmap.getHeight();  

21.    

22.          // 计算缩放比,因为如果图片的尺寸超过屏幕,那么就会自动匹配到屏幕的尺寸去显示。  

23.          // 那么,我们就不知道图片实际上在屏幕上显示的宽高,所以先计算需要全部显示的缩放比,  

24.          // 在去计算图片显示时候的实际宽高,然后,才好进行下一步的缩放。  

25.          // 要不然,会导致缩小和放大没效果,或者内存泄漏等等  

26.          float scaleX = screenWidth / (float) bitmapWidth;  

27.          float scaleY = screenHeight / (float) bitmapHeight;  

28.          baseScale = Math.min(scaleX, scaleY);// 获得缩放比例最大的那个缩放比,即scaleX和scaleY中小的那个  

29.          originalScale = baseScale;  

30.    

31.          final Matrix matrix = new Matrix();  

32.          matrix.setScale(originalScale, originalScale);  

33.          // 关于setScale和preScale和postScale的区别以后再说  

34.          // matrix.preScale(originalScale, originalScale);  

35.          // matrix.postScale(originalScale, originalScale);  

36.          Bitmap bitmap2 = Bitmap  

37.                  .createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight, matrix, false);  

38.          imageView.setImageBitmap(bitmap2);  

39.    

40.          final Button scale_btn = (Button) findViewById(R.id.scale_btn);  

41.          final EditText scale_text = (EditText) findViewById(R.id.scale_editView);  

42.          scale_btn.setOnClickListener(new View.OnClickListener() {  

43.              public void onClick(View v) {  

44.                  String scaleStr = scale_text.getText().toString();  

45.                  if (scaleStr == null || “”.equals(scaleStr))  

46.                      return;  

47.                  float scale = 0.0f;  

48.                  try {  

49.                      scale = Float.parseFloat(scaleStr);  

50.                  } catch (NumberFormatException e) {  

51.                      return;  

52.                  }  

53.                  matrix.reset();  

54.                  originalScale = scale * originalScale;//看  

55.                  if (originalScale < 0.05 ){  

56.                      originalScale=0.05f;  

57.                  }  

58.                  if(originalScale > baseScale){  

59.                      originalScale=baseScale;  

60.                  }  

61.                  matrix.setScale(originalScale, originalScale);  

62.                  Bitmap bitmapChange = Bitmap.createBitmap(bitmap, 0, 0, bitmapWidth, bitmapHeight,  

63.                          matrix, false);  

64.                  imageView.setImageBitmap(bitmapChange);  

65.              }  

66.          });  

67.      }  

68.  }  

可以发现,对于Scale的设置,Matrix提供了3中不同的方式来设置。

setScale、preScale、postScale。

这三种方法之间有什么区别呢?看下面的。

 

二、set….、pre….、post…的区别

1、setScale(sx,sy),首先会将该Matrix设置为对角矩阵,即相当于调用reset()方法,然后在设置该Matrix的MSCALE_X和MSCALE_Y直接设置为sx,sy的值

2、preScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M’ = M * S(sx, sy)。

3、postScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M’ = S(sx, sy) * M。

preScale和post都是与之前的Matrix结合起来,那它们之间又有什么区别呢?

举几个例子测试下关于pre….和post….的区别:

对一个Matrix如下设置

1、pre….的执行顺序

[java] view plaincopy

1.    Matrix matrix=new Matrix();  

2.    float[] points=new float[]{10.0f,10.0f};  

3.      

4.    matrix.preScale(2.0f, 3.0f);//  

5.    matrix.preTranslate(8.0f,7.0f);//  

6.    matrix.mapPoints(points);  

7.    Log.i(“test”, points[0]+””);  

8.    Log.i(“test”, points[1]+””);  

结果为点坐标为(36.0,51.0)

可以得出结论,进行变换的顺序是先执行preTranslate(8.0f,7.0f),在执行的preScale(2.0f,3.0f)。这也是为什么有的人比喻为pre…是向后生长的,即对于一个Matrix的设置中,

所有pre….是倒着向后执行的。

 

2、post…的执行顺序

[java] view plaincopy

1.    Matrix matrix=new Matrix();  

2.    float[] points=new float[]{10.0f,10.0f};  

3.      

4.    matrix.postScale(2.0f, 3.0f);//  

5.    matrix.postTranslate(8.0f,7.0f);//  

6.    matrix.mapPoints(points);  

7.    Log.i(“test”, points[0]+””);  

8.    Log.i(“test”, points[1]+””);  

结果为点坐标为(28.0,37.0)

可以得出结论,进行变换的顺序是先执行postScale(2.0f,3.0f),在执行的postTranslate(8.0f,7.0f)。这 也是为什么有的人比喻为post…是向前生长的,即对于一个Matrix的设置中,所有post….是顺着向前执行的。

3、当pre和post交替出现的执行顺序

[java] view plaincopy

1.    Matrix matrix=new Matrix();  

2.    float[] points=new float[]{10.0f,10.0f};  

3.      

4.    matrix.postScale(2.0f, 3.0f);  

5.    matrix.preRotate(90);  

6.    matrix.mapPoints(points);  

7.    Log.i(“test”, points[0]+””);  

8.    Log.i(“test”, points[1]+””);  

结果为点坐标为(-20.0,30.0)

将pre…和post顺序换一下

[java] view plaincopy

1.    Matrix matrix=new Matrix();  

2.    float[] points=new float[]{10.0f,10.0f};  

3.      

4.    matrix.preRotate(90);  

5.    matrix.postScale(2.0f, 3.0f);  

6.    matrix.mapPoints(points);  

7.    Log.i(“test”, points[0]+””);  

8.    Log.i(“test”, points[1]+””);  

结果为点坐标依旧为为(-20.0,30.0)

可见,总是pre先执行的。在看下面的:

[java] view plaincopy

1.    Matrix matrix = new Matrix();  

2.    float[] points = new float[] { 10.0f, 10.0f };  

3.      

4.    matrix.postScale(2.0f, 3.0f);// 第1步  

5.    matrix.preRotate(90);// 第2步  

6.    matrix.postTranslate(8.0f, 7.0f);// 第3步  

7.    matrix.preScale(1.5f, 2.5f);// 第4步  

8.    matrix.mapPoints(points);  

9.    Log.i(“test”, points[0] + “”);  

10.  Log.i(“test”, points[1] + “”);  

结果为点坐标依旧为为(-42.0,52.0)
经过前面的结论和推算,可以发现执行的顺序是   4—-2—-1—3

 

 在看下面的,增加了setScale的一段代码:

[java] view plaincopy

1.    Matrix matrix = new Matrix();  

2.    float[] points = new float[] { 10.0f, 10.0f };  

3.      

4.    matrix.postScale(2.0f, 3.0f);// 第1步  

5.    matrix.preRotate(90);// 第2步  

6.    matrix.setScale(1.4f, 2.6f);// 第3步  

7.    matrix.postTranslate(8.0f, 7.0f);// 第4步  

8.    matrix.preScale(1.5f, 2.5f);// 第5步  

9.    matrix.mapPoints(points);  

10.  Log.i(“test”, points[0] + “”);  

11.  Log.i(“test”, points[1] + “”);  

结果为点坐标依旧为为(29.0,72.0)
经过计算,可以发现,在第3步setScale之前的第1、2步根本就没有用了,直接被第3步setScale覆盖,在从第3开始执行的。

顺序为2—1—-3—-5—-4,因为2、1被覆盖了,所以没有效果,相当于直接执行3—–5—-4

 

总结:最后可以得出结论,在对matrix该次变换之前的所有设置中,先检测有没有setScale,如果有,直接跳到setScale那一步开始 执行变换,然后在倒着执行下面所有的pre…变换,在顺着执行所有post….的变换。所以在对Matrix变换设置的时候,一定要注意顺序,不 同的顺序,会有不同的结果。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/179977.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Redis和MySQL的区别与使用(redis做mysql的缓存并且数据同步)

    Redis和MySQL的区别与使用(redis做mysql的缓存并且数据同步)一、redis和mysql介绍Redis基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵。MySQL基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高。大多数的应用场景是MySQL(主)+Redis(辅),MySQL做为主存储,Redis用于缓存,加快访问速度。需要高性能的地方使用Redis,不需要高性能的地方使用M…

    2022年6月15日
    35
  • Java代码是怎么运行的「建议收藏」

    Java代码是怎么运行的「建议收藏」Java代码有很多运行方式。在开发工具中运行双击jar文件运行在命令行中运行在网页中运行当然,上述运行方式都离不开JRE,&nbsp;也就是Java运行时环境。JRE仅包含Java程序的必须组件,包括Java虚拟机以及Java核心类库…

    2022年7月7日
    25
  • 精华篇:数组指针

    精华篇:数组指针一.数组指针1.定义:数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int(*p)[10];p即为指向数组的指针,又称数组指针。2.特性:…

    2022年7月3日
    25
  • java中数组初始化方法_java数组初始化赋值

    java中数组初始化方法_java数组初始化赋值java中初始化数组的方式有几种发布时间:2020-06-0116:12:45来源:亿速云阅读:153作者:鸽子三种初始化方式:1、静态初始化:创建+赋值2、动态初始化:先创建再赋值3、默认初始化:创建之后若不赋值则会被赋对应数据类型的默认值我们来看一下具体代码:publicclassTest3{publicstaticvoidmain(String[]args){//1、声明…

    2022年10月19日
    0
  • Thinkpad x200 X201拆机换风扇教程 实图

    Thinkpad x200 X201拆机换风扇教程 实图X200机器取下电池后,背面图:上图:背部合计16颗螺丝,规格长度下面8有标注。1.黄色圈—–屏轴螺丝2.蓝色圈—-硬盘螺丝3.黑色圈—-键盘螺丝4.灰色圈—-SIM卡插槽(X200内部有扩充模块插槽这个插槽也可插询盘,X200均预留了WWAN天线在屏里面)5.绿色圈—-掌托/U形框螺丝6.红色方圈—-排水槽(是防水泼而不是防水,想起有个客户向别人炫耀往键盘上…

    2022年6月27日
    109
  • jetbrains激活码【2021.10最新】[通俗易懂]

    (jetbrains激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月28日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号