图片点击之穿透点击

原创 2016年08月29日 14:14:59
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.Drawable.ConstantState;
import android.graphics.drawable.DrawableContainer.DrawableContainerState;
import android.graphics.drawable.StateListDrawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;

public class TriangleButton extends Button {

    private Bitmap mBitmap;

    public TriangleButton(Context context) {
        this(context, null);
    }

    public TriangleButton(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TriangleButton(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (mBitmap == null) {
                mBitmap = getBackgroundBitmap();
            }
            if (mBitmap == null) {
                return super.dispatchTouchEvent(event);
            }
            try {
                int pixel = mBitmap.getPixel((int) event.getX(), (int) event.getY());
                if (pixel == 0) {
                    return false;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return super.dispatchTouchEvent(event);
    }

    private Bitmap getBackgroundBitmap() {
        Drawable drawable = getBackground();
        if (drawable == null) {
            return null;
        }

        if (drawable instanceof BitmapDrawable) {
            return ((BitmapDrawable) drawable).getBitmap();
        }

        if (drawable instanceof StateListDrawable) {
            StateListDrawable stateListDrawable = (StateListDrawable) drawable;
            ConstantState constantState = stateListDrawable.getConstantState();
            if (constantState instanceof DrawableContainerState) {
                DrawableContainerState drwblContainerState = (DrawableContainerState) constantState;
                Drawable[] drawables = drwblContainerState.getChildren();
                if (drawables == null || drawables.length < 1) {
                    return null;
                }
                for (Drawable drwbl : drawables) {
                    if (drwbl instanceof BitmapDrawable) {
                        return ((BitmapDrawable) drwbl).getBitmap();
                    }
                }
            }
        }

        return null;
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

移动端H5,Hybird开发点击穿透事件处理

What 现象描述: 页面中存在上下两个层,上层元素具有表单,链接或者绑定相应事件,上层元素点击或触摸,导致上层DOM改变,下层中同样位置的 元素触发点击事件。这种现象就是点击穿透(Ghost Cl...

点击穿透

What? -> Events!Why?How to fix? 说在前面的话:点击穿透这种现象算是移动H5开发比较经典的问题,也常用来做面试题。借此现象谈谈移动事件。 What 现象描述...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

穿透图片响应下层image事件

在做绚丽的界面的时候经常会用到不规则的图片,而我们美工给的图片一般都是方形的图片,在不规则的图形背后还有透明的部分。然而如果我们都使用整体的图片的话,很多图片就会出现交叉的部分,再比如我们如果给每一个...

iOS 点击图片放大效果

今天带来的是图片点击放大效果,这种效果一般在微博,微信朋友圈中比较常见 当我点击其中一张图片时,就会进入详情 具体实现如下 首先创建个 Controller(PhotoViewContro...

Android Image点击效果

之前一篇博客Android 各种按钮点击效果以及兼容性问题总结中写了提到了一个关于安卓中实现图片点击效果的方法,不过一直感觉那个方法有点LOW,最近看了几个官方的例子,找到了个比较好的图片点击高亮的方...

Unity 解决点击 UI 穿透问题

最近在学习的过程中遇到一个问题,那就是当有 ui 时如果你点击 ui,这时如果鼠标下面还有一些3d物体也有点击效果,这时候也会触发。这是一位点击的时候,鼠标“穿透”了。,但我们是不想要这种效果发生的。...

Fragment 点击穿透 解决办法

在做项目,用activity+fragment 填充视图时, 发现有些Fragment会存在点击穿透效果(就是底层的Fragment可以响应上层的触摸以及点击事件) 但是当填充的Fragment的...

解决Fragment内点击穿透问题

问题描述: 从A fragment跳转到B fragment ,为了返回时不从新加载A fragment内容,通常使用add方法来将a添加到后退栈. 但是这样会出现一个小问题: 在B Fragm...

点击按钮事件穿透

描述: 左侧div,down按钮;右侧遮罩div,up按钮 目标: 当点击up按钮的时候,可以进行响应; 当点击down按钮的时候,可以进行响应; 点击其他部分,不做响应思路1:pointe...

关于fragment点击能穿透问题

本人在做项目的过程中遇到的这个问题,然后就在网上百度了一下,之后也是在csdn上看到博友发过此类问题的解决办法,所以特此重新总结一下,顺便也给自己提个醒,避免出现此类问题。好!下面我们说一下问题: ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)