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

 
  
项目所需,一个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;
    }
}

你可能感兴趣的:(项目)