登录

去注册

登录

注册

去登录

注册

每日一问 | 控件不都是矩形么?遇到多边形,这个怎么绘制,事件分发怎么处理嘞?

xiaoyang   2019-11-08   收藏

大家对于自定义控件应该都比较熟悉了。

我们接触的99%的控件都是矩形,那么假设我们有一个需求:

是又很多不规则的按钮,拼成的整个页面。

  1. 你该如何绘制呢?
  2. 另外如何保证事件分发符合用户预期呢?(一个不规则按钮区域只响应目标按钮)
3

1、大部分情况下,自定义View时利用好Path可以满足绘制不规则的UI的需求(虽然View本身还是矩形的);
2、确定触摸点是否在不规则按钮区域内:

  • 对于利用Path绘制的不规则按钮,可以利用Region类,它可以通过接受一个闭合Path来构造,并提供了坐标点是否在区域内的api。如果在区域内则拦截并响应事件,否则不拦截。
  • 另一种情况,你的不规则按钮可能是美工给的一张图片(图片本身还是矩形的,只不过空白区域是透明的),可以通过拿到BitmapDrawable再拿到Bitmap通过getPixel(x,y)查看该坐标是否有颜色值来确定是否点击到内容区域了。不过坐标点记得根据bitmap的大小和控件大小进行比例缩放
回复
1

我能想到的有几种:
1 使用Path绘画不规则图形,Region定义区域 手指点击到的坐标判断一下Region.contains是不是在Region里面
2 使用svg文件类似地图那种,根据解析的数据进行展示跟点击操作
3 可以使用前端的框架类似展示室内不同房间点击进行展示,安卓这边用H5做展示跟逻辑交互

回复
1

1.问我们如何绘制?(说到不规则按钮我想到的是绘制一个圆角的button)

  • 设置button的background;
  • 然后是自定义View。(推荐)

2.一个不规则按钮区域只响应目标按钮

  • 如果button是分散的没有重叠部分的话,可以使用上面的第一个方法。(项目中也是很多的,按规则排列的按钮你只是想换按钮的样式,显然自定义一个View的代价会更大)
  • 因为99%的控件都是矩形,第一种方法虽然实现了,但他的有效区域还是一个矩形,在某些情况会有重叠,就会产生冲突。为了解决这些冲突问题,我要我们根据一些规则去判断该哪个按钮执行。(ccy01220122 说了两种情况,但我认为第二种情况有很多点都不是很好,如果控件很多那岂不是要加载很多的图片,而且如果出现重复的颜色怎么办)
    (1)我认为可以优化判断颜色的方法,把点击区域先分块(各块中不可以使用相同的颜色,不同块可以使用相同的颜色,分界线上的控件统一归属在一个的块,然后先判断点击区域再判断颜色);
    (2)就是ccy01220122哥说的第一种情况 自定义view,重写onDraw(),Path去绘制不规则控件,利用Region存储Path,根据Region#containss(int,int) 判断点击位置是否在Path围成的区域中,去处理点击事件。
回复
ccy01220122 : @cscxzxzc 

我个人感觉哈: - BitmapDrawable是根据view自己的getBackground获取的,是控件原本就加载了的,我这边只是去获取而已。 - 跟具体颜色值是无关的,仅仅根据是不是透明的来  ...查看更多

1天前 回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定