美文网首页
Android自定义ImageView,渲染点击色

Android自定义ImageView,渲染点击色

作者: 做人要简单 | 来源:发表于2017-08-08 17:13 被阅读161次

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等相关的知识,也算是抛砖引玉吧
另外建议大家

相关文章

网友评论

      本文标题:Android自定义ImageView,渲染点击色

      本文链接:https://www.haomeiwen.com/subject/vdztrxtx.html