android ProgressBar被拉伸或压缩变形,显示不全

本文探讨了Android中ProgressBar的显示问题,特别是当使用不同分辨率的图片作为进度条背景时的现象。文章详细解释了为什么图片放置在不同density的drawable文件夹中会导致不同的显示效果,并给出了合理的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前奏

progressbar在xml的写法是:

<ProgressBar
            android:id="@+id/progressBar1"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="133.3dp"
            android:layout_height="42.4dp"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:minHeight="42.4dp"
            android:minWidth="133.3dp"
            android:progressDrawable="@drawable/networkdata_down_book_progress_selector" />

networkdata_down_book_progress_selector的xml文件是:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:id="@android:id/background"  android:drawable="@drawable/networkdata_btn_normal"></item>
    <item android:id="@android:id/progress" android:drawable="@drawable/networkdata_btn_press"></item>

</layer-list>

现象

将图片networkdata_btn_normal和networkdata_btn_press放在drawable-mdpi,现象是

这里写图片描述

而把图片放在drawable-xhdpi,现象是

这里写图片描述

最终把图放在drawable-nodpi里,现象是

这里写图片描述

WHY?

progressbar的android:progressDrawable属性是绘制draw图片,只有图的大小和progressbar大小一样才会正常显示,不然要么图片被截取显示,要么拉伸显示。

结论

我用的机器屏幕密度是1.65,也就是264dpi。而mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi,所以在drawable-mdpi和drawable-hdpi里,图片只显示一部分 ,在drawabe-xhdpi里会拉伸显示。 把图放在drawable-mdpi里,图会变成原来的宽高(264/160),也就是放大了1.65倍,而progressbar设定宽高,那么就会从放大后的图里,以左上角为原点,截取progressbar的宽高大小的图,hdpi同理是放大,所以显示不全;而在xhdpi里,图会变成原来的宽高(264/320),也就是缩小了0.825倍,那么要取progressbar的大小,也就需要填充,所以绘制第二张图来填满progressbar。把图放在drawable-nodpi,那么只会获取原图的大小,所以只要把progressbar的大小设为和图的大小一样就可以了。

PS:图片放在不同的资源文件夹里也会造成内存消耗不同,感兴趣的朋友可以参考: 关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析

欢迎回复讨论!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值