博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ImageButton和ImageView设置点击透明区域不响应
阅读量:5340 次
发布时间:2019-06-15

本文共 2284 字,大约阅读时间需要 7 分钟。

思路

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

转载于:https://www.cnblogs.com/newbyblog/p/9698626.html

你可能感兴趣的文章
对闭包的理解
查看>>
练习10-1 使用递归函数计算1到n之和(10 分
查看>>
Oracle MySQL yaSSL 不明细节缓冲区溢出漏洞2
查看>>
windows编程ASCII问题
查看>>
.net webService代理类
查看>>
Code Snippet
查看>>
Node.js Express项目搭建
查看>>
zoj 1232 Adventure of Super Mario
查看>>
1201 网页基础--JavaScript(DOM)
查看>>
组合数学 UVa 11538 Chess Queen
查看>>
oracle job
查看>>
Redis常用命令
查看>>
XML学习笔记(二)-- DTD格式规范
查看>>
IOS开发学习笔记026-UITableView的使用
查看>>
[转载]电脑小绝技
查看>>
windos系统定时执行批处理文件(bat文件)
查看>>
thinkphp如何实现伪静态
查看>>
BZOJ 2243: [SDOI2011]染色( 树链剖分 )
查看>>
BZOJ 1925: [Sdoi2010]地精部落( dp )
查看>>
c++中的string常用函数用法总结!
查看>>