写在前面:
去年年初本来计划写完这一系列文章的,结果一拖再拖,转眼就又一年过去了,今年决定定制一个计划,好好写博客,再也不拖拖拉拉的了~~
这篇文章主要讲解如何自定义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(