Java tutorial
/* * Copyright 2014 Alex Curran * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package neu.showcaseview; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.drawable.Drawable; import android.support.v4.content.res.ResourcesCompat; class StandardShowcaseDrawer implements ShowcaseDrawer { protected final Paint eraserPaint; protected final Drawable showcaseDrawable; private final Paint basicPaint; private final float showcaseRadius; private float factor; protected int backgroundColour; public StandardShowcaseDrawer(Resources resources, Resources.Theme theme, float factor) { PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY); eraserPaint = new Paint(); eraserPaint.setColor(0xFFFFFF); eraserPaint.setAlpha(0); eraserPaint.setXfermode(xfermode); eraserPaint.setAntiAlias(true); basicPaint = new Paint(); this.factor = factor; showcaseRadius = resources.getDimension(R.dimen.showcase_radius) * factor; showcaseDrawable = ResourcesCompat.getDrawable(resources, R.drawable.cling_bleached, theme); } @Override public void setShowcaseColour(int color) { showcaseDrawable.setColorFilter(color, PorterDuff.Mode.MULTIPLY); } @Override public void drawShowcase(Bitmap buffer, float x, float y, float scaleMultiplier) { Canvas bufferCanvas = new Canvas(buffer); bufferCanvas.drawCircle(x, y, showcaseRadius, eraserPaint); int halfW = getShowcaseWidth() / 2; int halfH = getShowcaseHeight() / 2; int left = (int) (x - halfW); int top = (int) (y - halfH); showcaseDrawable.setBounds(left, top, left + getShowcaseWidth(), top + getShowcaseHeight()); showcaseDrawable.draw(bufferCanvas); } @Override public int getShowcaseWidth() { return (int) (showcaseDrawable.getIntrinsicWidth() * factor); } @Override public int getShowcaseHeight() { return (int) (showcaseDrawable.getIntrinsicHeight() * factor); } @Override public float getBlockedRadius() { return showcaseRadius; } @Override public void setBackgroundColour(int backgroundColor) { this.backgroundColour = backgroundColor; } @Override public void erase(Bitmap bitmapBuffer) { bitmapBuffer.eraseColor(backgroundColour); } @Override public void drawToCanvas(Canvas canvas, Bitmap bitmapBuffer) { canvas.drawBitmap(bitmapBuffer, 0, 0, basicPaint); } }