一、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. < LinearLayout   android:gravity = "center"   android:layout_width = "96px"   android:layout_height = "75px"    >
  2. < ImageButton   android: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.LayoutParams layoutParam =  new  LinearLayout.LayoutParams( 27 ,  27 );
  2. layout.addView(imageButton, layoutParam);

不过,事实上我们并不希望在代码存在“硬编码”的情况。

解决方案二:

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

[html] view plain copy  

  1. <? xml   version = "1.0"   encoding = "utf-8" ?>
  2. < bitmap   xmlns: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. <? xml   version = "1.0"   encoding = "utf-8" ?>
  2. < selector   xmlns:android = "http://schemas.android.com/apk/res/android"   >
  3. < item   android:state_pressed = "true"   >
  4. < bitmap   android:src = "@drawable/toolbar_bg_sel"   android:tileMode = "disabled"   android:gravity = "top"   />
  5. </ item >
  6. < item   >
  7. < bitmap   android: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了。

【android】ImageView的src和background的区别以及两者的妙用的更多相关文章

  1. ImageView的src和background的区别

    参考资料: http://blog.csdn.net/dalleny/article/details/14048375 http://www.android100.org/html/201508/27 ...

  2. android imageview使用的时候 引用资源src和background的区别

    android imageview使用的时候 引用资源时src和background的区别 src更强调内容并且不行拉伸图片进行适配,而background更注重引用图片,会对图片进行拉伸

  3. ImageView的src与background及ScaleType

    1 概述 开发中经常使用Imageview的src和background属性,从字面上看src是路径,background是背景.二者都可以显示drawable或者颜色.设置drawable图片资源时 ...

  4. 【android】ImageView的src和background以及两者之间的神奇的差异

    一.ImageView中XML属性src和background的差别: background会依据ImageView组件给定的长宽进行拉伸.而src就存放的是原图的大小,不会进行拉伸.src是图片内容 ...

  5. Android 代码里设置ImageView的src和background

    设置ImageView的src: image.setImageDrawable(getResources().getDrawable(R.drawable.blackk)); String path= ...

  6. 【Android 界面效果32】ImageView中XML属性src和background的区别

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

  7. ImageView中XML属性src和background的区别

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

  8. [android界面]android中src和background区别——前景与背景

    ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸.src是图片内容(前 ...

  9. Android ImageView属性

    ImageView 继承自View组件,主要功能是用于显示图片,实际上它不仅仅可以用来显示图片,任何Drawable对象都可以使用ImageView来显示.ImageView可以适用于任何布局中,并且 ...

随机推荐

  1. tupian

     http://www.iconfont.cn/https://icons8.com/http://ico.58pic.com/http://www.easyicon.net/ 

  2. markdown2 在win10下无法预览解决方案

    今天升级完Win10发现心爱的markdownPad 2无法预览,显示the view has crashed! 按照官网的Q&A http://markdownpad.com/faq.htm ...

  3. winfrom中按钮文本&的显示问题/按钮快捷键设置问题

    其实这个问题是因为“&”有特殊的意义-就是可以作为快捷键 第一种:Alt + *(按钮快捷键) 在大家给button.label.menuStrip等控件设置Text属性时在名字后边加& ...

  4. windows下面composer安装yii2

    1,安装composer "https://getcomposer.org/Composer-Setup.exe" 2,安装 composer-asset-plugin ,打开cm ...

  5. Python【第十篇】协程、异步IO

    大纲 Gevent协程 阻塞IO和非阻塞IO.同步IO和异步IO的区别 事件驱动.IO多路复用(select/poll/epoll) 1.协程 1.1协程的概念 协程,又称微线程,纤程.英文名Coro ...

  6. Laravel框架——任务调度(cron)

    准备: 在服务的/var/spool/cron/root文件中添加代码 cd /var/spool/cron/root 添加以下代码 * * * * * phppath 项目路径/artisan sc ...

  7. 在objc项目中使用常量的最佳实践

    在objc项目中使用常量的最佳实践   之前,在在objc项目中使用常量中,使用c的预处理#define来设置常量.比如,可以做个头文件,然后在需要的类文件中import,使用常量. 但这不是最佳实践 ...

  8. 如何使用 Laravel Facades ?

    Facade 布局是在面向对象编程中经常使用的一种软件设计布局方式.Facade 实际上是一种包括复杂函数库的类,提供了更加简洁易读的接口.Facade 布局还能为一组结构复杂.设计简陋的 API 提 ...

  9. python 大文件以行为单位读取方式比对

    http://www.cnblogs.com/aicro/p/3371986.html 先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如 ...

  10. 重构第四天 : 用多态替换条件语句(if else & switch)

    面相对象的一个核心基础就是多态,当你要根据对象类型的不同要做不同的操作的时候,一个好的办法就是采用多态,把算法封装到子类当中去. 重构前代码: public abstract class Custom ...