diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d8b102e..a3fef66 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ + android:theme="@style/AppTheme" + tools:ignore="AllowBackup"> diff --git a/app/src/main/java/com/gappein/sample/MainActivity.kt b/app/src/main/java/com/gappein/sample/MainActivity.kt index 47dfdf8..2047cec 100644 --- a/app/src/main/java/com/gappein/sample/MainActivity.kt +++ b/app/src/main/java/com/gappein/sample/MainActivity.kt @@ -1,10 +1,11 @@ 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 android.text.Editable +import android.text.TextWatcher +import androidx.appcompat.app.AppCompatActivity +import com.gappein.Sticker +import com.gappein.ui.StickerView import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { @@ -12,7 +13,28 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) - val x = Generator.setText(TextValues(text = "Himanshu")).draw() - background.setImageBitmap(x) + val stickerView = StickerView(this) + + editTextInput.addTextChangedListener(object : TextWatcher { + + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + + override fun afterTextChanged(s: Editable?) { + if (s.toString().length < 20) { + background.setImageBitmap( + Sticker.with(this@MainActivity, s.toString()) + ) + } + } + + }) } + + } \ 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 09e3a6f..0b30d03 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,6 +8,7 @@ + \ No newline at end of file diff --git a/sticker/src/androidTest/java/com/gappein/sticker/ExampleInstrumentedTest.kt b/sticker/src/androidTest/java/com/gappein/sticker/ExampleInstrumentedTest.kt deleted file mode 100644 index 9d31d67..0000000 --- a/sticker/src/androidTest/java/com/gappein/sticker/ExampleInstrumentedTest.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.gappein.sticker - -import androidx.test.platform.app.InstrumentationRegistry -import androidx.test.ext.junit.runners.AndroidJUnit4 - -import org.junit.Test -import org.junit.runner.RunWith - -import org.junit.Assert.* - -/** - * Instrumented test, which will execute on an Android device. - * - * See [testing documentation](http://d.android.com/tools/testing). - */ -@RunWith(AndroidJUnit4::class) -class ExampleInstrumentedTest { - @Test - fun useAppContext() { - // Context of the app under test. - val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("com.gappein.sticker.test", appContext.packageName) - } -} \ No newline at end of file diff --git a/sticker/src/main/AndroidManifest.xml b/sticker/src/main/AndroidManifest.xml index 7c40282..66face2 100644 --- a/sticker/src/main/AndroidManifest.xml +++ b/sticker/src/main/AndroidManifest.xml @@ -1,5 +1 @@ - - - / - \ No newline at end of file + \ No newline at end of file diff --git a/sticker/src/main/java/com/gappein/Sticker.kt b/sticker/src/main/java/com/gappein/Sticker.kt new file mode 100644 index 0000000..3e25177 --- /dev/null +++ b/sticker/src/main/java/com/gappein/Sticker.kt @@ -0,0 +1,12 @@ +package com.gappein + +import android.content.Context +import android.graphics.Bitmap +import com.gappein.ui.StickerView +import com.gappein.util.generateSticker + +object Sticker { + + fun with(context: Context, text:String):Bitmap = StickerView(context).generateSticker(text) + +} \ 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 8e2d002..0000000 --- a/sticker/src/main/java/com/gappein/sticker/Generator.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.gappein.sticker - -/** - * Created by Himanshu Singh on 10/4/20. - */ - -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 - -object Generator { - - private var values = DrawingValues.default - - 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) = - 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 227b3c7..0000000 --- a/sticker/src/main/java/com/gappein/sticker/model/DrawaingValues.kt +++ /dev/null @@ -1,67 +0,0 @@ -package com.gappein.sticker.model - -import android.graphics.* -import android.text.StaticLayout -import android.text.TextPaint - -/** - * Created by Himanshu Singh on 10/4/20. - */ -data class DrawingValues( - 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.color = Color.BLACK - paint.style = Paint.Style.FILL - paint.textSize = 20F - 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) - val plain = Typeface.createFromAsset( pathToFont); - - val default - get() = DrawingValues( - paint = paint, - text = TextValues(""), - isMultiline = false, - bitmap = Bitmap.createBitmap(200, 200, 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/ui/StickerView.kt b/sticker/src/main/java/com/gappein/ui/StickerView.kt new file mode 100644 index 0000000..5c15b00 --- /dev/null +++ b/sticker/src/main/java/com/gappein/ui/StickerView.kt @@ -0,0 +1,91 @@ +package com.gappein.ui + +import android.content.Context +import android.content.res.ColorStateList +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.R +import com.gappein.util.generateColor + +class StickerView(context: Context) : AppCompatTextView(context) { + + companion object { + private const val DEFAULT_STROKE = 4f + private const val DEFAULT_TEXT_SIZE = 40f + private const val DEFAULT_TEXT = " " + private const val STROKE_WIDTH: Float = 10.toFloat() + private const val STROKE_COLOR: Int = Color.WHITE + } + + private var _isDrawing: Boolean = false + private val _shadowColors: ColorStateList = ColorStateList.valueOf(Color.GRAY) + private val _typeFace = ResourcesCompat.getFont(this.context, R.font.bumper) + private val _color = generateColor() + + init { + initResources() + } + + private fun updateShadowColor() { + setShadowLayer( + DEFAULT_STROKE, + DEFAULT_STROKE, + DEFAULT_STROKE, + _shadowColors.getColorForState(drawableState, 0) + ) + } + + + private fun initResources() { + typeface = _typeFace + textSize = DEFAULT_TEXT_SIZE + setTextColor(_color) + textAlignment = TEXT_ALIGNMENT_CENTER + text = DEFAULT_TEXT + updateShadowColor() + } + + fun updateText(text: String) { + if (text.contains(DEFAULT_TEXT)) { + val splitString = text.split(DEFAULT_TEXT, limit = 2) + val firstString = splitString.first() + val lastString = splitString.last() + val displayText =firstString + "\n" + lastString + setText(displayText) + } else { + setText(text) + } + } + + + override fun invalidate() { + if (_isDrawing) return + super.invalidate() + } + + override fun onDraw(canvas: Canvas) { + if (STROKE_WIDTH > 0) { + _isDrawing = true + val textPaint = paint + + textPaint.style = Paint.Style.FILL + + super.onDraw(canvas) + + val currentTextColor = currentTextColor + textPaint.apply { + style = Paint.Style.STROKE + strokeWidth = STROKE_WIDTH + } + setTextColor(STROKE_COLOR) + 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/util/ColorExtension.kt b/sticker/src/main/java/com/gappein/util/ColorExtension.kt new file mode 100644 index 0000000..55b5b2d --- /dev/null +++ b/sticker/src/main/java/com/gappein/util/ColorExtension.kt @@ -0,0 +1,9 @@ +package com.gappein.util + +import android.graphics.Color +import java.util.* + +fun 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..1508cd8 --- /dev/null +++ b/sticker/src/main/java/com/gappein/util/StickerExtension.kt @@ -0,0 +1,25 @@ +package com.gappein.util + +import android.graphics.Bitmap +import android.graphics.Canvas +import android.view.View.MeasureSpec +import com.gappein.ui.StickerView + +fun StickerView.generateSticker(text: String): Bitmap { + val view = this + view.updateText(text) + view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED) + + val width = if (view.measuredWidth == 0) 1 else view.measuredWidth + val height = if (view.measuredHeight == 0) 1 else view.measuredHeight + + val bitmap = Bitmap.createBitmap( + width, height, + Bitmap.Config.ARGB_8888 + ) + val canvas = Canvas(bitmap) + + view.layout(0, 0, width, height) + view.draw(canvas) + return bitmap +} diff --git a/sticker/src/main/res/drawable-v24/ic_launcher_foreground.xml b/sticker/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/sticker/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/sticker/src/main/res/drawable/ic_launcher_background.xml b/sticker/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/sticker/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sticker/src/main/res/font/bumper.otf b/sticker/src/main/res/font/bumper.otf new file mode 100644 index 0000000..c47dead Binary files /dev/null and b/sticker/src/main/res/font/bumper.otf differ diff --git a/sticker/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/sticker/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/sticker/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/sticker/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/sticker/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..eca70cf --- /dev/null +++ b/sticker/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/sticker/src/main/res/mipmap-hdpi/ic_launcher.png b/sticker/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..a571e60 Binary files /dev/null and b/sticker/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/sticker/src/main/res/mipmap-hdpi/ic_launcher_round.png b/sticker/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..61da551 Binary files /dev/null and b/sticker/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/sticker/src/main/res/mipmap-mdpi/ic_launcher.png b/sticker/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..c41dd28 Binary files /dev/null and b/sticker/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/sticker/src/main/res/mipmap-mdpi/ic_launcher_round.png b/sticker/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..db5080a Binary files /dev/null and b/sticker/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/sticker/src/main/res/mipmap-xhdpi/ic_launcher.png b/sticker/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..6dba46d Binary files /dev/null and b/sticker/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/sticker/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/sticker/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..da31a87 Binary files /dev/null and b/sticker/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/sticker/src/main/res/mipmap-xxhdpi/ic_launcher.png b/sticker/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..15ac681 Binary files /dev/null and b/sticker/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/sticker/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/sticker/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b216f2d Binary files /dev/null and b/sticker/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/sticker/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/sticker/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..f25a419 Binary files /dev/null and b/sticker/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/sticker/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/sticker/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e96783c Binary files /dev/null and b/sticker/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/sticker/src/main/res/values/colors.xml b/sticker/src/main/res/values/colors.xml new file mode 100644 index 0000000..4faecfa --- /dev/null +++ b/sticker/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #6200EE + #3700B3 + #03DAC5 + \ No newline at end of file diff --git a/sticker/src/main/res/values/strings.xml b/sticker/src/main/res/values/strings.xml new file mode 100644 index 0000000..8735906 --- /dev/null +++ b/sticker/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + app-sticker + \ No newline at end of file diff --git a/sticker/src/main/res/values/styles.xml b/sticker/src/main/res/values/styles.xml new file mode 100644 index 0000000..fac9291 --- /dev/null +++ b/sticker/src/main/res/values/styles.xml @@ -0,0 +1,10 @@ + + + + + \ 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