From 167e2dcbac4cd8762dd946f78acd8407538b78ee Mon Sep 17 00:00:00 2001 From: MikeKuzn Date: Mon, 4 Sep 2023 15:24:05 +0300 Subject: [PATCH 1/2] PieChartView --- app/build.gradle | 30 +-- .../ExampleInstrumentedTest.kt | 4 +- app/src/main/AndroidManifest.xml | 16 +- .../java/otus/homework/canvas/JsonData.kt | 44 ++++ .../java/otus/homework/canvas/MainActivity.kt | 56 +++++ .../homework/canvas/PieChartSectorData.kt | 10 + .../java/otus/homework/canvas/PieChartView.kt | 202 ++++++++++++++++++ .../otus/homework/customview/MainActivity.kt | 11 - .../res/drawable/ic_launcher_background.xml | 135 ++++++------ .../ic_launcher_foreground.xml | 11 +- app/src/main/res/layout/activity_main.xml | 39 +++- .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 4 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3593 -> 0 bytes app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 1404 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 5339 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 2898 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2636 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 982 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 3388 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 1772 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4926 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 1900 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 7472 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 3918 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7909 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 2884 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 11873 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 5914 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 10652 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 3844 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 16570 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 7778 bytes app/src/main/res/values-night/themes.xml | 4 +- app/src/main/res/values/attrs.xml | 10 + app/src/main/res/values/colors.xml | 28 +++ app/src/main/res/values/strings.xml | 4 +- app/src/main/res/values/themes.xml | 4 +- app/src/main/res/xml/backup_rules.xml | 13 ++ .../main/res/xml/data_extraction_rules.xml | 19 ++ .../{customview => canvas}/ExampleUnitTest.kt | 2 +- build.gradle | 27 +-- gradle.properties | 10 +- gradle/libs.versions.toml | 28 +++ gradle/wrapper/gradle-wrapper.jar | Bin 54329 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 53 +++-- gradlew.bat | 43 ++-- settings.gradle | 17 +- 49 files changed, 634 insertions(+), 198 deletions(-) rename app/src/androidTest/java/otus/homework/{customview => canvas}/ExampleInstrumentedTest.kt (84%) create mode 100644 app/src/main/java/otus/homework/canvas/JsonData.kt create mode 100644 app/src/main/java/otus/homework/canvas/MainActivity.kt create mode 100644 app/src/main/java/otus/homework/canvas/PieChartSectorData.kt create mode 100644 app/src/main/java/otus/homework/canvas/PieChartView.kt delete mode 100644 app/src/main/java/otus/homework/customview/MainActivity.kt rename app/src/main/res/{drawable-v24 => drawable}/ic_launcher_foreground.xml (87%) delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 app/src/main/res/values/attrs.xml create mode 100644 app/src/main/res/xml/backup_rules.xml create mode 100644 app/src/main/res/xml/data_extraction_rules.xml rename app/src/test/java/otus/homework/{customview => canvas}/ExampleUnitTest.kt (90%) create mode 100644 gradle/libs.versions.toml diff --git a/app/build.gradle b/app/build.gradle index b4711913..b81e773e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,16 +1,16 @@ plugins { - id 'com.android.application' - id 'kotlin-android' + alias(libs.plugins.androidApplication) + alias(libs.plugins.kotlinAndroid) } android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" + namespace 'otus.homework.canvas' + compileSdk 33 defaultConfig { - applicationId "otus.homework.customview" - minSdkVersion 23 - targetSdkVersion 30 + applicationId "otus.homework.canvas" + minSdk 24 + targetSdk 33 versionCode 1 versionName "1.0" @@ -34,12 +34,12 @@ android { dependencies { - implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - implementation 'androidx.core:core-ktx:1.3.2' - implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'com.google.android.material:material:1.3.0' - implementation 'androidx.constraintlayout:constraintlayout:2.0.4' - testImplementation 'junit:junit:4.+' - androidTestImplementation 'androidx.test.ext:junit:1.1.2' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + implementation libs.core.ktx + implementation libs.appcompat + implementation libs.material + implementation libs.constraintlayout + testImplementation libs.junit + androidTestImplementation libs.androidx.test.ext.junit + androidTestImplementation libs.espresso.core + implementation libs.gson } \ No newline at end of file diff --git a/app/src/androidTest/java/otus/homework/customview/ExampleInstrumentedTest.kt b/app/src/androidTest/java/otus/homework/canvas/ExampleInstrumentedTest.kt similarity index 84% rename from app/src/androidTest/java/otus/homework/customview/ExampleInstrumentedTest.kt rename to app/src/androidTest/java/otus/homework/canvas/ExampleInstrumentedTest.kt index d5e3dba4..25847539 100644 --- a/app/src/androidTest/java/otus/homework/customview/ExampleInstrumentedTest.kt +++ b/app/src/androidTest/java/otus/homework/canvas/ExampleInstrumentedTest.kt @@ -1,4 +1,4 @@ -package otus.homework.customview +package otus.homework.canvas import androidx.test.platform.app.InstrumentationRegistry import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -19,6 +19,6 @@ class ExampleInstrumentedTest { fun useAppContext() { // Context of the app under test. val appContext = InstrumentationRegistry.getInstrumentation().targetContext - assertEquals("otus.homework.customview", appContext.packageName) + assertEquals("otus.homework.canvas", appContext.packageName) } } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index efd1e519..ea6f0b25 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,19 +1,23 @@ - + + - + android:theme="@style/Theme.HW_Canvas" + tools:targetApi="31"> + - diff --git a/app/src/main/java/otus/homework/canvas/JsonData.kt b/app/src/main/java/otus/homework/canvas/JsonData.kt new file mode 100644 index 00000000..75f70040 --- /dev/null +++ b/app/src/main/java/otus/homework/canvas/JsonData.kt @@ -0,0 +1,44 @@ +import android.content.Context +import android.graphics.Color +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import otus.homework.canvas.PieChartSectorData +import otus.homework.canvas.R + +class JsonData(private val context: Context) { + + data class JsonData( + val id: Int, + val name: String, + val amount: Int, + val category: String, + val time: Int + ) + + fun getJsonData(): List? { + try { + val jsonFile = context.resources.openRawResource(R.raw.payload).bufferedReader() + val arrayTutorialType = object : TypeToken>() {}.type + val purchases = Gson().fromJson>(jsonFile, arrayTutorialType) + return purchases + } catch (error: Exception) { + return null + } + } + + fun getPieChartSectorData(): List? { + val jonDataArray = getJsonData() ?: return null + val pieChartSectorData = mutableListOf() + for (data in jonDataArray) { + pieChartSectorData.add( + PieChartSectorData( + angle = data.amount.toFloat(), + radius = data.time.toFloat(), + text = data.name, + category = data.category, + ) + ) + } + return pieChartSectorData + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/homework/canvas/MainActivity.kt b/app/src/main/java/otus/homework/canvas/MainActivity.kt new file mode 100644 index 00000000..b6d2f469 --- /dev/null +++ b/app/src/main/java/otus/homework/canvas/MainActivity.kt @@ -0,0 +1,56 @@ +package otus.homework.canvas + +import JsonData +import android.content.Context +import android.graphics.Color +import android.os.Build +import androidx.appcompat.app.AppCompatActivity +import android.os.Bundle +import android.os.VibrationEffect +import android.os.Vibrator +import android.util.Log +import android.view.View + +class MainActivity : AppCompatActivity() { + + val pieChartView: PieChartView by lazy { findViewById(R.id.PieChartView) } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + onMySectors(null) + } + + + fun onFull(view: View) { + val jsonData = JsonData(applicationContext) + pieChartView.setData(jsonData.getPieChartSectorData(), -1F) {category, num -> clickCallBack(category, num)} + } + + private fun clickCallBack(category: String, numSector: Int) { + Log.d("***[", "clickCallBack category=$category numSector=$numSector") + val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + if (Build.VERSION.SDK_INT >= 26) { + vibrator.vibrate( + VibrationEffect.createOneShot( + 200, + VibrationEffect.DEFAULT_AMPLITUDE + ) + ) + } else { + vibrator.vibrate(200) + } + } + + fun onMySectors(view: View?) { + val sectors = arrayListOf( + PieChartSectorData(10F, Color.RED, 50F, "10", "Sector №1"), + PieChartSectorData(15F, Color.YELLOW, 40F, "15", "Sector №2"), + PieChartSectorData(7F, Color.GREEN, 45F, "7", "Sector №3"), + PieChartSectorData(18F, Color.BLUE, 52F, "18", "Sector №4"), + ) + + pieChartView.setData(sectors, 32F) {category, num -> clickCallBack(category, num)} + } +} + diff --git a/app/src/main/java/otus/homework/canvas/PieChartSectorData.kt b/app/src/main/java/otus/homework/canvas/PieChartSectorData.kt new file mode 100644 index 00000000..9a19de72 --- /dev/null +++ b/app/src/main/java/otus/homework/canvas/PieChartSectorData.kt @@ -0,0 +1,10 @@ +package otus.homework.canvas + +data class PieChartSectorData( + var angle: Float, + var color: Int = Int.MAX_VALUE, + val radius: Float = 100F, + val text: String? = null, + val category: String, + var startAngle: Float = 0F, +) diff --git a/app/src/main/java/otus/homework/canvas/PieChartView.kt b/app/src/main/java/otus/homework/canvas/PieChartView.kt new file mode 100644 index 00000000..aa1bcf66 --- /dev/null +++ b/app/src/main/java/otus/homework/canvas/PieChartView.kt @@ -0,0 +1,202 @@ +package otus.homework.canvas + +import android.content.Context +import android.content.res.TypedArray +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Path +import android.graphics.Rect +import android.graphics.RectF +import android.util.AttributeSet +import android.util.Log +import android.view.MotionEvent +import android.view.View +import kotlin.math.PI +import kotlin.math.atan2 +import kotlin.math.sqrt + + +class PieChartView @JvmOverloads constructor( + context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0 +) : View(context, attrs, defStyleAttr) { + + private var myBackgroundColor: Int = Color.WHITE + private var gap = 0F + private var defaultWidth = 25F + private var startAngle = -90F + private var padding = 20F + private var numPressed: Int? = null + + private var pieChartSectorDataArray: List? = null + private var callback: ((category: String, Int) -> Unit)? = null + private var summaryAngle: Float = 0F + private var minDiameter: Float = 0F + private var maxDiameter: Float = 0F + + init { + val typedArray: TypedArray = context.obtainStyledAttributes(attrs, R.styleable.PieChartView) + myBackgroundColor = typedArray.getColor(R.styleable.PieChartView_backgroundColor, myBackgroundColor) + gap = typedArray.getDimension(R.styleable.PieChartView_defaultGap, gap) + defaultWidth = typedArray.getDimension(R.styleable.PieChartView_defaultWidth, defaultWidth) + startAngle = typedArray.getDimension(R.styleable.PieChartView_startAngle, startAngle) + padding = typedArray.getDimension(R.styleable.PieChartView_padding, padding) + typedArray.recycle() + } + + fun Int.modToString() = when(this) { + MeasureSpec.UNSPECIFIED -> "UNSPECIFIED" + MeasureSpec.EXACTLY->"EXACTLY" + MeasureSpec.AT_MOST->"AT_MOST" + else -> "---" + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val widthMod = MeasureSpec.getMode(widthMeasureSpec) + val widthSize = MeasureSpec.getSize(widthMeasureSpec) + val heightMod = MeasureSpec.getMode(heightMeasureSpec) + val heightSize = MeasureSpec.getSize(heightMeasureSpec) + Log.d("***[", "widthMod=${widthMod.modToString()} widthSize=$widthSize heightMod=${heightMod.modToString()} heightSize=$heightSize") + val size = minOf(widthSize,heightSize) + setMeasuredDimension(size,size) + } + + fun getNumSector(x: Float, y: Float): Int? { + val diameter: Float = sqrt(x*x + y*y) * 2 + //Log.d("***[", "***2 radius=$radius minRadius=${reCalcSize(minDiameter)} maxRadius=${reCalcSize(maxDiameter)}") + if (diameter < reCalcSize(minDiameter) || diameter > reCalcSize(maxDiameter)) { + return null + } + var angle = atan2(y, x) / (2 * PI) * 360 + angle = if (angle < 0) angle + 360 else angle + + for (num: Int in 0 until pieChartSectorDataArray!!.size) { + val sector = pieChartSectorDataArray!![num] + var startAngle = sector.startAngle + var endAngle = sector.startAngle + sector.angle + if (startAngle < 0 && endAngle < 0) { + startAngle += 360 + endAngle += 360 + } + //Log.d("***[", "angle=$angle startAngle=${startAngle} endAngle=${endAngle}") + if (angle > startAngle && angle < endAngle || + startAngle < 0 && endAngle > 0 && angle > startAngle + 360) { + return num + } + } + return null + } + + override fun dispatchTouchEvent(event: MotionEvent): Boolean { + if (pieChartSectorDataArray == null) { + return false + } + numPressed = + when (event.action) { + MotionEvent.ACTION_DOWN -> { + val displaySize = minOf(width, height).toFloat() + val num = getNumSector(event.x - displaySize / 2, event.y - displaySize / 2) + num?.let { callback?.invoke(pieChartSectorDataArray!![it].category, it) } + num + } + MotionEvent.ACTION_UP -> null + else -> return false + } + return true + } + + fun setData( + pieChartSectorDataArray: List?, + minRadius: Float, + callback: (category: String, Int) -> Unit + ): Boolean { + invalidate() + this.pieChartSectorDataArray = pieChartSectorDataArray + pieChartSectorDataArray ?: return false + this.callback = callback + this.minDiameter = minRadius + // set pre value + var calcMinRadius = Float.MAX_VALUE + summaryAngle = 0F + maxDiameter = 0F + var numColor = 0 + val presetColors: IntArray = context.resources.getIntArray(R.array.presetColors) + // Find max & min + for (sector in pieChartSectorDataArray) { + calcMinRadius = minOf(calcMinRadius, sector.radius) + summaryAngle += sector.angle + maxDiameter = maxOf(maxDiameter, sector.radius) + if (sector.color == Int.MAX_VALUE) { + sector.color = presetColors[numColor++] + } + } + if (minRadius < 0) { + this.minDiameter = calcMinRadius * 3 / 4 + } else if (calcMinRadius < minRadius) { + this.pieChartSectorDataArray = null + return false + } + // + val k = (360 - gap * pieChartSectorDataArray.size) / summaryAngle + var curtrentAngle = startAngle + for (sector in pieChartSectorDataArray) { + sector.angle *= k + sector.startAngle = curtrentAngle + curtrentAngle += sector.angle + gap + } + return true + } + + private fun reCalcSize(size: Float) = size * (minOf(width,height).toFloat() - padding * 2) / maxDiameter + + private fun getRect(diameter: Float): RectF { + val displaySize = minOf(width,height).toFloat() + val calcPadding = (displaySize - reCalcSize(diameter)) / 2 + return RectF(calcPadding, calcPadding, displaySize-calcPadding, displaySize-calcPadding) + } + + val path = Path() + val paint = Paint().apply { + textSize = 30F + textAlign = Paint.Align.CENTER + isAntiAlias = true + } + + override fun onDrawForeground(canvas: Canvas) { + + canvas.apply { + drawColor(myBackgroundColor) + + if (pieChartSectorDataArray == null) { + return + } + + for (sector in pieChartSectorDataArray!!) { + DrawSector(sector) + } + + paint.color = myBackgroundColor + drawArc(getRect(minDiameter), 0F, 360F, true, paint) + } + } + + fun Canvas.DrawSector(sector: PieChartSectorData) { + val rect = getRect(sector.radius) + paint.color = sector.color + drawArc(rect, sector.startAngle, sector.angle, true, paint) + + if (sector.text != null) { + val textRect = Rect() + paint.getTextBounds(sector.text, 0, sector.text.length, textRect) + val height = textRect.height() + + val calcHeight = sector.angle * rect.width() / PI / 100 // TO?DO?changed + if (height < calcHeight) { + paint.color = Color.BLACK + path.reset(); + path.addArc(rect, sector.startAngle, sector.angle) + drawTextOnPath(sector.text, path, 0F, 0F, paint) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/otus/homework/customview/MainActivity.kt b/app/src/main/java/otus/homework/customview/MainActivity.kt deleted file mode 100644 index 78cb9448..00000000 --- a/app/src/main/java/otus/homework/customview/MainActivity.kt +++ /dev/null @@ -1,11 +0,0 @@ -package otus.homework.customview - -import androidx.appcompat.app.AppCompatActivity -import android.os.Bundle - -class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml index 74852f7d..07d5da9c 100644 --- a/app/src/main/res/drawable/ic_launcher_background.xml +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -1,171 +1,170 @@ - + android:viewportHeight="108"> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> + android:strokeWidth="0.8" + android:strokeColor="#33FFFFFF" /> diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml similarity index 87% rename from app/src/main/res/drawable-v24/ic_launcher_foreground.xml rename to app/src/main/res/drawable/ic_launcher_foreground.xml index 7361bc1a..2b068d11 100644 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -1,10 +1,9 @@ - + android:viewportHeight="108"> + android:strokeWidth="1" + android:strokeColor="#00000000" /> \ 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 79ae6993..2aa834e1 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,19 +1,38 @@ - - + app:backgroundColor="#B6FAA7" + app:defaultGap="0.363636363636367dp" + app:padding="20dp" + app:defaultWidth="10dp" /> - \ No newline at end of file + + +