Android UI设计与开发之PopupWindow仿腾讯新闻底部弹出菜单
程序员文章站
2023-12-13 09:28:52
前一篇文章中有用到 popupwindow 来实现弹窗的功能。简单介绍以下吧。
官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图。出现的弹出窗口是一个浮...
前一篇文章中有用到 popupwindow 来实现弹窗的功能。简单介绍以下吧。
官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图。出现的弹出窗口是一个浮动容器的当前活动。
1.首先来个简单的栗子,效果如下:
只有两个布局文件,一个是弹窗布局(只有一张图片),一个是主界面布局(只有一个按钮)。
然后在主界面代码中实例 popupwindow ,指定弹出的界面,在按钮点击事件中显示或隐藏弹窗就可以了,代码如下:
package com.yanis.demo; import android.app.activity; import android.os.bundle; import android.view.layoutinflater; import android.view.view; import android.view.view.onclicklistener; import android.widget.button; import android.widget.linearlayout.layoutparams; import android.widget.popupwindow; public class popupwindowactivity extends activity { popupwindow pop; button btn; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_popup_window); btn = (button) findviewbyid(r.id.btnshowwindow); layoutinflater inflater = layoutinflater.from(this); // 引入窗口配置文件 - 即弹窗的界面 view view = inflater.inflate(r.layout.my_popup_window, null); // popupwindow实例化 pop = new popupwindow(view, layoutparams.wrap_content, layoutparams.wrap_content, false); btn.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { if (pop.isshowing()) { // 隐藏窗口,如果设置了点击窗口外消失,则不需要此方式隐藏 pop.dismiss(); } else { // 弹出窗口显示内容视图,默认以锚定视图的左下角为起点,这里为点击按钮 pop.showasdropdown(v); } } }); } }
2.知道了怎么实现 popupwindow 弹窗,利用其特性替换系统自带的菜单栏,来个仿腾讯新闻的菜单吧,效果图如下:
布局什么的花点时间,慢慢调,自然就出来了,主要还是主界面的逻辑代码啊,菜单就是通过 popupwindow 来显示的,具体代码如下:
package com.yanis.popup_window; import android.app.activity; import android.app.alertdialog; import android.content.dialoginterface; import android.graphics.drawable.bitmapdrawable; import android.os.bundle; import android.util.log; import android.view.gravity; import android.view.keyevent; import android.view.layoutinflater; import android.view.view; import android.view.view.onclicklistener; import android.view.view.onkeylistener; import android.widget.button; import android.widget.imageview; import android.widget.linearlayout.layoutparams; import android.widget.popupwindow; import android.widget.textview; import android.widget.toast; public class mainactivity extends activity implements onclicklistener, onkeylistener { popupwindow pop; textview hideview; button btncancel; imageview btnnight, btnword, btnexit; view view; boolean isout, isin;// 是否弹窗显示 @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initview(); initdata(); } /** * 初始化组件 */ private void initview() { hideview = (textview) findviewbyid(r.id.hideview); layoutinflater inflater = layoutinflater.from(this); // 引入窗口配置文件 - 即弹窗的界面 view = inflater.inflate(r.layout.menu_view, null); btnnight = (imageview) view.findviewbyid(r.id.btnnight); btnword = (imageview) view.findviewbyid(r.id.btnword); btnexit = (imageview) view.findviewbyid(r.id.btnexit); btncancel = (button) view.findviewbyid(r.id.btncancel); } /** * 初始化数据 */ private void initdata() { btnnight.setonclicklistener(this); btnword.setonclicklistener(this); btnexit.setonclicklistener(this); btncancel.setonclicklistener(this); view.setfocusableintouchmode(true); view.setonkeylistener(this); // popupwindow实例化 pop = new popupwindow(view, layoutparams.match_parent, layoutparams.wrap_content, true); /** * popupwindow 设置 */ // pop.setfocusable(true); //设置popupwindow可获得焦点 // pop.settouchable(true); //设置popupwindow可触摸 // pop.setoutsidetouchable(true); // 设置非popupwindow区域可触摸 // 设置popupwindow显示和隐藏时的动画 pop.setanimationstyle(r.style.menuanimationfade); /** * 改变背景可拉的弹出窗口。后台可以设置为null。 这句话必须有,否则按返回键popwindow不能消失 或者加入这句话 * colordrawable dw = new * colordrawable(-00000);pop.setbackgrounddrawable(dw); */ pop.setbackgrounddrawable(new bitmapdrawable()); } /** * 按钮点击事件监听 * * @param v */ @override public void onclick(view v) { switch (v.getid()) { case r.id.btnnight: changepopupwindowstate(); toast.maketext(mainactivity.this, "你点击了夜间模式", toast.length_short) .show(); break; case r.id.btnword: changepopupwindowstate(); toast.maketext(mainactivity.this, "你点击了文本模式", toast.length_short) .show(); break; case r.id.btnexit: exitthedemo(); break; case r.id.btncancel: changepopupwindowstate(); break; } } /** * 退出程序 */ private void exitthedemo() { changepopupwindowstate(); new alertdialog.builder(mainactivity.this).setmessage("确定退出这个 demo 吗?") .setpositivebutton("确定", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { finish(); } }).setnegativebutton("取消", null).show(); } /** * 改变 popupwindow 的显示和隐藏 */ private void changepopupwindowstate() { if (pop.isshowing()) { // 隐藏窗口,如果设置了点击窗口外消失,则不需要此方式隐藏 pop.dismiss(); } else { // 弹出窗口显示内容视图,默认以锚定视图的左下角为起点,这里为点击按钮 pop.showatlocation(hideview, gravity.bottom, 0, 0); } } // called when a key was pressed down and not handled by any of the views // inside of the activity @override public boolean onkeydown(int keycode, keyevent event) { switch (keycode) { case keyevent.keycode_menu:// 菜单键监听 isout = true; changepopupwindowstate(); break; } return super.onkeydown(keycode, event); } // called when a hardware key is dispatched to a view. @override public boolean onkey(view v, int keycode, keyevent event) { switch (keycode) { case keyevent.keycode_menu: if (isout && !isin) { isout = false; isin = true; } else if (!isout && isin) { isin = false; changepopupwindowstate(); } break; } return false; } }
源代码地址:https://github.com/yexiaochao/yc_ui_popup_window
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。