思路

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. Win10下音频设备无法播放音乐问题定位

    最近一直在调试音频设备,由于音频设备需要在不同的采样率下面转换,所以会经常导致我的win10无法播放和录音. 刚开始在网上搜了相关的知识,但是一直没找到有效的解决方案.后来,无奈之下,使用了微软的声音 ...

  2. Testing - 软件测试知识梳理 - 测试流程

    测试存在于各个阶段: 需求测试--->单元测试--->集成测试--->系统测试--->性能测试--->用户测试--->回归测试 需求测试 完整性&正确性 一 ...

  3. [原创]K8_Delphi源码免杀系列教程

    [原创]K8_Delphi源码免杀系列教程[2014] 虽是2014年的,但免杀思路方法并未过时 比如函数动态调用\代码注释法等至今依然有效 链接:https://pan.baidu.com/s/1H ...

  4. F#周报2019年第17期

    新闻 .NET版本的Apache Spark Apache Spark预览版介绍 F# Apache Spark示例 微软Build 2019大会(5月6日至8日) Rider用于F#的解决方案内的重 ...

  5. SQL 必知必会·笔记<7>汇总数据——使用聚合函数

    有时候我们需要对表中的数据进行汇总,而不需要数据本身,为了方便这些类型的检索,SQL给出了5个聚合函数,SQL聚合函数在各主要的SQL实现中得到了相当一致的支持.如下: 1.1 AVG()函数 AVG ...

  6. kibana从入门到精通-Kibana配置详解

    配置 Kibana Kibana server 启动时从 kibana.yml 文件中读取配置属性.Kibana 默认配置 localhost:5601 .改变主机和端口号,或者连接其他机器上的 El ...

  7. 附实例!实现iframe父窗体与子窗体的通信

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息.同时本 ...

  8. 复制神器Ditto使用方法详细说明

    1.普通的粘贴快捷键设置: 我设置成ctrl+1 --> ctrl+10.但是注意,有些程序里ctrl有特殊功能,这样ctrl+[0-9]键会出现问题,所以建议将粘贴快捷键设置的复杂一点,例如c ...

  9. SpringMVC4+Hibernate5+SQLServer 2014 整合(包括增删改查分页)

    前言 前面整合完了SpringMVC+MyBatis,自然也少不了SpringMVC+Hibernate,严格来说Hibernate才是我们真正想要的ORM框架么.只记得最初学习hibernate时, ...

  10. [转]Angular 2 / 4 / 5 not working in IE11

    本文转自:https://stackoverflow.com/questions/35140718/angular-2-4-5-not-working-in-ie11/47777695#4777769 ...