/* * Copyright 2014 Mostafa Gazar <eng.mostafa.gazar@gmail.com> * * 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 com.meg7.soas.ui.widget; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.TransitionDrawable; import android.os.Parcelable; import android.util.AttributeSet; import com.android.volley.toolbox.NetworkImageView; import com.meg7.soas.R; /** * Fade-in downloaded image upon download while maintaining the scaleType. * * @author Mostafa Gazar <eng.mostafa.gazar@gmail.com> */ public abstract class BaseFadeInNetworkImageView extends NetworkImageView { public BaseFadeInNetworkImageView(Context context) { super(context); } public BaseFadeInNetworkImageView(Context context, AttributeSet attrs) { super(context, attrs); } public BaseFadeInNetworkImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void setImageBitmap(Bitmap bitmap) { // For configureBounds to be called and quick set. super.setImageBitmap(bitmap); if (bitmap != null) { Resources res = getResources(); Drawable[] layers = new Drawable[2]; // Layer 0. layers[0] = res.getDrawable(R.drawable.default_photo); // Layer 1. // For masking the Bitmap after scale_type is used. layers[1] = new BitmapDrawable(res, clipBitmap(bitmap)); TransitionDrawable transitionDrawable = new TransitionDrawable(layers); transitionDrawable.setCrossFadeEnabled(true); setImageDrawable(transitionDrawable); transitionDrawable.startTransition(400); } } /** * Clipped downloaded Bitmap based on view set radius and scaleType. * * @param bitmap Downloaded Bitmap. * @return Clipped Bitmap. */ protected Bitmap clipBitmap(Bitmap bitmap) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Bitmap clippedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(clippedBitmap); final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, width, height); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); Matrix matrix = getImageMatrix(); float[] values = new float[9]; matrix.getValues(values); float absTransX = Math.abs(values[Matrix.MTRANS_X]) * (1 / values[Matrix.MSCALE_X]); float absTransY = Math.abs(values[Matrix.MTRANS_Y]) * (1 / values[Matrix.MSCALE_Y]); RectF rectF = new RectF(absTransX, absTransY, width - absTransX, height - absTransY); drawClipMask(canvas, rectF, paint); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); canvas.drawBitmap(bitmap, rect, rect, paint); return clippedBitmap; } protected abstract void drawClipMask(Canvas canvas, RectF rectF, Paint paint); }