思路 ImageView和ImageButton都可以設置background和設置src,兩者的區別自行度娘。由於兩者的不同,獲取它們的圖片資源的方法也不同。倘若設置的是background,那麼需要先getBackground(),然後把獲取到的Drawable強制轉換為BitmapDrawab ...
思路
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;
}