当前位置: 首页 > news >正文

Porter/Duff,图片加遮罩setColorFilter

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

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

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

colorfilter.png

添加额外视图

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。

参考

  • http://blog.danlew.net/2014/08/18/fast-android-asset-theming-with-colorfilter/
  • http://ssp.impulsetrain.com/porterduff.html
  • http://www.ibm.com/developerworks/java/library/j-mer0918/

相关文章:

  • MySQL基础备忘(3)之update多表更新
  • iPhone 丢失
  • Java IO流学习总结四:缓冲流-BufferedReader、BufferedWriter
  • Ant多渠道批量打包
  • CCF201409-4 最优配餐(100分)
  • ios的delegate机制
  • 同义词
  • MPLS和LDP标签分发
  • JSON 生成 C# Model
  • Golang 知识点总结
  • [raspberry pi3] 串口线使用
  • 如何连接别人电脑上的ORACLE数据库
  • 虚拟机 主机无法访问虚拟机中Linux上的tomcat服务
  • 【244】◀▶IEW-Unit09
  • ld: library not found for -lPods-AFNetworking的可能原因
  • 【刷算法】从上往下打印二叉树
  • 4个实用的微服务测试策略
  • angular2 简述
  • Fastjson的基本使用方法大全
  • Git 使用集
  • Gradle 5.0 正式版发布
  • JavaWeb(学习笔记二)
  • MD5加密原理解析及OC版原理实现
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • sessionStorage和localStorage
  • Vue.js 移动端适配之 vw 解决方案
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 程序员最讨厌的9句话,你可有补充?
  • 机器学习学习笔记一
  • 基于游标的分页接口实现
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端_面试
  • 消息队列系列二(IOT中消息队列的应用)
  • 一道面试题引发的“血案”
  • 异步
  • Linux权限管理(week1_day5)--技术流ken
  • # 飞书APP集成平台-数字化落地
  • ###C语言程序设计-----C语言学习(3)#
  • #define 用法
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (12)目标检测_SSD基于pytorch搭建代码
  • (四)Linux Shell编程——输入输出重定向
  • (四)汇编语言——简单程序
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • .net core Swagger 过滤部分Api
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core 成都线下面基会拉开序幕
  • .Net Core 中间件验签
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • @Autowired @Resource @Qualifier的区别
  • [20171101]rman to destination.txt
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [BZOJ] 2427: [HAOI2010]软件安装