Wątek przeniesiony 2022-04-14 13:01 z Inne języki programowania przez Shalom.

Koltin/jetpack compose - rozmieszczenie slidera

0

Zrobiłem taki layout za pomocą jetpack compose:
screenshot-20220414002306.png

Teraz potrzebuję to nieco zmodyfikować do takiej postaci ( tablet):
screenshot-20220414001851.png
Myślałem, że da się to zrobić, a pomocą Row i Column ale wygląda na to, że nie.
Proszę o jakieś wskazówki.

0

Powinieneś być w stanie zrobić to za pomocą Row i Column, opisz swój problem dokładniej.

Btw, poprawny dział powinien być Mobilne.

0

Pokombinowałem i jest lepiej :-) ale...wygląda to tak ( na razie ćwiczę dwa slidery):
screenshot-20220414200244.png
a oba prostokąty powinny być identyczne bo mają ustawione dokładnie takie same parametry . Dlaczego tak jest ?
Domyślam się, że czerwony jako pierwszy przykrywa ten żółty ale dlaczego nie są rozsunięte proporcjonalnie?
Wiem że pytania na poziomie przedszkola ale na takim właśnie poziomie jestem :-)

Tu kod:

package com.example.rozmiarslidera

import android.os.Bundle
import android.transition.Slide
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.example.rozmiarslidera.ui.theme.RozmiarSlideraTheme
import kotlin.math.roundToInt

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            RozmiarSlideraTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {
                    MainContent()
                }
            }
        }
    }
}

@Composable
fun MainContent(){
    var sliderPosition_1 by remember { mutableStateOf(0F)}
    var sliderPosition_2 by remember { mutableStateOf(0F)}
Row(
    modifier = Modifier
        .fillMaxWidth()
        .background(Color.DarkGray)
        .padding(12.dp),
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center
) {
    Box(
        Modifier
            .background(Color.Red)
            .fillMaxSize(0.5F)
            //.fillMaxWidth()
    ) {
        Text(
            text = " Position: ${(sliderPosition_1 *100).roundToInt()}",
        )
        Slider(
            value = sliderPosition_1,
            onValueChange = {sliderPosition_1= it} )
    }

    Box(
        Modifier
            .background(Color.Yellow)
            .fillMaxSize(0.5F)
    ) {
        Text(
            text = " Position: ${(sliderPosition_2 *100).roundToInt()}",
        )
        Slider(
            value = sliderPosition_2,
            onValueChange = {sliderPosition_2= it} )
    }
}


}
0

Jeszcze małe poprawki i wygląda na to, że one są jednak obok siebie:

screenshot-20220414202113.png
Tu poprawiony kod:

Box(
        Modifier
            .background(Color.Yellow)
            .fillMaxSize(0.3F)
            .padding(12.dp)
            .background(Color.LightGray)

0

Z tekstem idzie łatwo i zgodnie z oczekiwaniami:
screenshot-20220414205408.png

@Composable
fun MainContent(){
Row(
    Modifier
        .background(Color.Red)
        .fillMaxSize(0.3F)
        .padding(12.dp)
        .background(Color.LightGray),
    verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.Center


) {
    Column(Modifier
        .background(Color.Red)
    ) {
        Text(
            text = " Pierwsze pole",
        style = MaterialTheme.typography.h4
            )


        Text(
            text = " Drugie pole",
                    style = MaterialTheme.typography.h4
        )
    }

    Column(Modifier
        .background(Color.Yellow)

    ) {
        Text(
            text = " Pierwsze pole",
            style = MaterialTheme.typography.h4)
        Text(
            text = " Drugie pole",
            style = MaterialTheme.typography.h4)
    }
}





}

0

Przy czterech polach jest też ciekawie
screenshot-20220414230448.png

A to tylko taki prosty zabieg:

Column() {
                       MainContent()
                       MainContent()
                   }
0

Odpowiadam sobie sam:
screenshot-20220415132859.png
Utworzyłem drugą, bliźniaczą funkcję i to zadziałało ponieważ niezależnie mogłem zmienić rozmiar dolnych boxów.
Nie do końca rozumiem jak to działa( wymiarowanie) i ustawiam to na wyczucie ale efekt jest taki jaki chciałem uzyskać.

 Column(
                       
                   ) {
                       MainContent()
                       MainContent_2()
                   }

Tu różnice w rozmiarach boxów w kolejności:
Górny lewy:

.fillMaxWidth(0.49F)
                .fillMaxHeight(0.3F)

Górny prawy:

.fillMaxWidth(1F)
                .fillMaxHeight(0.3F)

Dolny lewy:

.fillMaxWidth(0.49F)
                .fillMaxHeight(0.45F)

Dolny prawy:

.fillMaxWidth(1F)
                .fillMaxHeight(0.45F)

1 użytkowników online, w tym zalogowanych: 0, gości: 1