Android ImageView包含透明区域的图片点击事件处理

博客介绍了如何处理包含透明区域的ImageView点击事件。通过监听Touch事件并判断Bitmap像素值来区分透明和实体部分,同时解决宽高不匹配导致的问题。提供了一段封装后的代码示例,包括Bitmap缩放方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目所需,一个ImageView的图片有透明部分与实体部分,其中透明部分点击无响应 实体部分点击作出对应响应。
实现原理 通过ImageView的Touch事件进行过滤  通过Bitmap的Pixel值 判断是否为透明
而测试发现 imageview 宽高为WrapContent可行 但具体宽高不可行 
查明原因是 touch事件中的bitmap并不与定义的imageview宽高同步 
故 再做bitmap缩放处理 与imageview具体宽高一致 touch事件正常运作
封装后代码贴上:
public class TransView {
    private static Bitmap bitmap;
    private static Bitmap bitmap1;
    public static void setClick(Context context, ImageView iv, View.OnClickListener onClickListener){
        iv.setOnClickListener(onClickListener);
        bitmap = ((BitmapDrawable) (iv.getDrawable())).getBitmap();
        bitmap1 = zoomImg(bitmap,iv.getLayoutParams().width,iv.getLayoutParams().height);

        iv.setOnTouchListener(new View.OnTouchListener()
        {

            @Override
            public boolean onTouch(View arg0, MotionEvent arg1)
            {
                // TODO Auto-generated method stub
                try{
                    if(bitmap1.getPixel((int)(arg1.getX()),((int)arg1.getY()))==0)
                    {
                        //Log.i("Test", "透明区域"+(int)arg1.getX()+"---"+(int)arg1.getY()+"---"+bitmap1.getPixel((int)(arg1.getX()),((int)arg1.getY())));

                        return true;//透明区域返回true
                    }
                    else {
                        //Log.i("Test", "非透明区域"+(int)arg1.getX()+"---"+(int)arg1.getY()+"---"+bitmap1.getPixel((int)(arg1.getX()),((int)arg1.getY())));

                        return false;
                    }
                }catch (Exception e){
                    e.printStackTrace();
                    return false;
                }


            }
        });

    }

    //bitmap 缩放
    public static Bitmap zoomImg(Bitmap bm, int newWidth , int newHeight){
        // 获得图片的宽高
        int width = bm.getWidth();
        int height = bm.getHeight();
        // 计算缩放比例
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // 取得想要缩放的matrix参数
        Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        // 得到新的图片
        Bitmap newbm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
        return newbm;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值