欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-13 09:28:52
前一篇文章中有用到 popupwindow 来实现弹窗的功能。简单介绍以下吧。 官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图。出现的弹出窗口是一个浮...

前一篇文章中有用到 popupwindow 来实现弹窗的功能。简单介绍以下吧。

官方文档是这样解释的:这就是一个弹出窗口,可以用来显示一个任意视图。出现的弹出窗口是一个浮动容器的当前活动。

1.首先来个简单的栗子,效果如下:

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

只有两个布局文件,一个是弹窗布局(只有一张图片),一个是主界面布局(只有一个按钮)。

然后在主界面代码中实例 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 弹窗,利用其特性替换系统自带的菜单栏,来个仿腾讯新闻的菜单吧,效果图如下:

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

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

上一篇:

下一篇: