全面理解imageview的ScaleType属性,并做好适配
前言:Android机型的种类大家都知道,适配一直都是一个大问题。所以一直以来对于开发者都是用多套图来做适配。这样做可以解决部分适配问题,但是缺点就是给app带来了负担,导致app包特别的大。
关于imageview的缩放类型
- fitxy:这个是最好理解的,在xy的方向上铺满imageview,就像background一样。所以说是很有可能拉伸图片的。那么配合它使用的另一个属性就要登场了:android:adjustViewBounds=”true”她的意思就是是否保持原始比例,设置为true就是保持原始比例。亲测过确实是原始比例。在网上搜了一下看到说这个必须配合maxWidth和maxHeight使用,我没有设置这个,但是imageview的宽高都是wrapContent,效果就是他会在这个imageview的范围内按照原始比例“裁剪”到最大的尺寸,不一定会铺满这个imageview。
- fitStart:字面意思就是适配最开始的位置,我们的习惯就是从左上开始,那么图片就会从左上角开始等比例的放大,直到一个方向上撑满停止。这个属性值用到的机会很少,这个解释也比较抽象,这里放上一张图辅助理解!
- fitEnd:和fitStart一样,不一样的是从右下角开始伸展,不再细说
- fitCenter:等比例缩放,直到一个方向撑满,然后居中显示
- center:不会缩放图片,居中显示,如果图片过大会超出屏幕
- center_crop:图片等比缩放,直到一个方向上撑满,居中显示,超出屏幕的地方会被裁剪
- center_insid:只有图片的长宽大于控件时,才会缩放图片,然后居中显示
- matrix:宽度撑满居上或居下显示,高度撑满居左或居右显示。
以宽度撑满居上显示为例的使用方式:
1⃣️:自定义imageview,重写setFrame方法
@Override
protected boolean setFrame(int l, int t, int r, int b) {
boolean changed = super.setFrame(l,t,r,b);
if(getScaleType() == ScaleType.MATRIX){
transformMatrix();
}
return changed;
}
private void transformMatrix(){
Matrix matrix = getMatrix();
float w = getWidth();
float cw = getDrawable().getIntrinsicWidth();
float widthScaleFactor = w/cw;
matrix.setScale(widthScaleFactor,widthScaleFactor,0,0);
setImageMatrix(matrix);
}
2⃣️:布局中使用这个imageview并设置scaleType的属性为matrix
总结
理解了上边的属性问题,我们就拿一张图来谈谈适配问题。图片的适配无非就是原比例显示,不能变形。我们可以根据像素转换为dp的形式设置imageview的宽高,然后拿最大的图来适配,上面说的所有的等比缩放的都可以使用。最常用的就是center_crop和fitxy。但是这个必须小心使用。