Android 自定义Textview实现文字两端对齐功能和长按自由选择文字弹出自定义ActionMenu功能(二)自定义ActionMenu

本文详细介绍了如何在Android中自定义TextView以实现文字两端对齐和长按选择文字时弹出自定义ActionMenu。由于原生TextView的setCustomActionMenuCallBack接口在某些定制ROM中被屏蔽,作者通过创建自定义菜单、提供点击事件接口以及处理触摸事件来实现这一功能。文章还提到了与原生TextView相比的优缺点,包括自定义程度、光标滚动和性能问题。
摘要由CSDN通过智能技术生成

写在前面:
去年年初本来计划写完这一系列文章的,结果一拖再拖,转眼就又一年过去了,今年决定定制一个计划,好好写博客,再也不拖拖拉拉的了~~

这篇文章主要讲解如何自定义TextView的长按文字弹出ActionMenu的功能。在上一篇里已经介绍了文字两端对齐处理长按选择文字并高亮文本 这两部分,在阅读这篇文章前,如果没有读过上一篇,建议点这里了解一下,这样更有助于熟悉这一篇要介绍的内容。

在上一篇里曾提到,TextView本身提供了可以定制选择文字弹出菜单的接口(textview的setCustomActionMenuCallBack()方法),但是国内厂商的定制化rom把这个接口屏蔽掉了,因此,这个方法就不能保证在所有手机都能实现我们想要的功能。这也是写这篇文章的原因。

那么如何自定义一个ActionMenu呢?具体的思路如下:

1.自定义一个弹出菜单
2.提供自定义菜单选项点击事件的接口,用以处理菜单点击事件
3.重写屏幕触摸事件,当检测到长按选择文字事件时,在手指抬起之后,弹出菜单

下面具体说明一下每一步的操作:

1.自定义一个弹出菜单

首先定义一个ActionMenu类,用来管理菜单选项的添加和删除等工作。这里我们通过用代码的方式创建了一个自定义LinearLayout。废话不多,看代码:

public class ActionMenu extends LinearLayout {
   

   ... 省略了部分代码...

    private void init() {
        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 45);
        setLayoutParams(params);
        setPadding(25, 0, 25, 0);
        setOrientation(HORIZONTAL);
        setGravity(Gravity.CENTER);
        setActionMenuBackGround(mActionMenuBgColor);
        mMenuItemMargin = 25;
    }

    /**
     * 添加自定义MenuItem标题
     *
     * @param itemTitleList MenuItem标题
     */
    public void addCustomMenuItem(List<String> itemTitleList) {
        this.mItemTitleList = itemTitleList;
    }

    /**
     * 添加自定义MenuItem
     */
    void addCustomItem() {
        if (null == mItemTitleList || (null != mItemTitleList && mItemTitleList.size() == 0))
            return;
        // 去重
        List<String> list = new ArrayList();
        for (Iterator it = mItemTitleList.iterator(); it.hasNext(); ) {
            String title = (String) it.next();
            if (!list.contains(title))
                list.add(title);
        }

        for (int i = 0; i < list.size(); i++) {
            final View menuItem = createMenuItem(list.get(i));
            addView(menuItem);
        }
        invalidate();
    }

    /**
     * 创建MenuItem
     */
    private View createMenuItem(final String itemTitle) {
        final TextView menuItem = new TextView(mContext);
        LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
        params.leftMargin = params.rightMargin = mMenuItemMargin;
        menuItem.setLayoutParams(params);

        menuItem.setTextSize(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值