Android 4.0笔记——ActionMenuItemView长按反馈的实现

长按ActionBar中的Menu菜单,会弹出提示框(实际上是一个Toast),如下图所示。


现在来看看它的实现方式:

其中的Menu选项,实为ActionMenuItemView类(frameworks/base/core/java/com/android/internal/view/menu/ActionMenuItemView)。

ActionMenuItemView.onLongClick() 代码如下。

    @Override
    public boolean onLongClick(View v) {
        if (hasText()) {
            // Don't show the cheat sheet for items that already show text.
            return false;
        }

        final int[] screenPos = new int[2];
        final Rect displayFrame = new Rect();
        getLocationOnScreen(screenPos);
        getWindowVisibleDisplayFrame(displayFrame);

        final Context context = getContext();
        final int width = getWidth();
        final int height = getHeight();
        final int midy = screenPos[1] + height / 2;
        final int screenWidth = context.getResources().getDisplayMetrics().widthPixels;

        Toast cheatSheet = Toast.makeText(context, mItemData.getTitle(), Toast.LENGTH_SHORT);
        if (midy < displayFrame.height()) {
            // Show along the top; follow action buttons
            cheatSheet.setGravity(Gravity.TOP | Gravity.RIGHT,
                    screenWidth - screenPos[0] - width / 2, height);
        } else {
            // Show along the bottom center
            cheatSheet.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, height);
        }
        cheatSheet.show();
        return true;
    }

代码分析:

        “hasText()”,判断该MenuItem是否已显示了文字。如果是,则不显示提示框;如果否,代码继续往下;

        “getLocationOnScreen(int[] location)”,获取该MenuItem在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度。与这个方法类似的“getLocationInWindow(int[] location)”,它获取的是在当前窗口内的绝对坐标;

         “getWindowVisibleDisplayFrame(Rect outRect)”,获取当前窗口的显示区域;

          接下去的代码就是创建一个Toast,并设置它的Gravity及偏移量。


这段代码可以很容易移植到自己的控件中,以实现类似的长按反馈。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值