Android自定义ImageView,渲染点击色

Android渲染点击色

先来看一个需求:

我们的深紫色过时了,我们改主题色为浅紫色吧!

开始

分析

这个需求看起来没啥事,改个色值就行了
仔细一查,我靠,所有的图片都是切图,然后,所有的图片命名都很规范,但是设计MM给的图片都是中文的,而且看起来很随心所欲..
然后略微数了下:加点击色,200多张切图

解决

这种工作明显不应该我们码农来做嘛,尤其是下一次再来个更浅的紫色我们岂不是要再改200张?
这就是要玩死我们的节奏嘛!
这个时候我们想着可以通过一种程序员的方式来解决问题
图片给我,我来渲染他的正常颜色,点击色,包括不能点击的颜色,UI只需要给我们一个色值就ok了,以后要改,只需要修改一下style,甚至还能完成换皮肤功能,听起来很好,就这么愉快的决定了

修改

首先,这需要我们自定义控件嘛,定义一个

我这里使用kotlin,建议用java的人了解下kotlin语法,真的不错,我生产环境用了2个多月了,感觉良好


package cn.sxw365.base.mvp.ui.customview

import android.content.Context
import android.graphics.*
import android.support.v7.widget.AppCompatImageView
import android.util.AttributeSet
import cn.sxw365.base.R
import com.kikt.mylibrary.util.ViewUtils

/**
 * Created by cai on 2017/6/1.
 */
class MainImageView(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0)
    : AppCompatImageView(context, attrs, defStyleAttr) {

    constructor(context: Context, attributeSet: AttributeSet) : this(context = context, attrs = attributeSet)

    private var pressedFilter: ColorFilter? = null
    private var normalFilter: ColorFilter? = null

    var pressedColor: Int = Color.WHITE  //默认是白色
        set(value) {
            field = value
            pressedFilter = PorterDuffColorFilter(value, PorterDuff.Mode.SRC_IN)
        }

    init {

        if (attrs != null) {
            val a = context.obtainStyledAttributes(attrs, R.styleable.MainImageView)
            pressedColor = a.getColor(R.styleable.MainImageView_pressed_color, Color.WHITE)
            a.recycle()
        }
    }

    override fun onDraw(canvas: Canvas?) {
        if (isPressed) {
            drawable.colorFilter = pressedFilter
            super.onDraw(canvas)
        } else {
            drawable.clearColorFilter()
            super.onDraw(canvas)
        }
    }

}

核心代码分析

定义一个filter,用于处理色值的问题pressedFilter = PorterDuffColorFilter(value, PorterDuff.Mode.SRC_IN)
这个就代表了pressed以后的颜色,SRC_IN是一个bitmap的XferMode中的一种,我之前看到过的帖子
Android Paint Xfermode
可以去看看,这里就不详细说了

在onDraw中判断isPressed 这个是kotlin中的属性,代表了isPressed()方法,
设置 相当于java中的getDrawable().setColorFilter(pressedFilter)
这样就完成了按下状态时的渲染颜色

后续如果有别的需求,比如判断isEnable() 或者 isSelected()
中分别渲染不同的颜色,都是可以做到的

后记

代码很简单,但是其中包含了bitmap的mode,自定义view等相关的知识,也算是抛砖引玉吧
另外建议大家

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容