大家都知道,设置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设置的背景尺寸不一的问题。
。。如有更好的建议,或者哪里说错了,希望大家能多多提点。
原文链接:https://www.f2er.com/xml/297283.html