ImageView保持前景src和ImageView的高度一致

public class RatioImageView extends ImageView {

    public RatioImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Drawable drawable = getDrawable();
        if (drawable != null) {
            // 因为高有问题,所以我们修改这高,让它按比例算出这个高
            int picRealHeight = drawable.getMinimumHeight();    // 获取图片真实的高
            int picRealWidth = drawable.getMinimumWidth();      // 获取图片真实的宽

            float scale = (float) picRealHeight / picRealWidth; // 计算图片高和宽的比例
            int width = MeasureSpec.getSize(widthMeasureSpec);  // 获取测量规格
            int height = (int) (width * scale);                 // 按比例计算高度
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);   // 创建测量规格
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

}

了解ImageView的几个概念

① 前景src

src属性默认会保持图片比例不变。


② ImageView的高度

默认采用图片真实的高。


③ 对于ImageView来说

onMeasure用来测量前景src的宽高尺寸;

onLayout不起作用,其父亲为空实现;


④ 为何这么做就好了呢?

ImageView的高度设置为wrap_content,则ImageView的高度就是原始图片的高度,

而前景src要进行等比例的缩小,显示效果就是图片前景高度和ImagView高度不匹配,

将ImageView高度在onMeasure里设置为前景src高度,此时ImageView和前景src高度一致;


⑤ onMeasure作用是啥?

   设置ImageView的size和measureSpec:ImageView尺寸和测量规格;

    此时ImageView自身获取到其自身的信息,自身调用onDraw方法;

    onMeasure由其父容器的measure调用,为其传递尺寸信息;

    在ImageView的onMeasure方法里,ImageView可以决定自己的尺寸信息是否需要修改,

   如果不需要修改,就采取父容器传递过来的尺寸信息。


要求ImageView的前景src和ImageView的高度一致;

要求美工切图要统一比例,我们对图片高度不控制,完全由图片宽度和目标图片宽度的scale决定。


除了自定义ImageView手动设置ImagaView的高度之外,还可以利用ImageView自带的一个属性在xml中声明,自动设置ImageView的前景和ImagaView的高度自适应:


 <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="#6000"
        android:src="@drawable/sp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="30dp" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#6000"
        android:scaleType="fitStart"
        android:src="@drawable/sp" />

第一张ImageView高度自适应

第二张前景和ImageView的宽度不匹配,之所以出现这种情况是因为,为了保证前景(图片)的宽高比例不变,对图片宽度和高度等比例缩放到的最大程度。






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值