Skip to content

Instantly share code, notes, and snippets.

@ookami-kb
Last active August 29, 2015 14:06
Show Gist options
  • Save ookami-kb/5cc6de0ccbad3ace541d to your computer and use it in GitHub Desktop.
Save ookami-kb/5cc6de0ccbad3ace541d to your computer and use it in GitHub Desktop.
ImageButton that accepts drawable as mask. Touch is only processed when touched on black pixel of mask.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MaskedImageButton">
<attr name="maskDrawable" format="reference" />
</declare-styleable>
</resources>
package package_name;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageButton;
import package_name.R;
public class MaskedImageButton extends ImageButton {
private Bitmap mask;
private int slopOffset;
public MaskedImageButton(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MaskedImageButton, 0, 0);
int maskDrawableResource = a.getResourceId(R.styleable.MaskedImageButton_maskDrawable, 0);
if (maskDrawableResource != 0) {
mask = BitmapFactory.decodeResource(getResources(), maskDrawableResource);
}
a.recycle();
slopOffset = ViewConfiguration.get(getContext()).getScaledTouchSlop() + 1;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mask == null) return super.onTouchEvent(event);
int x = (int) event.getX();
int y = (int) event.getY();
if (x < 0 || x >= mask.getWidth() || y < 0 || y >= mask.getHeight())
return super.onTouchEvent(event);
int pixelColor = mask.getPixel(x, y);
if (pixelColor == Color.BLACK)
return super.onTouchEvent(event);
if (event.getAction() == MotionEvent.ACTION_MOVE) {
// simulating we're out of button borders
event.setLocation(-slopOffset, -slopOffset);
return super.onTouchEvent(event);
}
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment