惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

I
InfoQ
博客园 - 司徒正美
爱范儿
爱范儿
F
Fortinet All Blogs
J
Java Code Geeks
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
S
SegmentFault 最新的问题
Microsoft Security Blog
Microsoft Security Blog
T
The Blog of Author Tim Ferriss
V
V2EX
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
云风的 BLOG
云风的 BLOG
T
Tailwind CSS Blog
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
A
About on SuperTechFans
有赞技术团队
有赞技术团队
Y
Y Combinator Blog

博客园 - 翻滚的咸鱼

Ops权限行为记录源码解析 TaskView方案框架原理 视频解码器问题 常用命令 扫光动效 引导记录 性能优化 View共享动效 常用脚本文件 Launcher 卡片框架多模块集成 Launcher 桌面源码笔记二 Launcher 桌面源码笔记一 氛围灯动态屏保取色方案二 氛围灯动态屏保取色方案一 自定义最近任务管理器 anr问题 TV RecyclerView 焦点处理笔记 多类型适配器 多屏下字体自动取色 阻尼拉伸方案 RecyclerView设置默认焦点跟多页面焦点抢占 TV RecyclerView 滑动后操作保持落焦在左侧第一个View Fragment翻盖动效 当个View下,使用Drawable入场退场动画
图片区域点击处理
翻滚的咸鱼 · 2024-10-27 · via 博客园 - 翻滚的咸鱼

如果给你一张这样的图片,要求你点击到黑色圆圈时改变点击的圆圈颜色(选中状态)
设计UI会给一套选中图,尺寸一致,只有选中的圆圈不同
直观的实现方案,使用三个透明View,固定在三个圆圈上方位置,点击时设置点击选中的状态
弊端就是如果圆圈多了,需要固定多个View,并且如果圆圈位置发生了改变,每个固定在圆圈上方的View都要跟着修改

优化方案实现
通过 getPixel api拿到 Bitmap 的像素信息,在通过颜色值判断,你点击的区域是否为选中区域,如果只是改变颜色,比较简单,都不用选中的状态图片,直接修改图片的rgb就能实现
这里做个demo,点击时判断区域,如果是圆圈位置,就弹个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()
        }
    }