MainActivity.kt
package com.cfsuman.kotlintutorials
import android.graphics.Bitmap
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.ArrayAdapter
import androidx.appcompat.app.AppCompatActivity
import com.cfsuman.kotlintutorials.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// Get the bitmap from assets
val bitmap:Bitmap? = assetsBitmap("flower103.jpg")
// Display the bitmap in image view
binding.imageView.setImageBitmap(bitmap)
// Button click listener
binding.button.setOnClickListener{
// If bitmap is not null then do the next task
bitmap?.apply {
// Get the palette colors
val list =this.Colors
// Get the palette color names
val names = mutableListOf<String>()
for (i in list){
names.add(i.name)
}
// Initializing an ArrayAdapter
val adapter = ArrayAdapter(
applicationContext, // Context
android.R.layout.simple_spinner_item, // Layout
names // Array
)
// Set the drop down view resource
adapter.setDropDownViewResource(
android.R.layout.simple_dropdown_item_1line)
// Finally, data bind the spinner object with adapter
binding.spinner.adapter = adapter;
// Set an on item selected listener for spinner object
binding.spinner.onItemSelectedListener = object: AdapterView
.OnItemSelectedListener{
override fun onItemSelected(
parent:AdapterView<*>, view: View,
position: Int, id: Long){
val item = list[position]
binding.textLayout.setBackgroundColor(item.color)
binding.tvTitle.text = item.name
if (item.swatch!=null){
binding.tvTitle.setTextColor(
item.swatch.titleTextColor)
binding.tvBody.setTextColor(
item.swatch.bodyTextColor)
}
}
override fun onNothingSelected(parent: AdapterView<*>){
// Another interface callback
}
}
}
}
}
}
PaletteManager.kt
package com.cfsuman.kotlintutorials
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import androidx.palette.graphics.Palette
import java.io.IOException
import java.io.InputStream
// Extension property to get palette colors from bitmap
val Bitmap.Colors:MutableList<PaletteColor>
get() {
// Initialize a list of palette color
val list = mutableListOf<PaletteColor>()
// Generate the palette from bitmap
val palette = this.palette
// Dark muted color and swatch
val darkMutedColor = palette.getDarkMutedColor(Color.RED)
val darkMutedSwatch = palette.darkMutedSwatch
list.add(PaletteColor(
"Dark muted color",darkMutedColor,darkMutedSwatch)
)
// Dark vibrant color and swatch
val darkVibrantColor = palette.getDarkVibrantColor(Color.MAGENTA)
val darkVibrantSwatch = palette.darkVibrantSwatch
list.add(PaletteColor(
"Dark vibrant color",
darkVibrantColor,darkVibrantSwatch))
// Dominant color and swatch
val dominantColor = palette.getDominantColor(Color.BLUE)
val dominantSwatch = palette.dominantSwatch
list.add(PaletteColor("Dominant Color",
dominantColor,dominantSwatch))
// Light muted color and swatch
val lightMutedColor = palette.getLightMutedColor(Color.YELLOW)
val lightMutedSwatch = palette.lightMutedSwatch
list.add(PaletteColor("Light muted color",
lightMutedColor,lightMutedSwatch))
// Light vibrant color and swatch
val lightVibrantColor = palette.getLightVibrantColor(Color.CYAN)
val lightVibrantSwatch = palette.lightVibrantSwatch
list.add(PaletteColor("Light vibrant color",
lightVibrantColor,lightVibrantSwatch))
// Muted color and swatch
val mutedColor = palette.getMutedColor(Color.GRAY)
val mutedSwatch = palette.mutedSwatch
list.add(PaletteColor("Muted color",mutedColor,mutedSwatch))
return list
}
// Initialize a data class to hold the palette color and swatch
data class PaletteColor(val name:String,
val color:Int, val swatch: Palette.Swatch?)
// Extension property to generate palette from bitmap
val Bitmap.palette: Palette
get() {
return Palette.from(this).generate()
}
// Extension method get bitmap from assets
fun Context.assetsBitmap(path:String): Bitmap?{
val inputStream: InputStream
var bitmap: Bitmap? = null
try {
inputStream = assets.open(path)
bitmap = BitmapFactory.decodeStream(inputStream)
}catch (e: IOException){
// Handle exception here
}
return bitmap
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="12dp"
android:background="#F8F8FF">
<ImageView
android:id="@+id/imageView"
android:layout_width="match_parent"
android:layout_height="175dp"
android:scaleType="centerCrop"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="Generate Palette"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/imageView" />
<Spinner
android:id="@+id/spinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/button"
app:layout_constraintTop_toTopOf="@+id/button" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/textLayout"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/button">
<TextView
android:id="@+id/tvTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tvBody"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:padding="8dp"
android:textSize="18sp"
android:text="Lorem Ipsum is simply dummy text of the
printing and typesetting industry. Lorem Ipsum has been
the industry's standard dummy text ever since
the 1500s, when an unknown printer took a galley
of type and scrambled it to make a type specimen book.
It has survived not only five centuries,
but also the leap into electronic typesetting,
remaining essentially unchanged."
app:layout_constraintTop_toBottomOf="@+id/tvTitle"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
build.gradle [app]
implementation 'androidx.palette:palette:1.0.0'