一、ImageView中XML属性src和background的区别:


background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸。src是图片内容(前景),bg是背景,可以同时使用。

此外:scaleType只对src起作用;bg可设置透明度,比如在ImageButton中就可以用android:scaleType控制图片的缩放方式



二、解决android:background背景图片被拉伸问题:

如上所述,background设置的图片会跟View组件给定的长宽比例进行拉伸。举个例子, 36x36 px的图标放在 xhdpi 文件夹中,在854x480(FWVGA,对应hdpi)环境下,按照

xhdpi : hdpi : mdpi: ldip =2 : 1.5 : 1 : 0.75

的比例计算,在FWVGA下,图标的实际大小应该是 27x27。

但是当我把它放到一个 layout_width = 96px, layout_height = 75px 的 LinearLayout,布局代码如下:

[html] view plain copy
  1. <LinearLayoutandroid:gravity="center"android:layout_width="96px"android:layout_height="75px">
  2. <ImageButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/toolbar_bg"/>
  3. </LinearLayout>

实际情况是,我们得到的ImageButton的大小是 33x27,很明显width被拉伸了,这是我们不想看到的情况。

解决方案一:

代码中动态显式设置ImageButton的layout_width和layout_width,如下

[java] view plain copy
  1. LinearLayout.LayoutParamslayoutParam=newLinearLayout.LayoutParams(27,27);
  2. layout.addView(imageButton,layoutParam);
不过,事实上我们并不希望在代码存在“硬编码”的情况。

解决方案二:

在你通过setBackgroundResource()或者在xml设置android:background属性时,将你的background以XML Bitmap的形式定义,如下:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <bitmapxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@id/toolbar_bg_bmp"
  4. android:src="@drawable/toolbar_bg"
  5. android:tileMode="disabled"android:gravity="top">
  6. </bitmap>
调用如下:

imageButton.setBackgroundResource(R.drawable.toolbar_bg_bmp)

或者

<ImageButton ... android:background="@drawable/toolbar_bg_bmp" ... />

若背景图片有多种状态,还可参照toolbar_bg_selector.xml:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <selectorxmlns:android="http://schemas.android.com/apk/res/android">
  3. <itemandroid:state_pressed="true">
  4. <bitmapandroid:src="@drawable/toolbar_bg_sel"android:tileMode="disabled"android:gravity="top"/>
  5. </item>
  6. <item>
  7. <bitmapandroid:src="@drawable/toolbar_bg"android:tileMode="disabled"android:gravity="top"/>
  8. </item>
  9. </selector>

如此,不管是通过代码方式setBackgroundResource()或XML android:background方式设置背景,均不会产生被拉伸的情况。




三、imageButton 使用透明图片:

在Android上有很多不规则按钮。如:


这个时候,我们如果想做成不规则按钮的话,第一步就是搞一张边缘透明的png图片,然后用src指定到他,这个时候我们会发现,还没有达到要的效果,还有图片周围还是有一层渲染。此时还要搞第二步:需要对ImageButton设置背景属性android:background="#00000000",就实现了不规则按钮的效果了。如图:

有朋友可能会说,直接用background指定该图片就ok啦, 可是,如果用background指定,会使图片填充整个imageButton.比如imageButton长宽200,而图片长款只有50,那么图片就会被拉伸4倍变模糊。而我们要达到的效果不是为了填充。像上面锤子图标一样。占中间一部分就OK了。



参考:http://blog.csdn.net/oathevil/article/details/23707359

http://blog.csdn.net/howlaa/article/details/38660593

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. Kotlin从入门到沉迷
  3. android gif 图片显示问题
  4. Android本地化开发技巧
  5. 这也许是Android一句话权限适配的更优解决方案
  6. Android(安卓)对Bitmap的内存优化
  7. Android(安卓)MVVM的沉思
  8. Android(安卓)发送Post请求上传图片(以InputStream为数据交互)
  9. gradle编译慢的解决办法,优化android studio编译效率

随机推荐

  1. Android中使用Lambda
  2. Android图形系统的分析与移植--一、Andro
  3. 笔记 android 代码中设置Android:layout_
  4. android多线程访问服务器数据
  5. android之layout_weight使用
  6. activity的xml详解
  7. Android Webview 和Javascript交互,实现An
  8. Android插件配置-Android Extension介绍
  9. android 重力感应初步认识
  10. Android调用输入法软键盘,返回输入的内容