Android kotlin 实现长按TextView弹出自定义复制+全选框+PopupWindow的功能

一、测试
第一图CSDN APP原效果,第二gif和第三图实现:

二、项目,Module项目代码中可以看,最好不要改

三、理解
1.MainActivity.kt代码,看一下说明

class MainActivity : AppCompatActivity() {

    private var mSelectableTextHelper: SelectableTextHelper? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mSelectableTextHelper = SelectableTextHelper.Builder(tv_test)
             //选中文本的背景颜色
            .setSelectedColor(resources.getColor(R.color.selected_blue))
            //游标的大小
            .setCursorHandleSizeInDp(20f)
            //选择游标的颜色
            .setCursorHandleColor(resources.getColor(R.color.cursor_handle_color))
            .build()
    }
}

整个自定义的复制全选功能视图上主要有三个部分:

  • 操作框
  • 选中文本
  • 选择游标

在具体实现中有以下要点:

  • 自定义选择游标,可以拖动定位选中文本,大小可以设置
  • 文本的选中状态
  • 操作框的显示,以及对应操作的处理
  • 在可滑动布局中的特殊处理,例如在ScrollView中,当视图滚动时隐藏或者移动选择游标,隐藏操作框,停止滑动时重新显示选择游标和操作框
  • 选中文本后,点击TextView取消选择

2.Module项目library中有两个视图布局,1、操作框无箭头,2、操作框有箭头

layout_operate_windows.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_operate_window"
    android:orientation="horizontal"
    android:paddingLeft="5dp"
    android:paddingRight="5dp">

    <TextView
        android:id="@+id/tv_copy"
        android:text="@string/copy"
        style="@style/OperateTextView"/>

    <TextView
        android:id="@+id/tv_select_all"
        android:text="@string/select_all"
        style="@style/OperateTextView"/>
</LinearLayout>

layout_operate_windows2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/linearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/bg_operate_window"
        android:orientation="horizontal"
        android:paddingLeft="5dp"
        android:paddingRight="5dp">

        <TextView
            android:id="@+id/tv_copy"
            style="@style/OperateTextView"
            android:text="@string/copy" />

        <TextView
            android:id="@+id/tv_select_all"
            style="@style/OperateTextView"
            android:text="@string/select_all" />
    </LinearLayout>

    <ImageView
        android:id="@+id/iv_triangle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/tv_copy"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="41dp"
        android:layout_marginEnd="245dp"
        android:layout_marginRight="253dp"
        android:src="@drawable/triangle_down" />
</RelativeLayout>

四、下载源码github地址:Kotlin 实现长按TextView弹出自定义复制+全选框+PopupWindow的功能

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好,关于您的问题,我可以提供以下 Kotlin 代码示例来实现文本弹出系统复制弹窗: ``` @Composable fun LongPressCopyText(text: String) { val clipboardManager = LocalClipboardManager.current var showCopyPopup by remember { mutableStateOf(false) } Text( text = text, modifier = Modifier .longPressGesture( onPress = { showCopyPopup = true }, onLongPress = { showCopyPopup = true }, onLongPressEnd = { showCopyPopup = false } ), style = MaterialTheme.typography.body1 ) DropdownMenu( expanded = showCopyPopup, onDismissRequest = { showCopyPopup = false }, modifier = Modifier.widthIn(max = 180.dp) ) { DropdownMenuItem(onClick = { clipboardManager.setText(ClipDataHelper.getTextClipData(text)) showCopyPopup = false }) { Text("复制") } } } ``` 上述代码中,我们先创建了一个 `LongPressCopyText` 的 Composable 组件来渲染需要复制文本。在这个 Composable 中,我们通过 `Modifier.longPressGesture` 来给组件添加按和短按事件。当触发按事件时,我们设置 showCopyPopup 为 true,这会显示出拷贝菜单。当手指松开后,我们再将 showCopyPopup 设置为 false,菜单会消失。 菜单的内容由 `DropdownMenu` 组件来呈现,其中使用了 `DropdownMenuItem` 来实现拷贝按钮。当菜单的拷贝按钮被点击时,我们通过 `clipboardManager.setText` 来将文本内容设置到剪切板中。 希望这个示例代码对您有所帮助,如果还有什么问题,请随时与我交流。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬sir哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值