package com.sqisland.android.graphics_demo; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.ColorFilter; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import com.sqisland.android.graphics_demo.util.ImageUtil; import java.util.ArrayList; import java.util.List; public class PorterDuffActivity extends SpinnerImageActivity { protected List<Option> getOptions(Bitmap original) { Bitmap mask = ImageUtil.createCircle(original.getWidth(), original.getHeight()); ArrayList<Option> options = new ArrayList<Option>(); options.add(new Option(getString(R.string.original), original)); options.add(new Option(getString(R.string.mask), mask)); options.add(new Option(getString(R.string.circle_dim_around), circleDimAround(original, mask))); for (PorterDuff.Mode mode : PorterDuff.Mode.values()) { options.add(new Option(mode.toString(), drawWithPorterDuff(original, mask, mode))); } return options; } protected int getInitialSelection(int size) { return 2; } private Bitmap drawWithPorterDuff(Bitmap original, Bitmap mask, PorterDuff.Mode mode) { Bitmap bitmap = Bitmap.createBitmap( original.getWidth(), original.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); // Draw the original bitmap (DST) canvas.drawBitmap(original, 0, 0, null); // Draw the mask (SRC) with the specified Porter-Duff mode Paint maskPaint = new Paint(); maskPaint.setXfermode(new PorterDuffXfermode(mode)); canvas.drawBitmap(mask, 0, 0, maskPaint); return bitmap; } private Bitmap circleDimAround(Bitmap original, Bitmap mask) { Bitmap bitmap = Bitmap.createBitmap( original.getWidth(), original.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); // Draw the original bitmap canvas.drawBitmap(original, 0, 0, null); // DST_IN = Whatever was there, keep the part that overlaps with what I'm drawing now Paint maskPaint = new Paint(); maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); canvas.drawBitmap(mask, 0, 0, maskPaint); // DST_OVER = Whatever was there, put it over what I'm drawing now Paint overPaint = new Paint(); overPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER)); overPaint.setColorFilter(createDimFilter()); canvas.drawBitmap(original, 0, 0, overPaint); return bitmap; } private ColorFilter createDimFilter() { ColorMatrix colorMatrix = new ColorMatrix(); colorMatrix.setSaturation(0f); float scale = 0.5f; colorMatrix.setScale(scale, scale, scale, 1f); return new ColorMatrixColorFilter(colorMatrix); } }