scaleType分析

scaleType分析android的scaleType有center,centerCrop,centerInside,fit,fitCenter,fitStart,fitEnd,Matrix。文章分别分析这接种模式的含义与实现算法。Centercenter不放缩,超出dst显示图片中间的元素,代码中是将canvas的坐标平移到能够将图片显示到屏幕中的位置   mDrawMatrix=m

 
android的scaleType有center,centerCrop,centerInside,fit,fitCenter,fitStart,fitEnd,Matrix。文章分别分析这接种模式的含义与实现算法。

Center
center不放缩,超出dst显示图片中间的元素,代码中是将canvas的坐标平移到能够将图片显示到屏幕中的位置
     

mDrawMatrix = mMatrix;
mDrawMatrix.setTranslate(Math.round((vwidth - dwidth) * 0.5f),
                         Math.round((vheight – dheight) * 0.5f));

centerCrop
等比例放大图片,保证图片宽高大于等于dst的宽高,一条边等于,一条边大于或者等于。
代码中实际上是对canvas进行缩放,平移。
缩放的比率: 思路就是选择view/drawable的宽或者高占比大的一边的比例进行缩放,这样该边的drawable就会与view一样大,另外一边按照这个比例压缩,值就比view大。
平移的距离: 相等的边不用平移,大的边,需要平移,保证中间显示。
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));

centerInside
等比例缩小图片,保证图片宽高小于等于dst的宽高
代码中实际上是对canvas进行缩放,平移
缩放的比率: 思路就是如果都小,那么不压缩,否则按照view/drawable的宽或者高小的缩放到view一样大,另外一边由于按照小值进行压缩,值就比view的小
平移的距离: 如果drawable的某个边小与view,平移多出来的长度/2 ,保证居中, 相等的边不用平移
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);
Fit
实际上对drawable进行缩放


fitcenter
等比例放缩图片,保证图片全部显示在view中且至少有一边等于dst,居中显示
fitStart
等比例放缩图片,保证图片全部显示在view中且至少有一边等于dst,start显示
fitEnd
等比例放缩图片,保证图片全部显示在view中且至少有一边等于dst,end显示
代码中实际上是调用native的方法
缩放的比率:等比例放缩,用小比例值放缩,类似于下面的代码

缩放比例 scale = Math.
min((
float) vWidth / (
float) dwidth
,
            (
float) vheight / (
float) dheight)
;



 fitXY
不等比例放缩,保证图片宽高等于dst 
代码中实际上就是设置drawable的bound,保证充满区域
缩放的比率:不等比例放缩,分开计算比值
    /* If the drawable has no intrinsic size, or we're told to
        scaletofit, then we just fill our entire view.
    */
    mDrawable.setBounds(0, 0, vwidth, vheight);
    mDrawMatrix = null;

Matrix
  
Scale using the image matrix when drawing



反思:
1.图片组件的缩放实际上是图片已经加载到内存中,通过控制canvas的matrics实现不同的缩放效果,没有改变图片的内存
2.如果不进行放缩,只进行居中平移,那么就是center的效果
3.如果不等比例,就是fitxy,保证宽高相等
4.平移保证位置

总结:
center: 不放缩,居中
centerInsider:等比例小值,居中,都小于就不缩放
centerCrop:等比例大值,居中
fitCenter:等比例小值,居中
fitXY:不等比例

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/38977.html

(0)
编程小号编程小号

相关推荐

发表回复

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