Android UI设计与开发之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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-10 19:49:14

Android UI设计与开发之PopupWindow仿腾讯新闻底部弹出菜单的相关文章

Android UI设计与开发之ViewPager仿微信引导界面以及动画效果

基于前两篇比较简单的实例做铺垫之后,这一篇我们来实现一个稍微复杂一点的引导界面的效果,当然也只是稍微复杂了一点,对于会的人来说当然还是so easy!正所谓会者不难,难者不会,大概说的就是这个意思了吧.好的,话不多说,回归正题. 这篇要实现的是一个仿微信的动画效果,虽然这种效果的实现在网上到处都有,但是我还是想站在中低端开发者的角度去告诉大家是如何实现的,当然实现的方式有很多,我也只是列出了我认为实现起来比较方便的一种方法,希望大家能够受用. 一.实现的效果图 有图才有真相,上图先: 点击按钮后

Android UI设计与开发之ViewPager介绍和简单实现引导界面

做Android开发加起来差不多也有一年多的时间了,总是想写点自己在开发中的心得体会与大家一起交流分享.共同进步,刚开始写也不知该如何下手,仔细想了一下,既然是刚开始写,那就从一个软件给人最直观的感受--UI设计开始写起吧,循序渐进,娓娓道来.博主在这里和大家一起学习,希望能多多支持,话不多说,下面就开始讲解UI设计的第一篇. 在讲解如何实现引导界面的效果之前,我想先详细介绍一下ViewPager类的使用和说明,因为这是开发引导界面最重要的类,没有之一. 一.ViewPager实现的效果图 二.

Android中使用PopupWindow 仿微信点赞和评论弹出

微信朋友圈的点赞和评论功能,有2个组成部分:左下角的"更多"按钮:点击该按钮后弹出的对话框: PopupWindow,弹出框使用PopupWindow实现,这是点赞和评论的载体,具体要涉及 PopupWindow 点击非窗口位置和再次点击消失以及显示位置的问题(根据相应更多按钮的位置确定 PopupWindow 的显示位置 package com.example.cmm.helloworld; import android.app.AlertDialog; import android

Android仿网易严选底部弹出菜单效果

在网易严选的看东西的时候在商品详情页里看到他的底部弹出菜单,本能反应是想用DottomSheetDialog或者PopupWindow来实现,可是发现实现不了他那种效果,于是就自己模仿一个像严选这样的底部弹出菜单. 不管是DottomSheetDialog或者PopupWindow他们的阴影背景都是全部覆盖的,这就造成除了菜单内容的View之外其他都是阴影的,而严选不是这样的.唠叨到此,首先展示效果图如下: 是不是还可以呢,由于代码量不多却注释详细,所以先贴出代码再一一详说: BottomPop

Android使用Activity实现从底部弹出菜单或窗口的方法

本文实例讲述了Android使用Activity实现从底部弹出菜单或窗口的方法.分享给大家供大家参考,具体如下: 这里使用activity实现弹出滑动窗口或菜单,主要是使用了一些设置activity的样式来实现弹出窗口和滑动效果,实现如下: 第一步:设计要弹出窗口的xml布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://sche

Android UI设计系列之自定义ListView仿QQ空间阻尼下拉刷新和渐变菜单栏效果(8)_Android

好久没有写有关UI的博客了,刚刚翻了一下之前的博客,最近一篇有关UI的博客:Android UI设计系列之自定义Dialog实现各种风格的对话框效果(7) ,实现各种风格效果的对话框,在那篇博客写完后由于公司封闭开发封网以及其它原因致使博客中断至今,中断这么久很是惭愧,后续我会尽量把该写的都补充出来.近来项目有个需求,要做个和QQ空间类似的菜单栏透明度渐变和下拉刷新带有阻尼回弹的效果.于是花点时间动手试了试,基本上达到了QQ空间的效果,截图如下:         通过观察QQ空间的运行效果,发现

Android PopupWindow实现右侧、左侧和底部弹出菜单_Android

本教程为大家分享了Android PopupWindow弹出菜单的具体代码,供大家参考,具体内容如下 项目代码:http://xiazai.jb51.net/201611/yuanma/PopupLeftMenu(jb51.net).rar 项目SDK是5.1,建议将代码拷到自己的工程中去 代码如下: MainActivity类: package com.example.popupleftmenu; import android.app.Activity; import android.cont

Android PopupWindow实现右侧、左侧和底部弹出菜单

本教程为大家分享了Android PopupWindow弹出菜单的具体代码,供大家参考,具体内容如下 项目代码:http://xiazai.jb51.net/201611/yuanma/PopupLeftMenu(jb51.net).rar 项目SDK是5.1,建议将代码拷到自己的工程中去 代码如下: MainActivity类: package com.example.popupleftmenu; import android.app.Activity; import android.cont

Android 从底部弹出Dialog(横向满屏)的实例代码_Android

项目中经常需要底部弹出框,这里我整理一下其中我用的比较顺手的一个方式(底部弹出一个横向满屏的dialog). 效果图如下所示(只显示关键部分): 步骤如下所示: 1.定义一个dialog的布局(lay_share.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi