转:仿QQ长按弹出功能菜单

android app普遍常用的弹出上下文菜单是列表式的。QQ列表,在上方弹出冒泡效果菜单,如图

这里讲解一下如何写出这个效果:

图片资源:两张图片,可以拼接成如上效果。

首先,我们需要写布局文件: 
layout_pop.xml (mipmap是android studio 的引用图片的写法,以前常用@drawable/xxx)

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

    <Button
        android:id="@+id/bt_l"
        style="@style/PopBtuton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/bg_pop_l_t"
        android:text="复制" />

    <Button
        android:id="@+id/bt_r"
        style="@style/PopBtuton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/bt_l"
        android:background="@mipmap/bg_pop_r_t"
        android:text="回复" />

</RelativeLayout>

布局效果 

接下来是重点: 
先贴代码 
PopOptionUtil.java

package com.mjc.popdemo;

import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;

/**
 * Created by imac on 15/7/8.
 */
public class PopOptionUtil {

    private Context mContext;
    private int popupWidth;
    private int popupHeight;
    private PopupWindow popupWindow;
    private PopClickEvent mEvent;
    private Button preBt;
    private Button nextBt;

    public PopOptionUtil(Context context) {
        mContext = context;
        View popupView = LayoutInflater.from(mContext).inflate(R.layout.layout_pop, null);
        preBt = (Button) popupView.findViewById(R.id.bt_l);
        nextBt = (Button) popupView.findViewById(R.id.bt_r);
        popupWindow = new PopupWindow(popupView, ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT, true);
        popupWindow.setBackgroundDrawable(new BitmapDrawable());
        popupView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        popupWidth = popupView.getMeasuredWidth();
        popupHeight = popupView.getMeasuredHeight();
    }

    public void show(View view) {
        initEvent();
        int[] location = new int[2];
        view.getLocationOnScreen(location);
        popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, (location[0] + view.getWidth() / 2) - popupWidth / 2,
                location[1] - popupHeight);
    }

    public void setOnPopClickEvent(PopClickEvent mEvent) {
        this.mEvent = mEvent;
    }

    private void initEvent() {
        if (mEvent != null) {
            preBt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mEvent.onPreClick();
                }
            });
            nextBt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    mEvent.onNextClick();
                }
            });

        }
    }
}

其中Event是自定义的接口,用来监听两个Button的事件的

下面就是 
PopClickEvent.java

public interface PopClickEvent {
    public void onPreClick();
    public void onNextClick();
}

使用方法:

package com.mjc.popdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    View bt;
    PopOptionUtil mPop;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt = findViewById(R.id.test);
        mPop = new PopOptionUtil(this);
        mPop.setOnPopClickEvent(new PopClickEvent() {
            @Override
            public void onPreClick() {
                Toast.makeText(MainActivity.this,"置顶",Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onNextClick() {
                Toast.makeText(MainActivity.this,"删除",Toast.LENGTH_SHORT).show();
            }
        });
        bt.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                mPop.show(view);
                bt.setSelected(true);
                return true;
            }
        });
    }

}

最终效果: 

是不是很简单的呢?快动手试试吧

参考:http://blog.csdn.net/u011494050/article/details/38691475

http://blog.csdn.net/meijian531161724/article/details/46804281

时间: 2024-10-16 06:17:41

转:仿QQ长按弹出功能菜单的相关文章

仿QQ邮箱的弹出层,弹出确认框

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><HTML> <HEAD> <TITLE>QQ邮箱的弹出层</TITLE> <meta http-equiv="Content-Type" c

android 自定义控件二之仿QQ长按删除

自定义Dialog 1.先上个效果图: 虽然效果丑了点,但主要学习修改已有的控件,例如修改Dialog控件 2.一些基本的只是进行了解 Dialog: theme是Dialog的样式,常用样式为: <style name="MyDialogStyle" parent="@android:Theme.Dialog"> <item name="android:windowFrame">@null</item> &l

Android ListView两种长按弹出菜单方式

* 知识点1:ListView item:两种长按弹出菜单方式* 知识点2:ListView SimpleAdapter的使用*  知识点 3:在java代码中创建一个ListView*/ -----------------------------------------------------Activity[mw_shl_code=java,true]package org.gxl.com; public class ListOnLongClickActivity extends Activ

UIWebView禁用长按弹出copy选择框

本文参考http://bbs.9ria.com/thread-227539-1-1.html  感谢hbnana大神 第一种加载html文件 再webview的加载完成的代理方法中添加一下代码 //禁止长按弹出图片的地址等 [self.webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none';"]; //禁止长按复制 [self.webView strin

UIWebView长按弹出菜单显示英文解决办法

UIWebView加载网页后,长按弹出菜单,显示如下英文菜单样式: 在Info.plist中添加CFBundleLocalizations字段,并增加zh_CN元素,即可将上述菜单显示为中文. UIWebView长按弹出菜单显示英文解决办法

Android——长按弹出菜单、获取当前所按的item的信息

ListView 中有多个选项,长按每个选项,都能弹出一个上下文菜单,并能获取所按选项的详细信息. 关键步骤: private static final int DELETE_ID = Menu.FIRST + 1;//使用Menu.FIRST常量而不使用其他常量的原因:程序封装的变量 用起来不占内存 程序读的快 不容易出错 private static final int EDIT_ID=Menu.FIRST + 2; private static final int VIEW_ID=Menu

ListView的使用(二)长按弹出上下文菜单

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list); mDbHelper = new DiaryDbAdapter(this); mDbHelper.open(); renderListView(); ListView mylistView = getListView(); mylistView.setOnCreate

仿复制粘贴功能,长按弹出tips的实现

方案分析: 方案一:监听长按事件弹出PopupWindow[可行,缺点布局是固定的,小语种下会出现菜单截断现象] 方案二:弹出ContextMenu[不可行,因为ContextMenu的菜单是上下排列] 方案三:通过hierarchyviewer.bat查看可知,Editor的复制粘贴功能用的是toolbar,利用此功能也可实现[可行,代码量大] 方案四:通过查看Editor源码分析可知,只需要实现ActionMode.CallBack2接口,setMode即可实现[可行,简单实现接口,再添加少

仿手机卫士打电话弹出归属地

所要实现的功能如下图 no tu no bb 实现此功能需要解决一下问题 1,来电号码所在地址怎么解决?答:从数据库里面获取,数据库从哪来?从百度,google.soga! 2,怎么知道什么时候来电or去电?答:监听系统广播 3,怎么知道来电or去电人的姓名和号码归属地答:通过内容提供者来获取! 4,弹出的窗口怎么来做?答:用popupwindow ? 否 我们经常在service 或者 BroadcastReceiver里面弹出Toast, 我们这里就用Toast做,通过WindowManag