思路

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

ImageButton和ImageView设置点击透明区域不响应的更多相关文章

  1. ImageView设置点击效果没有用?ImageView src的图片大小改变不了?

    ImageView设置点击效果没有用? 解决 1.ImageView xml里面必须clickable 和longClickable为true <ImageView android:layout ...

  2. 如何扩大ImageView的点击区域

    我们在开发中会遇到,给imageview设置点击事件,但是美工切的原始图片一般在24dp左右,这个尺寸点击时会出现不灵敏的情况(点击区域太小). 解决方案: 给imageView设置  scaleTy ...

  3. Android中Button、ImageButton、ImageView背景设置区别

    Button与ImageButton实际两者无关,Button继承自TextView,不支持src;ImageButton继承自ImageView.同一张图片在不设置大小,默认显示时,使用Button ...

  4. android中,如果使用imageButton可以在drawable 中设置一个selector,但是imageView设置不起作用

    android中,如果使用imageButton可以在drawable 中设置一个selector,但是imageView设置不起作用,只要把Imageview的src给去掉就成了,src捕获了bac ...

  5. Button、ImageButton及ImageView详解

    Button.ImageButton及ImageView详解 在应用程序开发过程中,很多时候需要将View的background或者src属性设置为图片,即美观又支持点击等操作.常见的有Button. ...

  6. Android ListView 嵌套 ImageView,如何响应ImageView的点击和长按事件

    http://www.tuicool.com/articles/EZv2Uv 1.先说下嵌套在ListView中的ImageView如何响应点击事件 方法:在imageView中设置onClick属性 ...

  7. Android的界面组件使用之ImageButton和ImageView,ImageSwitcher和GridView

    (一)ImageButton和ImageView ImageButton与Button的功能完全相同,只是ImageButton上显示的是图像,并且每个ImageButton组件都必须指定一个id,以 ...

  8. ImageView设置边框的两种方式

    转载:http://www.2cto.com/kf/201308/239945.html package cc.testimageviewbounds; import android.os.Bundl ...

  9. easyui的datagrid组件,如何设置点击某行不会高亮该行的方式

    easyui的datagrid组件,有些时候我们点击某行不想高亮显示,如何设置点击某行不会高亮该行的方式,有好几种方法可以实现,我举几个,可以根据你具体需求灵活应用: 1.修改easyui的css将高 ...

随机推荐

  1. Liferay7 BPM门户开发之17: Portlet 生命周期

    Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() ...

  2. linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法

    用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是: <dependency> ...

  3. css选择符权重

    css选择符权重 目录 css选择符权重 css选择器权重列表 CSS选择符冲突处理 css选择符权重 css选择器权重列表 选择器 权重 内联样式 1000 ID 0100 CLASS 0010 属 ...

  4. spring security 实践 + 源码分析

    前言 本文将从示例.原理.应用3个方面介绍 spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 Spring Security 是 ...

  5. 模板引擎之-jade

    ##### 首先我们安装jade模板引擎并编译`npm install jade --global`在项目文件夹下创建一个`index.jade`文件,并且写入```doctypehtml head ...

  6. 【Java基本功】一文读懂String及其包装类的实现原理

    String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. S ...

  7. PHP-CPP开发扩展(二)

    PHP-CPP是一个用于开发PHP扩展的C++库.本节讲解PHP输出和函数的实现. 输出和错误 上面的helloworld示例里,我们使用Php::out进行输出,并使用了std::endl换行刷新缓 ...

  8. 通过jenkins API去build一个job

    背景 查看jenkins的api 直接访问 JENKINS_URL/job/JOB_NAME/api/ 就可以查看jenkins的api build一个job的话,是POST请求 JENKINS_UR ...

  9. JavaWeb学习 (十四)————JSP基础语法

    一.JSP模版元素 JSP页面中的HTML内容称之为JSP模版元素.  JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观. 二.JSP表达式 JSP脚本表达式(expression)用于将 ...

  10. python的Web框架,Django模型系统二,模型属性,及数据库进阶查询

    原始数据接上篇文章来操作.可能需要查看后才能懂.点击这里查看 1.常用的模型字段类型 官方文档:https://docs.djangoproject.com/en/2.1/ref/models/fie ...