同步发表于http://avenwu.net/2015/02/03/porterduff

Fork on github https://github.com/avenwu/support

经常会遇到给图片加蒙层/遮罩的需求,比如,头像上面需要一个半透明的黑色啊什么的,解决这种需求并不难,实现方案也很多,最生硬的可以直接在图片上再放一个view设置背景为半透明,或者自己写一个带透明效果的ImageView,或者巧妙的利用Android ImageView提供的一些属性如setColorFilter。下面分别实现三种方案。

添加额外视图

ImageView的父级用FrameLayout或RelativeLayout

<FrameLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"> <ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/ic_watch" /> <View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#99000000" />
</FrameLayout>

自定义ImageView

在onDraw中额外在绘制一个半透明即可。

public class DimImageView extends ImageView {
public static int DEFAULT_DIM = 0x99000000;
int mDimColor; public DimImageView(Context context) {
this(context, null);
} public DimImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public DimImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.DimImageView, defStyleAttr, 0);
mDimColor = array.getColor(R.styleable.DimImageView_dim, DEFAULT_DIM);
array.recycle();
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(mDimColor);
}
}

利用PorterDuff

由于ImageView支持PorterDuff,所以了解相关属性的话,可以直接利用setColorFilter;

static final int MASK_HINT_COLOR = 0x99000000;
mImage.setColorFilter(MASK_HINT_COLOR, mode);

小结

以上三种方式均可实现蒙层效果,但是第一种是最不好的,由于会增加不必要的视图层级。而自定义的好处是相对扩展性强,可以有更多地自定义控件。当然最方便的还是直接使用setColorFilter。

参考

Porter/Duff,图片加遮罩setColorFilter的更多相关文章

  1. 关于图片加载非常爽的一个三方控件 fresco,一个三fresco

    Hi  EveryBody 今天来玩一个非常爽的控件 fresco 到底有多爽呢 接着看就知道了 首先 来看看fresco 是个神马东西 https://github.com/facebook/fre ...

  2. Android图片加载框架Picasso最全使用教程4

    通过前几篇的学习,我们已经对Picasso的加载图片的用法有了很深的了解,接下来我们开始分析Picasso为我们提供的其他高级功能及内存分析,Let’sGo ! Picasso进行图片的旋转(Rota ...

  3. Diycode开源项目 Glide图片加载分析

    1.使用Glide前的准备 1.1.首先要build.gradle中添加   github原地址点击我. 参考博客:Glide-开始! 参考博客:android图片加载库Glide的使用介绍. 参考博 ...

  4. Android中常见的图片加载框架

    图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行 ...

  5. 强大的图片加载框架Fresco的使用

    前面在卓新科技有限公司实习的时候,在自己的爱吖头条APP中,在图片异步加载的时候和ListView的滑动中,总会出现卡顿,这是因为图片的缓存做的不是足够到位,在项目监理的帮助下,有使用Xutils框架 ...

  6. Android之图片加载框架Fresco基本使用(二)

    PS:最近看到很多人都开始写年终总结了,时间过得飞快,又到年底了,又老了一岁. 学习内容: 1.进度条 2.缩放 3.ControllerBuilder,ControllerListener,Post ...

  7. ios新手开发——toast提示和旋转图片加载框

    不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...

  8. Fresco从配置到使用(最高效的图片加载框架)

    Frescoj说明:      facebook开源的针对android应用的图片加载框架,高效和功能齐全. 支持加载网络,本地存储和资源图片: 提供三级缓存(二级memory和一级internal ...

  9. iOS 正确选择图片加载方式

    正确选择图片加载方式能够对内存优化起到很大的作用,常见的图片加载方式有下面三种: //方法1 UIImage *imag1 = [UIImage imageNamed:@"image.png ...

随机推荐

  1. NumberFormat usage

    NumberFormat 是所有数值格式的抽象基类. 该类提供了格式化和分析数值的接口. NumberFormat 也提供了确定 哪个语言环境具有数值格式以及它们名字的方法. import java. ...

  2. opengles2.0之图元装配和光栅化

    光栅化的过程就是把三维世界中的物体转换成屏幕上像素的过程. glGetfloatv();    --------v表示的是数组 gles2.0里面有两种绘图命令.glDrawArrays和glDraw ...

  3. React Native填坑之旅--ListView篇

    列表显示数据,基本什么应用都是必须.今天就来从浅到深的看看React Native的ListView怎么使用.笔者写作的时候RN版本是0.34. 最简单的 //@flow import React f ...

  4. Hibernate Tools for Eclips Plugins

    1. 安装: Help -> Install new software -> Add ->Achieve -> 找到安装包 -> OK 2. 创建映射:

  5. 6.5 为什么Android用Java不用c实现?

    C/C++过于底层,开发者要花很多的经历对C/C++的语言研究清楚,例如C/C++的内存机制,如果稍不注意,就会忘了开启或者释放.而Java的GC会自动处理这些,省去了很多的时间让开发者专注于自己的业 ...

  6. Virtualbox修改bios信息安装Windows XP OEM

    转载 http://hi.baidu.com/guoyao11/item/631ad6eb4fb3d93887d9de11 具体方法有两个: 1.把下面的代码复制改后缀为BAT文件直接运行即可,以Le ...

  7. Maven 跳过测试命令行参数 skip test

    mvn    package -Dmaven.test.skip=true

  8. JQuery学习(选择器-简单-animated)

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...

  9. 揭秘Sql2014新特性-tempdb性能提升

    一直以来,在高负载,复杂的生产环境中,tempdb的压力是成为整个实例瓶颈的重要因素之一.微软的工程师们也在各个版本中不断优化它的使用.到了Sql Server2014又有了新的特性使其性能得temp ...

  10. 【Python自动化运维之路Day4】

    abs()  取绝对值all()  所有为真,则为真,否则为假any()  至少有一个为真,就为真,否则为假callable()   判断函数是否可以被调用,如果可以返回True,否则返回False ...