|
|
@@ -0,0 +1,144 @@
|
|
|
+package com.iscs.bozzys.ui.pages.home
|
|
|
+
|
|
|
+import android.content.Context
|
|
|
+import android.content.Intent
|
|
|
+import androidx.compose.foundation.background
|
|
|
+import androidx.compose.foundation.clickable
|
|
|
+import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
|
+import androidx.compose.foundation.layout.Arrangement
|
|
|
+import androidx.compose.foundation.layout.Box
|
|
|
+import androidx.compose.foundation.layout.Column
|
|
|
+import androidx.compose.foundation.layout.PaddingValues
|
|
|
+import androidx.compose.foundation.layout.Row
|
|
|
+import androidx.compose.foundation.layout.defaultMinSize
|
|
|
+import androidx.compose.foundation.layout.fillMaxSize
|
|
|
+import androidx.compose.foundation.layout.fillMaxWidth
|
|
|
+import androidx.compose.foundation.layout.height
|
|
|
+import androidx.compose.foundation.layout.offset
|
|
|
+import androidx.compose.foundation.layout.padding
|
|
|
+import androidx.compose.foundation.layout.size
|
|
|
+import androidx.compose.foundation.shape.RoundedCornerShape
|
|
|
+import androidx.compose.material.icons.Icons
|
|
|
+import androidx.compose.material.icons.filled.Home
|
|
|
+import androidx.compose.material.icons.filled.Person
|
|
|
+import androidx.compose.material3.Icon
|
|
|
+import androidx.compose.material3.Scaffold
|
|
|
+import androidx.compose.material3.Text
|
|
|
+import androidx.compose.runtime.Composable
|
|
|
+import androidx.compose.runtime.IntState
|
|
|
+import androidx.compose.runtime.mutableIntStateOf
|
|
|
+import androidx.compose.runtime.remember
|
|
|
+import androidx.compose.ui.Alignment
|
|
|
+import androidx.compose.ui.Modifier
|
|
|
+import androidx.compose.ui.draw.clip
|
|
|
+import androidx.compose.ui.graphics.Color
|
|
|
+import androidx.compose.ui.graphics.vector.ImageVector
|
|
|
+import androidx.compose.ui.text.style.TextAlign
|
|
|
+import androidx.compose.ui.unit.dp
|
|
|
+import androidx.compose.ui.unit.sp
|
|
|
+import androidx.lifecycle.viewmodel.compose.viewModel
|
|
|
+import com.iscs.bozzys.ui.base.PageBase
|
|
|
+import com.iscs.bozzys.ui.pages.vm.VMHome
|
|
|
+
|
|
|
+/**
|
|
|
+ * 打开主页面
|
|
|
+ */
|
|
|
+fun Context.openPageHome() {
|
|
|
+ startActivity(Intent(this, PageHome::class.java))
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * App主页面
|
|
|
+ */
|
|
|
+class PageHome : PageBase() {
|
|
|
+
|
|
|
+ @Composable
|
|
|
+ override fun GetViews(pv: PaddingValues) {
|
|
|
+ Home(pv)
|
|
|
+ }
|
|
|
+
|
|
|
+ @Composable
|
|
|
+ fun Home(pv: PaddingValues, vm: VMHome = viewModel()) {
|
|
|
+ val navIndex = remember { mutableIntStateOf(0) }
|
|
|
+ Scaffold(
|
|
|
+ modifier = Modifier.fillMaxSize(),
|
|
|
+ bottomBar = { CreateNavigationBar(pv, Color(0xFFFFFFFF), navIndex, onClick = { navIndex.intValue = it }) }
|
|
|
+ ) { ip ->
|
|
|
+ Box(
|
|
|
+ modifier = Modifier
|
|
|
+ .padding(PaddingValues(bottom = ip.calculateBottomPadding() - pv.calculateBottomPadding()))
|
|
|
+ .fillMaxSize()
|
|
|
+ ) {
|
|
|
+ HomeCompose(pv, if (navIndex.intValue == 0) 99f else 0f)
|
|
|
+ MyCompose(pv, if (navIndex.intValue == 1) 99f else 0f)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建底部导航栏
|
|
|
+ */
|
|
|
+ @Composable
|
|
|
+ fun CreateNavigationBar(pv: PaddingValues, bgColor: Color, navIndex: IntState, onClick: (value: Int) -> Unit) {
|
|
|
+ val navs = listOf(
|
|
|
+ NavBarItem("首页", Icons.Default.Home, Color(0xFF1779FF), Color(0xFF191919)),
|
|
|
+ NavBarItem("我的", Icons.Default.Person, Color(0xFF1779FF), Color(0xFF191919))
|
|
|
+ )
|
|
|
+ Row(
|
|
|
+ modifier = Modifier
|
|
|
+ .fillMaxWidth()
|
|
|
+ .background(bgColor)
|
|
|
+ .padding(PaddingValues(bottom = pv.calculateBottomPadding()))
|
|
|
+ ) {
|
|
|
+ navs.forEachIndexed { index, nav ->
|
|
|
+ Box(
|
|
|
+ modifier = Modifier
|
|
|
+ .weight(1.0f)
|
|
|
+ .height(44.dp)
|
|
|
+ .clickable(interactionSource = remember { MutableInteractionSource() }, indication = null, onClick = { onClick(index) }),
|
|
|
+ ) {
|
|
|
+ Column(
|
|
|
+ verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally,
|
|
|
+ modifier = Modifier.align(Alignment.Center)
|
|
|
+ ) {
|
|
|
+ Icon(
|
|
|
+ nav.icon, contentDescription = null,
|
|
|
+ modifier = Modifier
|
|
|
+ .size(26.dp),
|
|
|
+ tint = if (navIndex.intValue == index) nav.selectedColor else nav.unselectedColor
|
|
|
+ )
|
|
|
+ Text(
|
|
|
+ nav.title,
|
|
|
+ fontSize = 10.sp,
|
|
|
+ lineHeight = 10.sp,
|
|
|
+ color = if (navIndex.intValue == index) nav.selectedColor else nav.unselectedColor
|
|
|
+ )
|
|
|
+ }
|
|
|
+ Text(
|
|
|
+ "1", color = Color.White, modifier = Modifier
|
|
|
+ .offset(x = 10.dp)
|
|
|
+ .defaultMinSize(14.dp, 14.dp)
|
|
|
+ .clip(RoundedCornerShape(14.dp))
|
|
|
+ .background(Color.Red)
|
|
|
+ .align(Alignment.TopCenter)
|
|
|
+ .padding(top = 1.dp),
|
|
|
+ textAlign = TextAlign.Center,
|
|
|
+ fontSize = 10.sp,
|
|
|
+ lineHeight = 10.sp
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 底部导航栏对象
|
|
|
+ *
|
|
|
+ * @param title 导航栏名称
|
|
|
+ * @param icon 图标
|
|
|
+ * @param selectedColor 选中的颜色
|
|
|
+ * @param unselectedColor 未选中的颜色
|
|
|
+ */
|
|
|
+data class NavBarItem(val title: String, val icon: ImageVector, val selectedColor: Color, val unselectedColor: Color)
|