资讯专栏INFORMATION COLUMN

ImageButton和ImageView设置点击透明区域不响应

wpw / 1224人阅读

摘要:思路和都可以设置和设置,两者的区别自行度娘。方法二透明区域透明区域返回其他代码区域补充经过测试发现,当或的大小设置固定值的时候,会出现透明区域点击判断不正确的问题,因此,还需要对获取的图片进行缩放处理

思路

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.ucloud.cn/yun/2730.html

相关文章

  • Android ViewPager + View 使用及其事件分发一点经验

    摘要:注意这些方法中的类属为的方法已经过时,现在推荐使用。当然,重写所有的事件经试验也是可以的,不过要自己判断是否为点击手势。简单的说,就是当在进行事件分发的时候,只有前一个返回,才会触发后一个。 根据Developer中关于viewPager的描述,ViewPager常和Fragment搭配使用,而其最简单的使用方法,可以直接往里面添加view,甚至是ImageView,做成gallery...

    felix0913 评论0 收藏0
  • Android通知栏介绍与适配总结(上篇)

    摘要:修改记录版本的通知栏消息功能上并未发生变化,右上角的缩减为了。增加了,允许可穿戴设备远程控制通知栏消息。锁屏状态下,可以控制通知栏消息的隐私程度。但是谷歌规定,自定义布局展示的通知栏消息最大高度是。具体适配不正常的机型有。 此文已由作者黎星授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 由于历史原因,Android在发布之初对通知栏Notification的设...

    fai1017 评论0 收藏0
  • Android Material Design系列之FloatingActionButtonSna

    摘要:今天主讲的系列的两个控件都不难,所以一起讲了,分别是和。之所以出现这么久了,不太火,不太常用,估计跟他悬浮有关,容易挡住其他内容。那我们现在就研究改如何在滑动列表时隐藏和显示这个悬浮按钮。其实也非常简单,和修改样式的过程差不多。 今天主讲的Material Design系列的两个控件都不难,所以一起讲了,分别是FloatingActionButton和Snackbar。这个系列都是主讲...

    iKcamp 评论0 收藏0
  • Android Material Design系列之FloatingActionButtonSna

    摘要:今天主讲的系列的两个控件都不难,所以一起讲了,分别是和。之所以出现这么久了,不太火,不太常用,估计跟他悬浮有关,容易挡住其他内容。那我们现在就研究改如何在滑动列表时隐藏和显示这个悬浮按钮。其实也非常简单,和修改样式的过程差不多。 今天主讲的Material Design系列的两个控件都不难,所以一起讲了,分别是FloatingActionButton和Snackbar。这个系列都是主讲...

    LeoHsiun 评论0 收藏0
  • Android Material Design系列之FloatingActionButtonSna

    摘要:今天主讲的系列的两个控件都不难,所以一起讲了,分别是和。之所以出现这么久了,不太火,不太常用,估计跟他悬浮有关,容易挡住其他内容。那我们现在就研究改如何在滑动列表时隐藏和显示这个悬浮按钮。其实也非常简单,和修改样式的过程差不多。 今天主讲的Material Design系列的两个控件都不难,所以一起讲了,分别是FloatingActionButton和Snackbar。这个系列都是主讲...

    shery 评论0 收藏0

发表评论

0条评论

wpw

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<