IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android ImageView属性ScaleType的源码解析 -> 正文阅读

[移动开发]Android ImageView属性ScaleType的源码解析

ImageView的ScaleType的属性,一共有八个,一般都是自己看着来用,最近开发时,需要修改图片的缩放,理解了一波ScaleType的属性,总结一下。

属性值作用
MATRIX使用setImageMatrix(Matrix),允许用户自定义缩放、平移、透视来变形
FIT_XY缩小或放大图片,充满控件,不裁剪,可能会改变图片纵横比
FIT_START缩小或放大图片,未充满控件,保证纵横比,从原点开始,保证长宽有一个是完整的
FIT_CENTER缩小或放大图片,未充满控件,保证纵横比,保证长宽有一个是完整的,显示在中间
FIT_END缩小或放大图片,未充满控件,保证纵横比,从底部右边开始,保证长宽有一个是完整
CENTER不缩放,充满控件,会裁剪,保证纵横比,显示在中央
CENTER_CROP缩放图片,保证纵横比,使长宽等于或大于视图的尺寸,显示在中央,会剪裁
也就是说保证图片的短边能显示出来,而长边不会完整的显示
CENTER_INSIDE缩放图片,保证纵横比,,使长宽等于或小于视图的尺寸,显示在中央
  • MATRIX

    MATRIX是一个矩阵类,是用来对图片进行缩放、平移、旋转等操作,主要有:

    • translate 平移

      mMaritx.setTranslate(float dx,float dy)
      
    • Rotate 旋转

      mMaritx.setRotate(float degrees, float px, float py)//旋转角度,旋转中心
      
    • scale 缩放

      mMartix.setScale(float sx, float sy,float px,float py) //
      
    • skew 倾斜

      mMartix.setSkew(float sx, float sy,float px,float py) //
      

? 矩阵的乘法是只有左乘的概念,需要(m*n)*(n*m),但是由于mMartix是一个3*3的矩阵,因此可以左乘和右乘,这种概念毫无用处,只是因为它提供的Api中有postprepost是指当前矩阵左乘参数矩阵,pre是指参数矩阵乘以当前矩阵,因此如果你的变化是连续的,需要分清先后顺序。

//源码解析
if (ScaleType.MATRIX == mScaleType) {
  // Use the specified matrix as-is.
  if (mMatrix.isIdentity()) {
    mDrawMatrix = null;
  } else {
    mDrawMatrix = mMatrix;
  }

由此可以见到,其是将参数矩阵mMatrix给了mDrawMatrix,然后在Draw()时调用mDrawMatrix.

使用时,需要先将矩阵填入,再使用类型

setScaleType(ScaleType.MATRIX);
setImageMatrix(mMatrix);

setScaleType时会重新刷新。

  • FIT_XY

  • FIT_START

  • FIT_CENTER

  • FIT_END

    以上方法时,使用了JNI,没有查到源码

  • CENTER

    //vwidth 控件宽  vheight 控件高 //dwidth 图片宽 //dheight 图片高
    if (ScaleType.CENTER == mScaleType) {
                    // Center bitmap in view, no scaling.
                    mDrawMatrix = mMatrix;
                    mDrawMatrix.setTranslate(Math.round((vwidth - dwidth) * 0.5f),
                                             Math.round((vheight - dheight) * 0.5f));
    

    由源码可知,只是将其进行了平移,移动到控件的中间。

  • CENTER_CROP

    这个我理解了很久,使用代数法进行了一波实验,保证有一边是可以完全展示出来的,另一边是超过控件大小的,最后再平移到控件中间,但是它对于宽高比的处理,是通过图片宽高比和控件的宽高比进行比较,得到哪个是短边。

    //vwidth 控件宽  vheight 控件高 //dwidth 图片宽 //dheight 图片高
    if (ScaleType.CENTER_CROP == mScaleType) {
      mDrawMatrix = mMatrix;
      float scale;
      float dx = 0, dy = 0;
      if (dwidth * vheight > vwidth * dheight) {
        scale = (float) vheight / (float) dheight;
        dx = (vwidth - dwidth * scale) * 0.5f;
      } else {
        scale = (float) vwidth / (float) dwidth;
        dy = (vheight - dheight * scale) * 0.5f;
      }
      mDrawMatrix.setScale(scale, scale);
      mDrawMatrix.postTranslate(Math.round(dx), Math.round(dy));
    

    可以这么理解,图片宽高比>控件宽高比,图片高度是可以保证通过缩放完全显示,宽边会超过控件宽度,反之则是图片宽度是可以保证通过缩放完全显示,高度会超过控件高度。

  • CENTER_INSIDE

    • 当图片宽高都小于控件的宽高时,则不会缩放
    • 当图片宽高有一边大于控件的宽高时,则会选择长边的缩放比例,保证长边充满控件,而短边完全显示却不充满控件
    • 最后平移到中间
    if (ScaleType.CENTER_INSIDE == mScaleType) {
      mDrawMatrix = mMatrix;
      float scale;
      float dx;
      float dy;
    
      if (dwidth <= vwidth && dheight <= vheight) {
        scale = 1.0f;
      } else {
        scale = Math.min((float) vwidth / (float) dwidth,
                         (float) vheight / (float) dheight);
      }
    
      dx = Math.round((vwidth - dwidth * scale) * 0.5f);
      dy = Math.round((vheight - dheight * scale) * 0.5f);
    
      mDrawMatrix.setScale(scale, scale);
      mDrawMatrix.postTranslate(dx, dy);
    
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-02-01 20:43:51  更:2022-02-01 20:46:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:07:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码