From 910e865ad3ed5fa115036a85c26c22a6ec1e3ff3 Mon Sep 17 00:00:00 2001 From: RichardLuo <22096448+RichardLuo0@users.noreply.github.com> Date: Sat, 15 Feb 2025 22:52:46 +0800 Subject: [PATCH] fix: black background behind CustomDrawable --- .../globalIconPack/utils/IconHelper.kt | 15 ++++++++++++++- .../utils/UnClipAdaptiveIconDrawable.kt | 18 +++++++++--------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/app/src/main/kotlin/com/richardluo/globalIconPack/utils/IconHelper.kt b/app/src/main/kotlin/com/richardluo/globalIconPack/utils/IconHelper.kt index 6fde659..df1a7d7 100644 --- a/app/src/main/kotlin/com/richardluo/globalIconPack/utils/IconHelper.kt +++ b/app/src/main/kotlin/com/richardluo/globalIconPack/utils/IconHelper.kt @@ -84,9 +84,22 @@ object IconHelper { ) : DrawableWrapper(drawable), Adaptively { private val paint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.DITHER_FLAG or Paint.FILTER_BITMAP_FLAG) + private var bitmap: Bitmap? = null override fun draw(canvas: Canvas) { - drawIcon(canvas, paint, bounds, back, upon, mask) { super.draw(canvas) } + if ( + bitmap == null || + bitmap!!.getWidth() != bounds.width() || + bitmap!!.getHeight() != bounds.height() + ) { + bitmap = Bitmap.createBitmap(bounds.width(), bounds.height(), Bitmap.Config.ARGB_8888) + Canvas(bitmap!!).apply { + translate(-bounds.left.toFloat(), -bounds.top.toFloat()) + drawIcon(this, paint, bounds, back, upon, mask) { super.draw(this) } + } + } + paint.xfermode = null + canvas.drawBitmap(bitmap!!, null, bounds, paint) } } diff --git a/app/src/main/kotlin/com/richardluo/globalIconPack/utils/UnClipAdaptiveIconDrawable.kt b/app/src/main/kotlin/com/richardluo/globalIconPack/utils/UnClipAdaptiveIconDrawable.kt index f9f471d..a2700ed 100644 --- a/app/src/main/kotlin/com/richardluo/globalIconPack/utils/UnClipAdaptiveIconDrawable.kt +++ b/app/src/main/kotlin/com/richardluo/globalIconPack/utils/UnClipAdaptiveIconDrawable.kt @@ -47,17 +47,17 @@ open class UnClipAdaptiveIconDrawable(background: Drawable?, foreground: Drawabl } protected fun draw(canvas: Canvas, path: Path) { - val mLayersBitmap = mLayersBitmapF?.getAs(this) ?: return - val mCanvas = mCanvasF?.getAs(this) ?: return val mPaint = mPaintF?.getAs(this) ?: return - if (mLayersShaderF?.get(this) == null) { + val mLayersShaderF = mLayersShaderF ?: return + if (mLayersShaderF.get(this) == null) { + val mLayersBitmap = mLayersBitmapF?.getAs(this) ?: return + val mCanvas = mCanvasF?.getAs(this) ?: return mCanvas.setBitmap(mLayersBitmap) background?.draw(mCanvas) foreground?.draw(mCanvas) - BitmapShader(mLayersBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP).let { - mLayersShaderF?.set(this, it) - mPaint.setShader(it) - } + val shader = BitmapShader(mLayersBitmap, Shader.TileMode.DECAL, Shader.TileMode.DECAL) + mLayersShaderF.set(this, shader) + mPaint.setShader(shader) } canvas.apply { translate(bounds.left.toFloat(), bounds.top.toFloat()) @@ -66,9 +66,9 @@ open class UnClipAdaptiveIconDrawable(background: Drawable?, foreground: Drawabl } } - protected fun drawClip(canvas: Canvas) = super.draw(canvas) + protected fun drawClip(canvas: Canvas) = getMask()?.let { draw(canvas, it) } - protected fun getMask() = mMaskScaleOnly?.getAs(this) + protected fun getMask() = mMaskScaleOnly?.getAs(this) protected fun getFullBoundsPath() = Path().apply { addRect(getFullBounds(), Path.Direction.CW) }