package com.manuelmaly.hn.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BlurMaskFilter; import android.graphics.BlurMaskFilter.Blur; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; import android.util.AttributeSet; import android.view.View; /** * Created by jmaltz on 12/23/13. */ public class SpotlightView extends View { private final float mXStart; private final float mYStart; private final float mXEnd; private final float mYEnd; private final Paint mClearPaint; private final Paint mBackgroundPaint; private final TextPaint mTextPaint; private final Rect mClearRect; Bitmap mBitmap; private StaticLayout mTextLayout; String mText; public SpotlightView( Context ctx, AttributeSet attrs ) { this( ctx, attrs, 0, 0, 0, 0, "" ); } public SpotlightView( Context ctx, AttributeSet attrs, float xStart, float yStart, float xEnd, float yEnd, String text ) { super( ctx, attrs ); mXStart = xStart; mYStart = yStart; mXEnd = xEnd; mYEnd = yEnd; mClearPaint = new Paint(); mClearPaint.setColor( Color.TRANSPARENT ); mClearPaint.setAntiAlias( true ); mClearPaint.setXfermode( new PorterDuffXfermode( PorterDuff.Mode.CLEAR ) ); mClearPaint.setMaskFilter( new BlurMaskFilter( 2 * getResources().getDisplayMetrics().density, Blur.NORMAL ) ); mTextPaint = new TextPaint( Paint.ANTI_ALIAS_FLAG ); mTextPaint.setColor( Color.WHITE ); mTextPaint.setTextSize( (float) (getResources().getDisplayMetrics().density * 20 + .5) ); mTextPaint.setShadowLayer( 1.5f, 1, 1, Color.BLACK ); mBackgroundPaint = new Paint(); mBackgroundPaint.setColor( Color.BLACK ); mBackgroundPaint.setAlpha( 200 ); mClearRect = new Rect( (int) mXStart, (int) mYEnd, (int) mXEnd, (int) mYStart ); mText = text; } @Override public void onDraw( Canvas canvas ) { canvas.drawBitmap( mBitmap, 0, 0, null ); } @Override public void onSizeChanged( int w, int h, int oldw, int oldh ) { float density = getResources().getDisplayMetrics().density; mTextLayout = new StaticLayout( mText, mTextPaint, w - (int) (density * 20 + .5), Layout.Alignment.ALIGN_CENTER, 1, 0, false ); mBitmap = Bitmap.createBitmap( w, h, Bitmap.Config.ARGB_8888 ); Canvas canvas = new Canvas( mBitmap ); canvas.drawRect( new Rect( 0, 0, w, h ), mBackgroundPaint ); canvas.drawRect( mClearRect, mClearPaint ); canvas.translate( 0, mYEnd + (int) (density * 10 + .5) ); mTextLayout.draw( canvas ); } }