android 一张图片实现 ImageView 实现 点击效果 图片明度变化

一般实现点击效果我们都是使用drawable下的selector来实现,这样UI会给我们两张图,一张normal的,一张press的,我们实现起来很简单。但这样增加了我们编译出来的Apk体积,一张图可以实现的效果,用两张图。UI在做按下效果图的时候其实也是对原图上进行明度,透明度等变化,我们自己程序内部其实就可以对原图在按下的时候进行处理做到。

我们自定义一个ReplaceSelectorImageView 继承自AppCompatImageView
然后我们重写一下里面的点击事件,在图片按下的时候改变明度为0.9,抬起的时候
恢复 到原图,也就是1。
ColorMatrix 可以对图片进行一些处理,这里就对图片明度变化进行操作。通过
setScale来改变明度 ,对图片的一些处理只能对ImageView的Src图片有作用,对背景是没有作用的。

两个主要的方法:

override fun onTouchEvent(event: MotionEvent?): Boolean {
        super.onTouchEvent(event)
        when (event!!.action) {
            MotionEvent.ACTION_DOWN -> {
                changeLight(0.9f)
            }
            MotionEvent.ACTION_UP -> {
                changeLight(1f)
            }
        }
        return true
    }
     //改变图片的亮度方法 1--原样  >1---调亮  <1---调暗  0-2
    private fun changeLight(brightness: Float) {
        val brightnessMatrix = ColorMatrix()
        brightnessMatrix.setScale(brightness, brightness, brightness, 1f)
        colorFilter = ColorMatrixColorFilter(brightnessMatrix)
    }

附上源码:

/**
 * Created  on 2019/1/7
 * Function 为了替换ImageView 的Selector
 * 因为图片的selector 把两张图片全部加载到内存中,大图片会导致内存占用较高
 * 用代码 动态改变图片显示 减少内存占用
 */
class ReplaceSelectorImageView : AppCompatImageView {


    private var norResId = 0

    constructor(context: Context) : this(context, null, 0)

    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0)

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        val typeArray = context.obtainStyledAttributes(attrs, R.styleable.ReplaceSelectorImageView)
        norResId = typeArray.getResourceId(R.styleable.ReplaceSelectorImageView_norBackGround, 0)
        typeArray.recycle()
        if (norResId != 0) {
            //改变图片颜色值 只有Src有用
            setImageResource(norResId)
        }
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        super.onTouchEvent(event)
        when (event!!.action) {
            MotionEvent.ACTION_DOWN -> {
                changeLight(0.9f)
            }
            MotionEvent.ACTION_UP -> {
                changeLight(1f)
            }
        }
        return true
    }

    //改变图片的亮度方法 1--原样  >1---调亮  <1---调暗  0-2
    private fun changeLight(brightness: Float) {
        val brightnessMatrix = ColorMatrix()
        brightnessMatrix.setScale(brightness, brightness, brightness, 1f)
        colorFilter = ColorMatrixColorFilter(brightnessMatrix)
    }

}

styles


    <declare-styleable name="ReplaceSelectorImageView">
        <attr name="norBackGround" format="reference"/>
        <attr name="pressBackGround" format="reference"/>
    </declare-styleable>

用法

  <com.ReplaceSelectorImageView
        android:id="@+id/id_iv_english"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:norBackGround="@drawable/home_icon_english_nor"
   />

以上就是用ImageVIew实现按下效果的全部代码了,希望对你有所帮助。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值