欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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;
    }