JetpackCompose从入门到实战学习笔记11——在compose中使用DropdownMenu

JetpackCompose从入门到实战学习笔记11——在compose中使用DropdownMenu

1.简介:

DropdownMenu:

下拉列表菜单,菜单具有一个切换按钮,它是生成菜单的元素。例如一个图标,点击该图标可以触发菜单。 DropdownMenu的内容可以是DropdownMenuItems,也可以是自定义内容。

@Composable
fun DropdownMenu(
    expanded: Boolean?,
    onDismissRequest: (() -> Unit)?,
    modifier: Modifier? = Modifier,
    offset: DpOffset? = DpOffset(0.dp, 0.dp),
    properties: PopupProperties? = PopupProperties(focusable = true),
    content: (@Composable @ExtensionFunctionType ColumnScope.() -> Unit)?
): Unit

2.各个属性参数的含义:

参数描述类型
expanded是否展开boolean
onDismissRequest在菜单关闭时调用Unit
offset设置偏移量float
properties可以设置 focusable、dismissOnBackPress、dismissOnClickOutside、securePolicyboolean

3.简单使用:

package com.example.dropdowncomposedemo

import android.os.Bundle
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
import androidx.compose.material.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.dropdowncomposedemo.ui.theme.DropDownComposeDemoTheme

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DropDownComposeDemoTheme {
                LazyColumn(modifier = Modifier.fillMaxSize(),
                verticalArrangement = Arrangement.spacedBy(16.dp),
                contentPadding = PaddingValues(16.dp)//添加内容间距
                ){
                    items(
                        listOf(
                            "Philipp",
                            "Martin",
                            "Carl",
                            "John",
                            "Jake",
                            "Melanie",
                            "Tony",
                            "Tom",
                            "JoJo",
                            "Mary",
                            "Jack",
                            "Henry",
                            "James",
                            "MiMi",
                            "Hank",
                        )
                    ){ name ->
                        PersonItem(personName = name.toString(), dropDownItems = listOf(
                            DropDownItem("点赞"),
                            DropDownItem("评论"),
                            DropDownItem("收藏"),
                        ), onItemClick = {
                            Toast.makeText(applicationContext,it.text,Toast.LENGTH_LONG).show()
                        })
                    }
                }
            }
        }
    }
}

4.PersonItem类:

/**
 *@author: njb
 *@date:  2023/3/30 23:02
 *@desc:
 */
data class DropDownItem(
    val text: String
)

@Composable
fun PersonItem(
    personName: String,
    dropDownItems: List<DropDownItem>,
    modifier: Modifier = Modifier,
    onItemClick: (DropDownItem) -> Unit
) {
    var isContextMenuVisible by rememberSaveable {
        mutableStateOf(false)
    }
    var pressOffset by remember {
        mutableStateOf(0.dp)
    }
    var itemHeight by remember {
        mutableStateOf(0.dp)
    }
    val density = LocalDensity.current
    val interactionSource = remember {
        MutableInteractionSource()
    }

    Card(
        elevation = 4.dp,
        modifier = modifier
            .onSizeChanged {
                itemHeight = with(density) { it.height.toDp() }
            }
    ) {
        Box(modifier = Modifier
            .fillMaxWidth()
            .indication(interactionSource, LocalIndication.current)
            .pointerInput(true) {
                detectTapGestures(
                    onLongPress = {
                        isContextMenuVisible = true
                    },
                    onPress = {
                        isContextMenuVisible = true
                        val press = PressInteraction.Press(it)
                        interactionSource.emit(press)
                        tryAwaitRelease()
                        interactionSource.emit(PressInteraction.Release(press))
                    }
                )
            }
            .padding(16.dp)
        ) {
            Text(text = personName)
        }
        DropdownMenu(
            expanded = isContextMenuVisible,
            offset = DpOffset(x= 10.dp,y = 10.dp),
                    onDismissRequest = { isContextMenuVisible = false }) {
            dropDownItems.forEach { item ->
                run {
                    DropdownMenuItem(
                        onClick = {
                            onItemClick(item)
                            isContextMenuVisible = false
                        }
                    )
                    {
                        Text(text = item.text)
                    }
                }
            }
        }
    }
}

5.实现效果如下:

在这里插入图片描述

在这里插入图片描述

6.源码地址:

https://gitee.com/jackning_admin/drop-down-compose-demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值