From 46d5d4d72f0cde405ca6c368387bd3148ee1db63 Mon Sep 17 00:00:00 2001 From: start141 <415043846@qq.com> Date: Mon, 14 Sep 2015 16:49:58 +0800 Subject: [PATCH 1/2] Add Transformation Add MaskTransformation and NinePatchMaskTransformation. --- .../wasabeef/example/glide/MainActivity.java | 2 + .../wasabeef/example/glide/MainAdapter.java | 28 ++++- .../res/drawable-xxhdpi/chat_me_mask.9.png | Bin 0 -> 1972 bytes .../src/main/res/drawable-xxhdpi/mask210.png | Bin 0 -> 19153 bytes .../transformations/MaskTransformation.java | 87 ++++++++++++++++ .../NinePatchMaskTransformation.java | 96 ++++++++++++++++++ 6 files changed, 212 insertions(+), 1 deletion(-) create mode 100644 example/src/main/res/drawable-xxhdpi/chat_me_mask.9.png create mode 100644 example/src/main/res/drawable-xxhdpi/mask210.png create mode 100644 transformations/src/main/java/jp/wasabeef/glide/transformations/MaskTransformation.java create mode 100644 transformations/src/main/java/jp/wasabeef/glide/transformations/NinePatchMaskTransformation.java diff --git a/example/src/main/java/jp/wasabeef/example/glide/MainActivity.java b/example/src/main/java/jp/wasabeef/example/glide/MainActivity.java index 20074c6..7819568 100644 --- a/example/src/main/java/jp/wasabeef/example/glide/MainActivity.java +++ b/example/src/main/java/jp/wasabeef/example/glide/MainActivity.java @@ -18,6 +18,8 @@ public class MainActivity extends AppCompatActivity { recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); List dataSet = new ArrayList<>(); + dataSet.add(Type.Mask); + dataSet.add(Type.NinePatchMask); dataSet.add(Type.CropTop); dataSet.add(Type.CropCenter); dataSet.add(Type.CropBottom); diff --git a/example/src/main/java/jp/wasabeef/example/glide/MainAdapter.java b/example/src/main/java/jp/wasabeef/example/glide/MainAdapter.java index 86df8ab..dc7b9ee 100644 --- a/example/src/main/java/jp/wasabeef/example/glide/MainAdapter.java +++ b/example/src/main/java/jp/wasabeef/example/glide/MainAdapter.java @@ -9,15 +9,21 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; + import com.bumptech.glide.Glide; import com.bumptech.glide.load.Transformation; +import com.bumptech.glide.load.resource.bitmap.CenterCrop; + import java.util.List; + import jp.wasabeef.glide.transformations.BlurTransformation; import jp.wasabeef.glide.transformations.ColorFilterTransformation; import jp.wasabeef.glide.transformations.CropCircleTransformation; import jp.wasabeef.glide.transformations.CropSquareTransformation; import jp.wasabeef.glide.transformations.CropTransformation; import jp.wasabeef.glide.transformations.GrayscaleTransformation; +import jp.wasabeef.glide.transformations.MaskTransformation; +import jp.wasabeef.glide.transformations.NinePatchMaskTransformation; import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import jp.wasabeef.glide.transformations.gpu.BrightnessFilterTransformation; import jp.wasabeef.glide.transformations.gpu.ContrastFilterTransformation; @@ -39,6 +45,8 @@ public class MainAdapter extends RecyclerView.Adapter { private List mDataSet; enum Type { + Mask, + NinePatchMask, CropTop, CropCenter, CropBottom, @@ -73,6 +81,22 @@ public class MainAdapter extends RecyclerView.Adapter { @Override public void onBindViewHolder(MainAdapter.ViewHolder holder, int position) { Transformation transformation = null; switch (mDataSet.get(position)) { + case Mask: + transformation = new MaskTransformation(mContext, R.drawable.mask210); + Glide.with(mContext) + .load(R.drawable.demo) + .override(210, 210) + .bitmapTransform(new CenterCrop(mContext), transformation) + .into(holder.image); + break; + case NinePatchMask: + transformation = new NinePatchMaskTransformation(mContext, R.drawable.chat_me_mask, 300, 300); + Glide.with(mContext) + .load(R.drawable.demo) + .override(300, 300) + .bitmapTransform(new CenterCrop(mContext), transformation) + .into(holder.image); + break; case CropTop: transformation = new CropTransformation(mContext, 300, 100, CropTransformation.CropType.TOP); @@ -136,7 +160,9 @@ public class MainAdapter extends RecyclerView.Adapter { break; } - Glide.with(mContext).load(R.drawable.demo).bitmapTransform(transformation).into(holder.image); + if (mDataSet.get(position) != Type.Mask && mDataSet.get(position) != Type.NinePatchMask) { + Glide.with(mContext).load(R.drawable.demo).bitmapTransform(transformation).into(holder.image); + } holder.title.setText(mDataSet.get(position).name()); } diff --git a/example/src/main/res/drawable-xxhdpi/chat_me_mask.9.png b/example/src/main/res/drawable-xxhdpi/chat_me_mask.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b2390856093952a501d92ad3d1d2aaf03eed0b GIT binary patch literal 1972 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 { + + private Context mContext; + private BitmapPool mBitmapPool; + private int mMaskId; + + public MaskTransformation(Context context, int maskId) { + mBitmapPool = Glide.get(context).getBitmapPool(); + mContext = context; + mMaskId = maskId; + } + + @Override + public Resource transform(Resource resource, int outWidth, int outHeight) { + Bitmap source = resource.get(); + + Bitmap mask = mBitmapPool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); + if (mask == null) { + mask = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); + } + + Drawable drawable; + if (Build.VERSION.SDK_INT >= 21) { + drawable = mContext.getDrawable(mMaskId); + } else { + drawable = mContext.getResources().getDrawable(mMaskId); + } + drawable.setBounds(0, 0, source.getWidth(), source.getHeight()); + Canvas canvas = new Canvas(mask); + drawable.draw(canvas); + + Bitmap bitmap = mBitmapPool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); + if (bitmap == null) { + bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); + } + + Paint paint = new Paint(); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); + + canvas = new Canvas(bitmap); + canvas.drawBitmap(mask, new Rect(0, 0, mask.getWidth(), mask.getHeight()), new Rect(0, 0, + source.getWidth(), source.getHeight()), null); + canvas.drawBitmap(source, 0, 0, paint); + + return BitmapResource.obtain(bitmap, mBitmapPool); + } + + @Override + public String getId() { + return "MaskTransformation(maskId=" + mMaskId + ")"; + } + +} diff --git a/transformations/src/main/java/jp/wasabeef/glide/transformations/NinePatchMaskTransformation.java b/transformations/src/main/java/jp/wasabeef/glide/transformations/NinePatchMaskTransformation.java new file mode 100644 index 0000000..52d99e5 --- /dev/null +++ b/transformations/src/main/java/jp/wasabeef/glide/transformations/NinePatchMaskTransformation.java @@ -0,0 +1,96 @@ +package jp.wasabeef.glide.transformations; + +/** + * Copyright (C) 2015 Wasabeef + * + * 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. + */ + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.os.Build; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.Transformation; +import com.bumptech.glide.load.engine.Resource; +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; +import com.bumptech.glide.load.resource.bitmap.BitmapResource; +import com.bumptech.glide.request.target.Target; + +public class NinePatchMaskTransformation implements Transformation { + + private Context mContext; + private BitmapPool mBitmapPool; + private int mMaskId; + private int mWidth; + private int mHeight; + + public NinePatchMaskTransformation(Context context, int maskId, int width, int height) { + mBitmapPool = Glide.get(context).getBitmapPool(); + mContext = context; + mMaskId = maskId; + mWidth = width; + mHeight = height; + } + + @Override + public Resource transform(Resource resource, int outWidth, int outHeight) { + Bitmap source = resource.get(); + + int width = outWidth == Target.SIZE_ORIGINAL ? source.getWidth() : outWidth; + int height = outHeight == Target.SIZE_ORIGINAL ? source.getHeight() : outHeight; + + Bitmap mask = mBitmapPool.get(width, height, Bitmap.Config.ARGB_8888); + if (mask == null) { + mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + } + + Drawable drawable; + if (Build.VERSION.SDK_INT >= 21) { + drawable = mContext.getDrawable(mMaskId); + } else { + drawable = mContext.getResources().getDrawable(mMaskId); + } + drawable.setBounds(0, 0, width, height); + Canvas canvas = new Canvas(mask); + drawable.draw(canvas); + + Bitmap bitmap = mBitmapPool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); + if (bitmap == null) { + bitmap = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); + } + + Paint paint = new Paint(); + paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); + + canvas = new Canvas(bitmap); + canvas.drawBitmap(mask, new Rect(0, 0, mask.getWidth(), mask.getHeight()), new Rect(0, 0, + source.getWidth(), source.getHeight()), null); + canvas.drawBitmap(source, 0, 0, paint); + + return BitmapResource.obtain(bitmap, mBitmapPool); + } + + @Override + public String getId() { + return "NinePatchMaskTransformation(mMaskId=" + mMaskId + + ", width=" + mWidth + ", height=" + mHeight + ")"; + } + +} From 831f038d29190c2d29243522058bf6951b7e2202 Mon Sep 17 00:00:00 2001 From: start141 <415043846@qq.com> Date: Mon, 14 Sep 2015 19:56:51 +0800 Subject: [PATCH 2/2] Put the mask bitmap to the BitmapPool put the mask bitmap to the BitmapPool when the mask is get from the BitmapPool. --- .../wasabeef/glide/transformations/MaskTransformation.java | 6 ++++++ .../glide/transformations/NinePatchMaskTransformation.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/transformations/src/main/java/jp/wasabeef/glide/transformations/MaskTransformation.java b/transformations/src/main/java/jp/wasabeef/glide/transformations/MaskTransformation.java index 29b19eb..00eb5e6 100644 --- a/transformations/src/main/java/jp/wasabeef/glide/transformations/MaskTransformation.java +++ b/transformations/src/main/java/jp/wasabeef/glide/transformations/MaskTransformation.java @@ -48,8 +48,10 @@ public class MaskTransformation implements Transformation { public Resource transform(Resource resource, int outWidth, int outHeight) { Bitmap source = resource.get(); + boolean maskFromBitmapPool = true; Bitmap mask = mBitmapPool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); if (mask == null) { + maskFromBitmapPool = false; mask = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888); } @@ -76,6 +78,10 @@ public class MaskTransformation implements Transformation { source.getWidth(), source.getHeight()), null); canvas.drawBitmap(source, 0, 0, paint); + if (maskFromBitmapPool) { + mBitmapPool.put(mask); + } + return BitmapResource.obtain(bitmap, mBitmapPool); } diff --git a/transformations/src/main/java/jp/wasabeef/glide/transformations/NinePatchMaskTransformation.java b/transformations/src/main/java/jp/wasabeef/glide/transformations/NinePatchMaskTransformation.java index 52d99e5..b7d3b53 100644 --- a/transformations/src/main/java/jp/wasabeef/glide/transformations/NinePatchMaskTransformation.java +++ b/transformations/src/main/java/jp/wasabeef/glide/transformations/NinePatchMaskTransformation.java @@ -56,8 +56,10 @@ public class NinePatchMaskTransformation implements Transformation { int width = outWidth == Target.SIZE_ORIGINAL ? source.getWidth() : outWidth; int height = outHeight == Target.SIZE_ORIGINAL ? source.getHeight() : outHeight; + boolean maskFromBitmapPool = true; Bitmap mask = mBitmapPool.get(width, height, Bitmap.Config.ARGB_8888); if (mask == null) { + maskFromBitmapPool = false; mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); } @@ -84,6 +86,10 @@ public class NinePatchMaskTransformation implements Transformation { source.getWidth(), source.getHeight()), null); canvas.drawBitmap(source, 0, 0, paint); + if (maskFromBitmapPool) { + mBitmapPool.put(mask); + } + return BitmapResource.obtain(bitmap, mBitmapPool); }