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