ImageButton和ImageView设置点击透明区域不响应
程序员文章站
2022-06-11 11:47:46
思路 ImageView和ImageButton都可以设置background和设置src,两者的区别自行度娘。由于两者的不同,获取它们的图片资源的方法也不同。倘若设置的是background,那么需要先getBackground(),然后把获取到的Drawable强制转换为BitmapDrawab ......
思路
imageview和imagebutton都可以设置background和设置src,两者的区别自行度娘。由于两者的不同,获取它们的图片资源的方法也不同。倘若设置的是background,那么需要先getbackground(),然后把获取到的drawable强制转换为bitmapdrawable,就可以获取bitamp,最后判断event的点击坐标是否在bitmap像素范围里。倘若设置的是src,则需要先getdrawable(),后续步骤和上述一致。除上述方法外,还可以先获取getdrawingcache()然后getbitmap(),在此之前需要先设置setdrawingcacheenabled(true),使用完毕后记得setdrawingcacheenabled(false),防止内存泄漏。
方法一
设置的是background的情况下
如果background是一张图片,则在ontouch中添加:
imageview imageview=(imageview)v; bitmapdrawable drawable=(bitmapdrawable)imageview.getbackground(); bitmap bitmap=drawable.getbitmap(); int x=(int) event.getx(); int y=(int)event.gety(); if(x>=bitmap.getwidth()||x<0||y>=bitmap.getheight()||y<0||bitmap.getpixel((x),(y))==0) { log.i("newby", "透明区域"); return true;//透明区域返回true }
如果background是一个selector,则在ontouch中添加:
imageview imageview=(imageview)v; bitmapdrawable drawable=(bitmapdrawable)(imageview.getbackground().getcurrent()); bitmap bitmap=drawable.getbitmap(); int x=(int) event.getx(); int y=(int)event.gety(); if(x>=bitmap.getwidth()||x<0||y>=bitmap.getheight()||y<0||bitmap.getpixel((x),(y))==0) { log.i("newby", "透明区域"); return true;//透明区域返回true }
设置的是src的情况下
把上述代码中的getbackground换成getdrawable即可。
方法二
imageview imageview=(imageview)v; imageview.setdrawingcacheenabled(true); bitmap bitmap=imageview.getdrawingcache(); int x=(int) event.getx(); int y=(int)event.gety(); if(x>=bitmap.getwidth()||x<0||y>=bitmap.getheight()||y<0||bitmap.getpixel((x),(y))==0) { log.i("newby", "透明区域"); return true;//透明区域返回true } //其他代码区域 imageview.setdrawingcacheenabled(false);
补充
经过测试发现,当imageview或imagebutton的大小设置固定值的时候,会出现透明区域点击判断不正确的问题,因此,还需要对获取的图片进行缩放处理
public static bitmap newbitmap(bitmap bm, int width , int height){ int bmwidth = bm.getwidth(); int bmheight = bm.getheight(); float scalewidth = ((float) width) / bmwidth; float scaleheight = ((float) height) / bmheight; matrix matrix = new matrix(); matrix.postscale(scalewidth, scaleheight); bitmap newbm = bitmap.createbitmap(bm, 0, 0,bmwidth, bmheight, matrix, true); return newbm; }
下一篇: 防抖 - 理解,实践与实现