From 44ac7d25408d2b3ada77267895b376cd09398184 Mon Sep 17 00:00:00 2001 From: Himanshu Singh Date: Wed, 7 Oct 2020 20:39:48 +0530 Subject: [PATCH] Added StickerView Text --- .../java/com/gappein/sample/MainActivity.kt | 12 +-- app/src/main/res/layout/activity_main.xml | 5 +- .../sticker/ExampleInstrumentedTest.kt | 24 ------ sticker/src/main/AndroidManifest.xml | 5 +- .../src/main/java/com/gappein/StickerView.kt | 79 +++++++++++++++++++ .../java/com/gappein/sticker/Generator.kt | 43 ---------- .../gappein/sticker/model/DrawaingValues.kt | 76 ------------------ .../com/gappein/sticker/model/TextValues.kt | 16 ---- .../java/com/gappein/util/ColorExtension.kt | 10 +++ .../java/com/gappein/util/StickerExtension.kt | 20 +++++ .../com/gappein/sticker/ExampleUnitTest.kt | 17 ---- 11 files changed, 119 insertions(+), 188 deletions(-) delete mode 100644 sticker/src/androidTest/java/com/gappein/sticker/ExampleInstrumentedTest.kt create mode 100644 sticker/src/main/java/com/gappein/StickerView.kt delete mode 100644 sticker/src/main/java/com/gappein/sticker/Generator.kt delete mode 100644 sticker/src/main/java/com/gappein/sticker/model/DrawaingValues.kt delete mode 100644 sticker/src/main/java/com/gappein/sticker/model/TextValues.kt create mode 100644 sticker/src/main/java/com/gappein/util/ColorExtension.kt create mode 100644 sticker/src/main/java/com/gappein/util/StickerExtension.kt delete mode 100644 sticker/src/test/java/com/gappein/sticker/ExampleUnitTest.kt diff --git a/app/src/main/java/com/gappein/sample/MainActivity.kt b/app/src/main/java/com/gappein/sample/MainActivity.kt index dd8bfea..4020b1e 100644 --- a/app/src/main/java/com/gappein/sample/MainActivity.kt +++ b/app/src/main/java/com/gappein/sample/MainActivity.kt @@ -1,18 +1,18 @@ package com.gappein.sample import android.graphics.Color -import androidx.appcompat.app.AppCompatActivity import android.os.Bundle -import com.gappein.sticker.Generator -import com.gappein.sticker.model.TextValues +import androidx.appcompat.app.AppCompatActivity +import com.gappein.StickerView +import com.gappein.util.generateSticker import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + val x = StickerView(this) + x.updateText("dsfsdfsdf") setContentView(R.layout.activity_main) - - val x = Generator(this).setText(TextValues(text = "hey Himanshuhey Himan")).draw() - background.setImageBitmap(x) + background.setImageBitmap(x.generateSticker()) } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 3eca239..03a8762 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,8 +7,9 @@ tools:context=".MainActivity"> - - / - \ No newline at end of file + package="com.gappein" /> \ No newline at end of file diff --git a/sticker/src/main/java/com/gappein/StickerView.kt b/sticker/src/main/java/com/gappein/StickerView.kt new file mode 100644 index 0000000..c04c6f8 --- /dev/null +++ b/sticker/src/main/java/com/gappein/StickerView.kt @@ -0,0 +1,79 @@ +package com.gappein + +import android.content.Context +import android.content.res.ColorStateList +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import androidx.appcompat.widget.AppCompatTextView +import androidx.core.content.res.ResourcesCompat +import com.gappein.sticker.util.generateColor + +class StickerView(context: Context) : AppCompatTextView(context) { + + companion object { + private const val DEFAULT_STROKE = 4f + private const val DEFAULT_TEXT_SIZE = 60f + private const val mStrokeWidth: Float = 10.toFloat() + private const val strokeColor: Int = Color.WHITE + } + + private var isDrawing: Boolean = false + private val mShadowColors: ColorStateList = ColorStateList.valueOf(Color.GRAY) + private val typeFace = ResourcesCompat.getFont(this.context, R.font.bumper) + + init { + initResources() + } + + private fun updateShadowColor() { + setShadowLayer( + DEFAULT_STROKE, + DEFAULT_STROKE, + DEFAULT_STROKE, + mShadowColors.getColorForState(drawableState, 0) + ) + } + + + private fun initResources() { + typeface = typeFace + textSize = DEFAULT_TEXT_SIZE + setTextColor(generateColor()) + updateShadowColor() + } + + fun updateText(text: String) { + setText(text) + } + + override fun invalidate() { + if (isDrawing) return + super.invalidate() + } + + override fun onDraw(canvas: Canvas) { + if (mStrokeWidth > 0) { + isDrawing = true + val textPaint = paint + + textPaint.style = Paint.Style.FILL + + super.onDraw(canvas) + + val currentTextColor = currentTextColor + textPaint.apply { + style = Paint.Style.STROKE + strokeWidth = mStrokeWidth + } + setTextColor(strokeColor) + super.onDraw(canvas) + setTextColor(currentTextColor) + isDrawing = false + } else { + super.onDraw(canvas) + } + } + +} \ No newline at end of file diff --git a/sticker/src/main/java/com/gappein/sticker/Generator.kt b/sticker/src/main/java/com/gappein/sticker/Generator.kt deleted file mode 100644 index 27ae2d8..0000000 --- a/sticker/src/main/java/com/gappein/sticker/Generator.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.gappein.sticker - -/** - * Created by Himanshu Singh on 10/4/20. - */ - -import android.content.Context -import android.graphics.Bitmap -import android.graphics.Paint -import android.graphics.drawable.Drawable -import androidx.core.graphics.drawable.toBitmap -import com.gappein.sticker.model.DrawingValues -import com.gappein.sticker.model.TextValues - -class Generator(private val context: Context) { - - private var values = DrawingValues.default(context) - - fun setPaint(paint: Paint) = apply { values = values.copy(paint = paint) } - - @JvmOverloads - fun setText(text: TextValues, isMultiline: Boolean = values.isMultiline) = apply { - values = values.copy( - text = text, - isMultiline = isMultiline - ) - } - - fun setBackground(bitmap: Bitmap) = apply { - values = values.copy(bitmap = bitmap.copy(bitmap.config, true)) - } - - fun setBackground(drawable: Drawable) = apply { - val bitmap = drawable.toBitmap(config = Bitmap.Config.ARGB_8888) - setBackground(bitmap) - } - - fun draw(adjustmentBody: DrawingValues.() -> Unit = values.defaultPosition): Bitmap { - return values.draw(adjustmentBody) - } - - -} \ No newline at end of file diff --git a/sticker/src/main/java/com/gappein/sticker/model/DrawaingValues.kt b/sticker/src/main/java/com/gappein/sticker/model/DrawaingValues.kt deleted file mode 100644 index 9829e20..0000000 --- a/sticker/src/main/java/com/gappein/sticker/model/DrawaingValues.kt +++ /dev/null @@ -1,76 +0,0 @@ -package com.gappein.sticker.model - -import android.content.Context -import android.graphics.* -import android.text.StaticLayout -import android.text.TextPaint -import androidx.core.content.res.ResourcesCompat -import com.gappein.sticker.R - -/** - * Created by Himanshu Singh on 10/4/20. - */ -data class DrawingValues( - val context: Context, - val paint: Paint, - val text: TextValues, - val isMultiline: Boolean, - val bitmap: Bitmap -) { - - val defaultPosition: DrawingValues.() -> Unit = { - val canvas = Canvas(bitmap) - val textWidth = canvas.width - text.padding - val textLayout = StaticLayout( - text.text, TextPaint(paint), textWidth, text.alignment, 1f, 0f, false - ) - val bounds = Rect().apply { - if (isMultiline) { - top = 0 - left = 0 - right = textWidth - bottom = textLayout.height - } else { - paint.setTypeface(ResourcesCompat.getFont(context, R.font.bumper)) - paint.color = Color.BLACK - paint.style = Paint.Style.FILL - paint.textSize = 52F - paint.getTextBounds(text.text, 0, text.text.length, this) - } - } - - val x = (bitmap.width - bounds.width()) / 2f - val y = (bitmap.height - bounds.height()) / 2f - - if (!isMultiline) { - canvas.drawText(text.text, x, y, paint) - } else { - canvas.save() - canvas.translate(x, y) - textLayout.draw(canvas) - canvas.restore() - } - } - - fun draw(adjustmentBody: DrawingValues.() -> Unit): Bitmap { - this.adjustmentBody() - return bitmap - } - - companion object { - - private val paint = Paint(Paint.ANTI_ALIAS_FLAG).apply { - style = Paint.Style.FILL_AND_STROKE - strokeWidth = 10F - color = Color.BLACK - } - - fun default(context: Context) = DrawingValues( - context = context, - paint = paint, - text = TextValues(""), - isMultiline = false, - bitmap = Bitmap.createBitmap(400, 300, Bitmap.Config.ARGB_8888) - ) - } -} \ No newline at end of file diff --git a/sticker/src/main/java/com/gappein/sticker/model/TextValues.kt b/sticker/src/main/java/com/gappein/sticker/model/TextValues.kt deleted file mode 100644 index 1e0d504..0000000 --- a/sticker/src/main/java/com/gappein/sticker/model/TextValues.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.gappein.sticker.model - -import android.text.Layout - -/** - * Created by Himanshu Singh on 10/4/20. - */ - -data class TextValues( - /** Text to be displayed */ - val text: String, - /** Padding in px - not taken in account when not multiline */ - val padding: Int = 0, - /** Text alignment, defaults to center - not taken in account when not multiline */ - val alignment: Layout.Alignment = Layout.Alignment.ALIGN_CENTER -) \ No newline at end of file diff --git a/sticker/src/main/java/com/gappein/util/ColorExtension.kt b/sticker/src/main/java/com/gappein/util/ColorExtension.kt new file mode 100644 index 0000000..dc5aadb --- /dev/null +++ b/sticker/src/main/java/com/gappein/util/ColorExtension.kt @@ -0,0 +1,10 @@ +package com.gappein.sticker.util + +import android.graphics.Color +import android.view.View +import java.util.* + +fun View.generateColor(): Int { + val random = Random() + return Color.argb(255, random.nextInt(256), random.nextInt(256), random.nextInt(256)) +} \ No newline at end of file diff --git a/sticker/src/main/java/com/gappein/util/StickerExtension.kt b/sticker/src/main/java/com/gappein/util/StickerExtension.kt new file mode 100644 index 0000000..6fa72c4 --- /dev/null +++ b/sticker/src/main/java/com/gappein/util/StickerExtension.kt @@ -0,0 +1,20 @@ +package com.gappein.util + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.util.Log +import android.view.View.MeasureSpec +import com.gappein.StickerView + +fun StickerView.generateSticker(): Bitmap { + val view = this + view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED) + val bitmap = Bitmap.createBitmap( + view.measuredWidth, view.measuredHeight, + Bitmap.Config.ARGB_8888 + ) + val canvas = Canvas(bitmap) + view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()) + view.draw(canvas) + return bitmap +} \ No newline at end of file diff --git a/sticker/src/test/java/com/gappein/sticker/ExampleUnitTest.kt b/sticker/src/test/java/com/gappein/sticker/ExampleUnitTest.kt deleted file mode 100644 index c9b608c..0000000 --- a/sticker/src/test/java/com/gappein/sticker/ExampleUnitTest.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.gappein.sticker - -import org.junit.Test - -import org.junit.Assert.* - -/** - * Example local unit test, which will execute on the development machine (host). - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -class ExampleUnitTest { - @Test - fun addition_isCorrect() { - assertEquals(4, 2 + 2) - } -} \ No newline at end of file