android自定义popupwindow仿微信右上角弹出菜单效果
程序员文章站
2024-02-28 09:29:28
微信右上角的操作菜单看起来很好用,就照着仿了一下,不过是旧版微信的,手里刚好有一些旧版微信的资源图标,给大家分享一下。
不知道微信是用什么实现的,我使用popupwi...
微信右上角的操作菜单看起来很好用,就照着仿了一下,不过是旧版微信的,手里刚好有一些旧版微信的资源图标,给大家分享一下。
不知道微信是用什么实现的,我使用popupwindow来实现,主要分为几块内容:
1、窗口布局文件:popwin_share.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/title_tools_bg" android:orientation="vertical" > <linearlayout android:id="@+id/layout_share" style="@style/fill_width" android:orientation="horizontal" android:background="@drawable/menu_left_item_selector" android:padding="5dp"> <imageview android:layout_marginleft="7dp" style="@style/wrap" android:scaletype="fitcenter" android:src="@drawable/share" /> <textview style="@style/wrap" android:textcolor="@color/white" android:textsize="@dimen/text18" android:layout_marginleft="5dp" android:text="分享内容" /> </linearlayout> <linearlayout android:id="@+id/layout_copy" style="@style/fill_width" android:orientation="horizontal" android:background="@drawable/menu_left_item_selector" android:padding="5dp"> <imageview android:layout_marginleft="5dp" style="@style/wrap" android:scaletype="fitcenter" android:src="@drawable/copy_pressed" /> <textview style="@style/wrap" android:textcolor="@color/white" android:textsize="@dimen/text18" android:layout_marginleft="5dp" android:text="复制结果" /> </linearlayout> </linearlayout>
采用线性布局,因为里面是一行一行竖排的菜单,线性布局更容易控制。大布局里面放了两个垂直排列的线性布局,每个线性布局中分别有横向排列的imageview和textview,很简单的布局。大布局的背景用了一个图片,当然也可以自定义一些其他颜色。
2、popupwindow代码,我这里是自定义一个popupwindows类,继承自popupwindow:
package com.xjw.view; import com.xjw.translate.r; import android.app.activity; import android.graphics.drawable.colordrawable; import android.view.layoutinflater; import android.view.view; import android.widget.adapterview; import android.widget.baseadapter; import android.widget.linearlayout; import android.widget.listview; import android.widget.popupwindow; /** * 项目名称:translate * 实现功能: 翻译详情界面,分享弹出窗口 * 类名称:popwinshare * 类描述:(该类的主要功能) * 创建人:徐纪伟 * e-mail: xujiwei558@126.com * 创建时间:2014年10月18日 下午4:37:25 * @version */ public class popwinshare extends popupwindow{ private view mainview; private linearlayout layoutshare, layoutcopy; public popwinshare(activity paramactivity, view.onclicklistener paramonclicklistener, int paramint1, int paramint2){ super(paramactivity); //窗口布局 mainview = layoutinflater.from(paramactivity).inflate(r.layout.popwin_share, null); //分享布局 layoutshare = ((linearlayout)mainview.findviewbyid(r.id.layout_share)); //复制布局 layoutcopy = (linearlayout)mainview.findviewbyid(r.id.layout_copy); //设置每个子布局的事件监听器 if (paramonclicklistener != null){ layoutshare.setonclicklistener(paramonclicklistener); layoutcopy.setonclicklistener(paramonclicklistener); } setcontentview(mainview); //设置宽度 setwidth(paramint1); //设置高度 setheight(paramint2); //设置显示隐藏动画 setanimationstyle(r.style.animtools); //设置背景透明 setbackgrounddrawable(new colordrawable(0)); } }
里面提供了一个构造方法,包含四个参数,第一个参数是上下文的activity,第二个是菜单的点击事件,从外边传递进来的,要绑定给每一行的菜单,具体的事件实现当然要写在activity中,后面两个分别是弹出窗口的宽度和高度。里面还包含了一个动画样式,窗口打开和关闭时出现动画的样式。
3、动画样式,显示动画,缩放动画:push_in.xml
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromxscale="1.0" android:toxscale="1.0" android:fromyscale="0" android:toyscale="1.0" android:pivotx="0" android:pivoty="10%" android:duration="200" />
关闭动画,也是缩放动画:push_out.xml
<?xml version="1.0" encoding="utf-8"?> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:fromxscale="1.0" android:toxscale="1.0" android:fromyscale="1.0" android:toyscale="0" android:pivotx="0" android:pivoty="10%" android:duration="200" />
style样式定义:
<style name="animtools" parent="@android:style/animation"> <item name="android:windowenteranimation">@anim/push_in</item> <item name="android:windowexitanimation">@anim/push_out</item> </style>
到此为止我们的自定义窗口已经定义好了。接下来看使用。
if (popwinshare == null) { //自定义的单击事件 onclicklintener paramonclicklistener = new onclicklintener(); popwinshare = new popwinshare(translatedatacontentactivity.this, paramonclicklistener, displayutil.dip2px(context, 160), displayutil.dip2px(context, 160)); //监听窗口的焦点事件,点击窗口外面则取消显示 popwinshare.getcontentview().setonfocuschangelistener(new view.onfocuschangelistener() { @override public void onfocuschange(view v, boolean hasfocus) { if (!hasfocus) { popwinshare.dismiss(); } } }); } //设置默认获取焦点 popwinshare.setfocusable(true); //以某个控件的x和y的偏移量位置开始显示窗口 popwinshare.showasdropdown(btntools, 0, 0); //如果窗口存在,则更新 popwinshare.update();
每个子菜单的单击事件自定义内部类,在里面就可以写每个子菜单的单击事件啦,
class onclicklintener implements onclicklistener{ @override public void onclick(view v) { switch (v.getid()) { case r.id.layout_share: break; case r.id.layout_copy: break; default: break; } } }
效果预览:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。