android项目中做一个默认图片变暗,有焦点时变亮的效果。相信大家都能各种办法,各种手段很容易的实现这个效果。这里记录下作者实现这个效果的过程及遇到的问题,仅供参考。
见下图(注:因为是eclipse截图,所以有点色差了,黄色变成蓝色,不过暗亮的效果还是明显的O(∩_∩)O~):
              

1.脑袋里转的第一个实现的想法是:
    2张图片,一张暗图,一张亮图。监听焦点事件,更换图片。
    诶,这不是demo诶,哪来一个资源图片弄2份,并且这图片是从服务器上获取的,不实际。

2.记得之前有过用设置控件的透明度。好,来试试:
    嗯?有2个不同的重载方法,形参分别为float和int。这俩有啥区别呢?

public void setAlpha(float alpha)

设置View的透明度为0~1的值,0完全透明,1完全不透明。注意这里说的是View

public void setAlpha(int alpha)
 

设置 image 的透明度,并且该方法在API 16的版本里被setImageAlPha(int)代替

好吧,眼见为实,来分别看看效果:

iv.setAlpha(0.5f)效果图为:

setImageAlpha(100),效果为:╮(╯▽╰)╭给我报异常退出了。

07-08 21:17:12.012: E/AndroidRuntime(29310): java.lang.NoSuchMethodError: android.widget.ImageView.setImageAlpha
 

测试机为android4.0.3,对应api为15.eclipse里有设置对应为16的api,但一运行就挂了╮(╯▽╰)╭。目测应该是兼容性问题,这里不深究了,感觉上篇讲的targetVersion有关,不过没验证哈。
这里还有另外一个方法,iv.getBackground().setAlpha(100);运行效果出来和上图使用iv.setAlpha(0.5f),不过透明程度有点不一致(但没大看出来)。前者值为(1~255),后者
为(0~1)。

好吧。到这里大家应该发现,和想要实现的效果相差甚远吧,作者也大失所望。因为这个我也是百度google“android imageView 实现变暗效果”,一堆的链接进去就是上面这种方法。这明显是变透明,
变暗透明,不可为诶。

继续找找还有啥子方法呢?不小心找到了个这个方法:

颜色过滤?是不ps的滤镜?来看下怎么用:

通过setColorFilter可以实现滤镜效果。 如: final WallpaperManager wallpaperManager = WallpaperManager.getInstance(this);
         //获取壁纸
 final Drawable wallpaperDrawable = wallpaperManager.getDrawable();
 //指定滤镜颜色以及混合模式
wallpaperDrawable.setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY); 
/*注意:PorterDuff.Mode枚举值: 
 1.PorterDuff.Mode.CLEAR 所绘制不会提交到画布上。
 2.PorterDuff.Mode.SRC 显示上层绘制图片
 3.PorterDuff.Mode.DST 显示下层绘制图片
 4.PorterDuff.Mode.SRC_OVER 正常绘制显示,上下层绘制叠盖。
 5.PorterDuff.Mode.DST_OVER 上下层都显示。下层居上显示。
 6.PorterDuff.Mode.SRC_IN 取两层绘制交集。显示上层。 
 7.PorterDuff.Mode.DST_IN 取两层绘制交集。显示下层。
 8.PorterDuff.Mode.SRC_OUT 取上层绘制非交集部分。 
 9.PorterDuff.Mode.DST_OUT 取下层绘制非交集部分。 
10.PorterDuff.Mode.SRC_ATOP 取下层非交集部分与上层交集部分 
11.PorterDuff.Mode.DST_ATOP 取上层非交集部分与下层交集部分 
12.PorterDuff.Mode.XOR //变暗 
13.PorterDuff.Mode.DARKEN //调亮 
14.PorterDuff.Mode.LIGHTEN //用于颜色滤镜 
15.PorterDuff.Mode.MULTIPLY 
16.PorterDuff.Mode.SCREEN

来试下效果:

iv.setColorFilter(Color.TRANSPARENT,PorterDuff.Mode.XOR);

额,貌似效果没变诶。看看上面用法说明

Set a tinting option for the image

貌似是设置图片image,不是控件ImageView的.好吧,换成下面的用法:

Drawable drawable = imgs.get(i);
drawable.setColorFilter(Color.TRANSPARENT,PorterDuff.Mode.XOR);
iv.setImageDrawable(drawable);

诶,貌似没效果。再仔细琢磨下,是不上面用的颜色值不对呢?好吧,换下成Color.GRAY,也不对呀。之后不管用哪个颜色,图片都显示不出来。

好吧,我妥协了。用上面帖子里的例子试下吧。改成多层样式的:

drawable.setColorFilter(Color.GRAY,PorterDuff.Mode.MULTIPLY);

O(∩_∩)O~哈哈,效果出来了:

这是个不错的尝试。然后获取焦点时,把这个滤镜清掉就OK了。

drawable.clearColorFilter();

显示为原始亮图了。

注:其实作者最开始贴上去的2张图并不是用上面滤镜方法实现的。上面方法只是在整理这篇博客时,临时发现的。就尝试下,没想到成功了。早知道当时就都多试几次,就不用下面这种方法了。

继续瞅瞅ImageView的api吧,看看都有些啥子属性。相信大家都会注意到ImageView特有的这2个方法:

    public void setImageDrawable (Drawable drawable)

    Added in API level 1
Sets a drawable as the content of this ImageView. Parameters
drawable The drawable to set
    public void setBackgroundDrawable(Drawable background)
This method was deprecated in API level 16. use setBackground(Drawable) instead

这2者有啥区别呢?这个相信用过的人都不难理解。

当设置setBackgroundDrawable时,整个ImageView的控件背景色会变。

当设置setImageDrawable时,ImageView中间内容区会被图片填充。但是周围会有一些边距,默认无法填充整个控件(当然,这也是有属性设置的)。

ScaleType的值分别代表的意义: ImageView是Android中的基础图片显示控件,该控件有个重要的属性是ScaleType,该属性用以表示显示图片的方式,共有8种取值    
ScaleType.CENTER::图片大小为原始大小,如果图片大小大于ImageView控件,则截取图片中间部分,若小于,则直接将图片居中显示。    
ScaleType.CENTER_CROP:将图片等比例缩放,让图像的短边与ImageView的边长度相同,即不能留有空白,缩放后截取中间部分进行显示。    
ScaleType.CENTER_INSIDE:将图片大小大于ImageView的图片进行等比例缩小,直到整幅图能够居中显示在ImageView中,小于ImageView的图片不变,直接居中显示。    
ScaleType.FIT_CENTER:ImageView的默认状态,大图等比例缩小,使整幅图能够居中显示在ImageView中,小图等比例放大,同样要整体居中显示在ImageView中。    
ScaleType.FIT_END:缩放方式同FIT_CENTER,只是将图片显示在右方或下方,而不是居中。    
ScaleType.FIT_START:缩放方式同FIT_CENTER,只是将图片显示在左方或上方,而不是居中。    
ScaleType.FIT_XY:将图片非等比例缩放到大小与ImageView相同。    
ScaleType.MATRIX:是根据一个3x3的矩阵对其中图片进行缩放

比如说上图,蓝色图标为setImageDrawable,后面灰色背景为setBackgroundDrawable,src在背景之上。这样大家应该能明白了吧。
好吧。言归正传,有这2个属性+ScaleType.CENTER_CROP,完全可以实现图片变暗变亮效果了。

1.用一张过滤遮盖变暗的图片filter_bg.png作为ImageView的源图片:setImageDrawable

2.把要显示的图片show.png设置为背景:setBackgroundDrawable

3.当变亮时,用一张遮盖后完全透明的图片transparent_bg.png替换filter_bg.png

这样就实现变暗变亮的效果了。

注:设置时,要设置src填充整个控件CENTER_CROP

<ImageView
android:id="@+id/ivs_show1"
android:layout_width="315px"
android:layout_height="120px"
android:src="@drawable/filter_bg"
android:scaleType="centerCrop"/>

android View实现变暗效果的更多相关文章

  1. Android View部分消失效果实现

    本文来自网易云社区 作者:孙有军 老需求 我们经常会有需求就是View消失的效果,这里我们说的消失往往是全部消失,我们可能采用一个alpha动画,在指定的时间内消失掉View,出现则实现相反的动画.我 ...

  2. Android:通过滤镜实现点击图片变暗效果

    实现点击图片(ImageView)变暗效果,有一个较简单的方法,就是讲目标图片设置为背景图片(setBackground),再创建一个selector.xml文件,里面放置一张普通状态时的透明图片,一 ...

  3. android设置view透明度的效果

    android设置view透明度的效果 推荐textView.setBackgroundColor(Color.TRANSPARENT);     第一种方法:在xml文件中设置背景颜色. andro ...

  4. 虾扯蛋:Android View动画 Animation不完全解析

    本文结合一些周知的概念和源码片段,对View动画的工作原理进行挖掘和分析.以下不是对源码一丝不苟的分析过程,只是以搞清楚Animation的执行过程.如何被周期性调用为目标粗略分析下相关方法的执行细节 ...

  5. Android View 的事件体系

    android 系统虽然提供了很多基本的控件,如Button.TextView等,但是很多时候系统提供的view不能满足我们的需求,此时就需要我们根据自己的需求进行自定义控件.这些控件都是继承自Vie ...

  6. Android Scroll分析——滑动效果产生

    相对于在Android2.x版本上出现的长按.点击事件的效果,不得不说,滑动操作具有更好的用户体验.因此,从Android 4.X版本开始,出现了更多滑动操作的效果.越来越多第三方应用模仿这样的效果, ...

  7. Android实现滑动刻度尺效果,选择身高体重和生日

    刻度尺效果虽然看起来很美,我个人认为很不实用,即使再不实用,也有用的,鉴于群里成员对我的苦苦哀求,我就分享一个他用不到的,横屏滑动刻度尺,因为他需要竖屏的,哈哈…… 最近群里的开发人员咨询怎样实现刻度 ...

  8. 简单研究Android View绘制二 LayoutParams

    2015-07-28 17:23:20 本篇是关于LayoutParams相关 ViewGroup.LayoutParams文档解释如下: LayoutParams are used by views ...

  9. Android View 如何绘制

    上文说道了Android如何测量,但是一个漂亮的控件我只知道您长到哪儿,这当然不行.只需要简单重写OnDraw方法,并在Canvas(画布)对象上调用那根五颜六色的画笔就能够画出这控件"性感 ...

随机推荐

  1. Delphi实例之一个简易的浏览器的实现

    Delphi实例之一个简易的浏览器的实现 Delphi7的WebBrowser组件提供了很多不错的网页设计的功能,下面做一个简单的浏览器.组件很简单按照下面摆放就行了. 这是运行后的效果 源代码 主页 ...

  2. 自动化测试---mybatis的使用

    mybatis如何实现了对数据库的操作: 1.通过Resources.getResourceAsReader()或者 Resources.getResourceAsStream()加载mybatis. ...

  3. cocos2d-x 键盘和鼠标事件

    出了菜单可以响应用户事件外,cocos2d中的层(Layer)也可以响应事件.层能够自动响应窗口事件,这些事件主要是键盘和鼠标事件,cocos2d中事件处理是通过Pyglet的事件处理完成的. 1.键 ...

  4. django2.0 以上版本安装 xadmin

    1.xadmin的下载 源码包下载地址: https://github.com/sshwsfc/xadmin/tree/django2 2.使用命令安装xadmin pip install 你下载的压 ...

  5. 洛谷P1189'SEARCH'

    题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息. 编写程 ...

  6. HDU 4719 Oh My Holy FFF(DP+线段树)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)

    Description N soldiers from the famous "*FFF* army" is standing in a line, from left to ri ...

  7. 解决ecplise安装mybatipse插件时报找不到jar包的错

    在安装mybatipse插件的时候一直报这个错,脑袋疼,在网上搜了半天也没有结果,最后摸索了半天解决了,这里先贴一张图 1.先找到eclipse的安装目录,然后把相应的jar包拷到plugins里去, ...

  8. Java相关配置合集

    Java环境变量配置: 1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为C:\java\jdk1.6.0_08: 2.安装完成后,右击“我的电脑”,点击“属性”: 3.XP选 ...

  9. 【SSH】——spring的控制反转和依赖注入

    spring是一个轻量级的容器框架,主要是为了使企业的开发变得简单.高效.无论是从大小还是开销来讲,他都可以算是轻量级的,也是非侵入性的. 下图是spring的框架示意图,说到spring,就不得不提 ...

  10. Qt5.6关联VS2013,配置VAssistX

    1. 安装Qt qt-creator-opensource-windows-x86-4.2.0.exe 2. 安装Qt VS插件 qt-vs-addin-1.2.5.exe 3. 配置ASSISTX ...