
如果給你一張這樣的圖片,要求你點(diǎn)擊到黑色圓圈時改變點(diǎn)擊的圓圈顏色(選中狀態(tài))
設(shè)計UI會給一套選中圖,尺寸一致,只有選中的圓圈不同
直觀的實(shí)現(xiàn)方案,使用三個透明View,固定在三個圓圈上方位置,點(diǎn)擊時設(shè)置點(diǎn)擊選中的狀態(tài)
弊端就是如果圓圈多了,需要固定多個View,并且如果圓圈位置發(fā)生了改變,每個固定在圓圈上方的View都要跟著修改
優(yōu)化方案實(shí)現(xiàn)
通過 getPixel api拿到 Bitmap 的像素信息,在通過顏色值判斷,你點(diǎn)擊的區(qū)域是否為選中區(qū)域,如果只是改變顏色,比較簡單,都不用選中的狀態(tài)圖片,直接修改圖片的rgb就能實(shí)現(xiàn)
這里做個demo,點(diǎn)擊時判斷區(qū)域,如果是圓圈位置,就彈個toast

mBinding.ivImg.setOnTouchListener { _, event ->
if (event.action == MotionEvent.ACTION_DOWN) {
click(event.x.toInt(), event.y.toInt())
}
true
}
private fun click(x: Int, y: Int) {
resources.getDrawable(R.drawable.ic_test_click_bg, requireContext().theme)?.toBitmap()?.let {
checkClick(it, x, y) {
Toast.makeText(requireContext(), "click", Toast.LENGTH_SHORT).show()
}
}
}
private inline fun checkClick(it: Bitmap, x: Int, y: Int, clickBack: () -> Unit) {
val pixel = it.getPixel(x, y)
Log.d("click", "x $x y $y,pixel $pixel")
if (pixel != 0) {
clickBack.invoke()
}
}
浙公網(wǎng)安備 33010602011771號