package com.sqisland.android.graphics_demo.widget; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Shader; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.ImageView; import com.sqisland.android.graphics_demo.R; // Inspired by http://www.curious-creature.org/2012/12/13/android-recipe-2-fun-with-shaders/ public class PeekThroughImageView extends ImageView { private final float radius; private Paint paint = null; private float x; private float y; private boolean shouldDrawOpening = false; public PeekThroughImageView(Context context) { super(context); radius = context.getResources().getDimensionPixelSize(R.dimen.peek_through_radius); } public PeekThroughImageView(Context context, AttributeSet attrs) { super(context, attrs); radius = context.getResources().getDimensionPixelSize(R.dimen.peek_through_radius); } public PeekThroughImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); radius = context.getResources().getDimensionPixelSize(R.dimen.peek_through_radius); } @Override public boolean onTouchEvent(MotionEvent motionEvent) { int action = motionEvent.getAction(); shouldDrawOpening = (action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE); x = motionEvent.getX(); y = motionEvent.getY(); invalidate(); return true; } @Override protected void onDraw(Canvas canvas) { if (paint == null) { Bitmap original = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas originalCanvas = new Canvas(original); super.onDraw(originalCanvas); Shader shader = new BitmapShader(original, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); paint = new Paint(); paint.setShader(shader); } canvas.drawColor(Color.GRAY); if (shouldDrawOpening) { canvas.drawCircle(x, y - radius, radius, paint); } } }