Android不规则按钮实现与问题探讨

s_wenze 2015-03-23 11:33:47
加精
开发中经常会遇到射击师队友提出的不规则按钮的难题,以前遇到别人要做扇形、五角星按钮,自己也遇到过梯形的,图形各异,如果自己去算着实蛋疼。
考虑到一种同一的方法,监听控件的点击的点,并获取其对应的像素点,点击到透明背景(不需要点击的地方)的像素点为0,此时不做操作,若点击像素点不为0为判断为UI有效部分执行点击事件。
之前写了个demo,http://download.csdn.net/download/s715575807/8167623。但是这个demo存在一个问题,直接获取imagebutton的drawable,drawable是原始图片的大小,但是imagebutton大小确是可以变化的比如可以定死width 300dp height 200dp,最后结果是点击的像素点和原始图片的像素点映射不对应。所以要将整个imagebutton转化为bitmap,再来做映射。view转化bitmap的代码如下:
	public  Bitmap getBitmapFromView(View view) {
view.setDrawingCacheEnabled(true);
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false); // clear drawing cache
return b;
}

做了后问题来了,直接传入imagebutton后getDrawingCache为null,如果在imagebutton外面加个RelativeLayout,并带入RelativeLayout能获取bitmap,最后运行期望效果也有了。
问题是为什么会为null或者有没有其他更好的方法
...全文
2207 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
twoconk 2015-07-07
  • 打赏
  • 举报
回复
学习:)
丧尽心 2015-07-07
  • 打赏
  • 举报
回复
mark !!!1
chenzhixie1234 2015-04-03
  • 打赏
  • 举报
回复
学习中,谢谢
d19901217 2015-03-30
  • 打赏
  • 举报
回复
神人啊。。。这办法我怎么没想到
天台的故事 2015-03-29
  • 打赏
  • 举报
回复
这个挺好,留着参考。
所罗门格雷 2015-03-28
  • 打赏
  • 举报
回复
这个挺好,留着参考。
程序员鼓励师 2015-03-28
  • 打赏
  • 举报
回复
看看如何解决
天台的故事 2015-03-26
  • 打赏
  • 举报
回复
http://goobbe.com/questions/1019347/creating-irregular-shaped-imagebutton-with-different-click-states
gqjjqg 2015-03-25
  • 打赏
  • 举报
回复
引用 楼主 s715575807 的回复:
开发中经常会遇到射击师队友提出的不规则按钮的难题,以前遇到别人要做扇形、五角星按钮,自己也遇到过梯形的,图形各异,如果自己去算着实蛋疼。 考虑到一种同一的方法,监听控件的点击的点,并获取其对应的像素点,点击到透明背景(不需要点击的地方)的像素点为0,此时不做操作,若点击像素点不为0为判断为UI有效部分执行点击事件。 之前写了个demo,http://download.csdn.net/download/s715575807/8167623。但是这个demo存在一个问题,直接获取imagebutton的drawable,drawable是原始图片的大小,但是imagebutton大小确是可以变化的比如可以定死width 300dp height 200dp,最后结果是点击的像素点和原始图片的像素点映射不对应。所以要将整个imagebutton转化为bitmap,再来做映射。view转化bitmap的代码如下:
	public  Bitmap getBitmapFromView(View view) {
		view.setDrawingCacheEnabled(true);
		view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
		                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
		view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); 
		view.buildDrawingCache(true);
		Bitmap b = Bitmap.createBitmap(view.getDrawingCache());
		view.setDrawingCacheEnabled(false); // clear drawing cache
	    return b;
	}
做了后问题来了,直接传入imagebutton后getDrawingCache为null,如果在imagebutton外面加个RelativeLayout,并带入RelativeLayout能获取bitmap,最后运行期望效果也有了。 问题是为什么会为null或者有没有其他更好的方法
null的原因可能是 这个还没显示过,没有放入cache,所以获取不到。 供参考。
assky124 2015-03-25
  • 打赏
  • 举报
回复
1.在控件中定义一个Region对象,Region可以填充Path等对象 2.定义初始大小(长,宽) 3.控件大小变更时重新计算Region 4.绘制控件是用Region裁剪绘图区域 5.使用Region.contains 计算触摸点是否在控件区域内 大概思路吧。我觉得应该可行的,具体自己实现下好了,应该也不是很难。
nettman 2015-03-25
  • 打赏
  • 举报
回复
进来学习下
nj_dobetter 2015-03-24
  • 打赏
  • 举报
回复
public Bitmap getBitmapFromView(View view) { View parent = (View)view.getParent(); ... 这样行不?
qq_26845837 2015-03-24
  • 打赏
  • 举报
回复
额 呵呵 我不会告诉你我只是来抢前排的
cattpon 2015-03-24
  • 打赏
  • 举报
回复
不是个区域问题吗?
s_wenze 2015-03-24
  • 打赏
  • 举报
回复
引用 7 楼 nj_dobetter 的回复:
public Bitmap getBitmapFromView(View view) { View parent = (View)view.getParent(); ... 这样行不?
我是直接传入外层的layout的解决的,这样思路测试过是没问题的....问题是为什么不能直接获取imagebutton的bitmap
s_wenze 2015-03-24
  • 打赏
  • 举报
回复
引用 3 楼 heaimnmn 的回复:
每次都是自己手画的
手画太麻烦了吧,不同形状都要定制,感觉还是这个一劳永逸点
line_us 2015-03-23
  • 打赏
  • 举报
回复
路过看看如何解决。
哎,真难 2015-03-23
  • 打赏
  • 举报
回复
每次都是自己手画的
wcnm886 2015-03-23
  • 打赏
  • 举报
回复
学习了,谢谢!

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧