一般实现点击效果我们都是使用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实现按下效果的全部代码了,希望对你有所帮助。