XML设置View的背景和代码中通过setBackground设置的背景尺寸不一

在Android开发中,XML中设置View背景与代码中通过setBackground方法可能产生尺寸差异。问题在于BitmapDrawable的构造方法,不指定Resources会导致Density默认为160,而XML设置会根据设备Density调整。解决方法是使用`new BitmapDrawable(getResources(), bitmap)`来创建Drawable,确保Density匹配。" 113415347,10537677,PHP连接MySQL数据库:mysqli扩展实战,"['PHP', 'MySQL', '数据库操作', 'mysqli扩展']

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

大家都知道,设置view的背景有两种方法,分别是XML中设置,代码中设置。


奇怪的是我在xml中设置背景时,显示的是图中右边的效果,而在代码中设置的却成了左图的效果(忽略颜色)。



xml中设置背景时这么写的:

android:background="@drawable/keyword_bg"
在代码中设置时是这么写的:

//mKeyWordBackground是bitmap
mKeyWordBackground = BitmapFactory.decodeResource(getResources(), R.drawable.keyword_bg);
//转化成Drawable
Drawable b = new BitmapDrawable(mKeyWordBackground);
//mKeyOne是View组件
mKeyOne.setBackgroundDrawable(b);
用的是同一张背景图片keyword_bg,而出来的效果确实是左图的。可能这里大家看起来觉得很奇怪为什么不直接用setBackgroundResource把背景图设置好就完事,确实这里我这么做大家看来确实是多此一举,这里原本是有一段背景图片的处理逻辑,需要在背景图片上加点东西然后最后生成的Drawble才能作为背景,为了简洁地把问题反映出来,我把处理逻辑都去掉了。


在代码中的实验过程(为了不产生和代码中的冲突,先把xml中的setbackground语句去掉):

1、mKeyOne.setBackgroundResource(R.drawable.keyword_bg)显示效果正常。但是这种办法不适合,我要在代码中动态改变背景图的需求。

2、 mKeyOne.setBackgroundDrawable(getResources().getDrawable(R.drawable.keyword_bg))效果显示正常,这个就有点像我的需求了getResources().getDrawable(R.drawable.keyword_bg)返回的是一个Drawble。可是为什么我把背景图片处理完之后转成Drawble却不行呢?后来跟同事一起百度了一下找到了问题所在,

把Bitmap转成Drawble的语句

从 Drawable drawable = new BitmapDrawable(mKeyWordBackground) ;

换成了 Drawable drawable = new BitmapDrawable(getResources(),mColorBitmap) ;

显示就正常了如下图(忽略颜色不同的问题)


看了下源码和别人写的博客发现点击打开链接

BitmapDrawable(Resources res, Bitmap bitmap);

BitmapDrawable(Bitmap bitmap);

后来换上去的构造方法比原本我使用的那个构造方法多了一条设置Density的语句。

 mBitmapState.mTargetDensity = mTargetDensity;

它会根据运行机器的Density来设置,如果使用BitmapDrawable(Bitmap bitmap);这个构造方法那么他就会使用默认的Density 160来设置,所以才会导致XML设置View的背景和代码中通过setBackground设置的背景尺寸不一的问题。

。。如有更好的建议,或者哪里说错了,希望大家能多多提点。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值