Fixed flickering and banner overlapping

This commit is contained in:
Nacho 2025-01-05 18:13:41 +01:00
parent 19fbed0ef2
commit 4e2b9eb541
4 changed files with 23 additions and 50 deletions

View File

@ -1,24 +1,19 @@
package com.github.nacabaro.vbhelper.components package com.github.nacabaro.vbhelper.components
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material3.Card import androidx.compose.material3.Card
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.FilterQuality
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@Composable @Composable
fun CharacterEntry( fun CharacterEntry(
name: ImageBitmap,
icon: ImageBitmap, icon: ImageBitmap,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
onClick: () -> Unit = { } onClick: () -> Unit = { }
@ -28,25 +23,15 @@ fun CharacterEntry(
onClick = onClick, onClick = onClick,
modifier = modifier modifier = modifier
.padding(8.dp) .padding(8.dp)
) { .size(96.dp)
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier
.fillMaxSize()
) { ) {
Image( Image(
bitmap = icon, bitmap = icon,
contentDescription = "Icon", contentDescription = "Icon",
filterQuality = FilterQuality.None,
modifier = Modifier modifier = Modifier
.padding(8.dp) .padding(8.dp)
.size(64.dp) .fillMaxSize()
)
Image(
bitmap = name,
contentDescription = "Name",
modifier = Modifier
.padding(8.dp)
) )
} }
} }
}

View File

@ -1,10 +1,12 @@
package com.github.nacabaro.vbhelper.components package com.github.nacabaro.vbhelper.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -24,6 +26,7 @@ fun TopBanner(
) { ) {
Box( // Use Box to overlay elements Box( // Use Box to overlay elements
modifier = modifier modifier = modifier
.background(MaterialTheme.colorScheme.background)
.fillMaxWidth() .fillMaxWidth()
.padding(16.dp) .padding(16.dp)
) { ) {

View File

@ -1,7 +1,6 @@
package com.github.nacabaro.vbhelper.screens package com.github.nacabaro.vbhelper.screens
import android.graphics.Bitmap import android.graphics.Bitmap
import android.util.Log
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@ -16,18 +15,17 @@ import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.FilterQuality
import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController import androidx.navigation.NavController
import com.github.nacabaro.vbhelper.R
import com.github.nacabaro.vbhelper.components.TopBanner import com.github.nacabaro.vbhelper.components.TopBanner
import com.github.nacabaro.vbhelper.di.VBHelper import com.github.nacabaro.vbhelper.di.VBHelper
import com.github.nacabaro.vbhelper.domain.Dim import com.github.nacabaro.vbhelper.domain.Dim
@ -44,12 +42,12 @@ fun DexScreen(
val application = LocalContext.current.applicationContext as VBHelper val application = LocalContext.current.applicationContext as VBHelper
val dexRepository = DexRepository(application.container.db) val dexRepository = DexRepository(application.container.db)
val dimList = remember { mutableStateListOf<Dim>() } val dimList = remember { mutableStateOf<List<Dim>>(emptyList()) }
LaunchedEffect(dexRepository) { LaunchedEffect(dexRepository) {
coroutineScope.launch { coroutineScope.launch {
dimList.clear() val newDimList = dexRepository.getAllDims()
dimList.addAll(dexRepository.getAllDims()) dimList.value = newDimList // Replace the entire list atomically
} }
} }
@ -67,7 +65,7 @@ fun DexScreen(
modifier = Modifier modifier = Modifier
.padding(top = contentPadding.calculateTopPadding()) .padding(top = contentPadding.calculateTopPadding())
) { ) {
items(dimList) { items(dimList.value) {
val bitmap = remember (it.logo) { val bitmap = remember (it.logo) {
Bitmap.createBitmap(it.logoWidth, it.logoHeight, Bitmap.Config.RGB_565).apply { Bitmap.createBitmap(it.logoWidth, it.logoHeight, Bitmap.Config.RGB_565).apply {
copyPixelsFromBuffer(ByteBuffer.wrap(it.logo)) copyPixelsFromBuffer(ByteBuffer.wrap(it.logo))
@ -75,8 +73,6 @@ fun DexScreen(
} }
val imageBitmap = remember(bitmap) { bitmap.asImageBitmap() } val imageBitmap = remember(bitmap) { bitmap.asImageBitmap() }
Log.d("DexScreen", "dimList: ${it.id}")
DexDiMEntry( DexDiMEntry(
name = it.name, name = it.name,
logo = imageBitmap, logo = imageBitmap,
@ -118,6 +114,7 @@ fun DexDiMEntry(
Image ( Image (
bitmap = logo, bitmap = logo,
contentDescription = name, contentDescription = name,
filterQuality = FilterQuality.None,
modifier = Modifier modifier = Modifier
.padding(8.dp) .padding(8.dp)
.size(64.dp) .size(64.dp)

View File

@ -1,25 +1,22 @@
package com.github.nacabaro.vbhelper.screens package com.github.nacabaro.vbhelper.screens
import android.graphics.Bitmap import android.graphics.Bitmap
import android.util.Log
import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.lazy.grid.items
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.navigation.NavController import androidx.navigation.NavController
import com.github.nacabaro.vbhelper.components.CharacterEntry import com.github.nacabaro.vbhelper.components.CharacterEntry
import com.github.nacabaro.vbhelper.components.StorageEntry
import com.github.nacabaro.vbhelper.components.TopBanner import com.github.nacabaro.vbhelper.components.TopBanner
import com.github.nacabaro.vbhelper.domain.Character import com.github.nacabaro.vbhelper.domain.Character
import com.github.nacabaro.vbhelper.di.VBHelper import com.github.nacabaro.vbhelper.di.VBHelper
import com.github.nacabaro.vbhelper.navigation.BottomNavItem
import com.github.nacabaro.vbhelper.source.DexRepository import com.github.nacabaro.vbhelper.source.DexRepository
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.nio.ByteBuffer import java.nio.ByteBuffer
@ -33,14 +30,12 @@ fun DiMScreen(
val application = LocalContext.current.applicationContext as VBHelper val application = LocalContext.current.applicationContext as VBHelper
val dexRepository = DexRepository(application.container.db) val dexRepository = DexRepository(application.container.db)
val characterList = remember { mutableStateListOf<Character>() } val characterList = remember { mutableStateOf<List<Character>>(emptyList()) }
Log.d("dimId", dimId.toString())
LaunchedEffect(dexRepository) { LaunchedEffect(dexRepository) {
coroutineScope.launch { coroutineScope.launch {
characterList.clear() val newCharacterList = dexRepository.getCharactersByDimId(dimId)
characterList.addAll(dexRepository.getCharactersByDimId(dimId)) characterList.value = newCharacterList
} }
} }
@ -58,21 +53,14 @@ fun DiMScreen(
columns = GridCells.Fixed(3), columns = GridCells.Fixed(3),
contentPadding = contentPadding contentPadding = contentPadding
) { ) {
items(characterList) { character -> items(characterList.value) { character ->
val bitmapName = remember (character.name) {
Bitmap.createBitmap(character.nameWidth, character.nameHeight, Bitmap.Config.RGB_565).apply {
copyPixelsFromBuffer(ByteBuffer.wrap(character.name))
}
}
val bitmapCharacter = remember (character.sprite1) { val bitmapCharacter = remember (character.sprite1) {
Bitmap.createBitmap(character.spritesWidth, character.spritesHeight, Bitmap.Config.RGB_565).apply { Bitmap.createBitmap(character.spritesWidth, character.spritesHeight, Bitmap.Config.RGB_565).apply {
copyPixelsFromBuffer(ByteBuffer.wrap(character.sprite1)) copyPixelsFromBuffer(ByteBuffer.wrap(character.sprite1))
} }
} }
val imageBitmapName = remember(bitmapName) { bitmapName.asImageBitmap() }
val imageBitmapCharacter = remember(bitmapCharacter) { bitmapCharacter.asImageBitmap() } val imageBitmapCharacter = remember(bitmapCharacter) { bitmapCharacter.asImageBitmap() }
CharacterEntry( CharacterEntry(
name = imageBitmapName,
icon = imageBitmapCharacter, icon = imageBitmapCharacter,
onClick = { } onClick = { }
) )