`
VIP庚
  • 浏览: 223300 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

PopupWindow 模拟通知弹出

阅读更多
最近遇到一个需求,下面记录下实现方法 以及遇到的一些坑

需求如下:当app在后台时 收到push消息用系统的Notification进行通知;当app在前台时 收到push后采用自定义风格弹出通知

效果如下:


第一种情况这里不探究  第二种情况这里采用PopWindow实现

步骤:

一 、实现自定义PopWindow类
public class TuyaPopWindow extends PopupWindow {

    private Activity mContext;

    private View view;

    //private ImageView iv_icon;
    private TextView tv_title;
    private TextView tv_content;

    private Handler mHandler;

    public TuyaPopWindow(View contentView, final Activity mContext) {
        super(contentView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.WRAP_CONTENT, true);
        this.view = contentView;
        this.mContext = mContext;
        L.d("huohuo", "mContext:" + mContext);
        mHandler = new Handler(mContext.getMainLooper());
        //this.iv_icon= (ImageView) contentView.findViewById(R.id.iv_push_icon);
        this.tv_title = (TextView) contentView.findViewById(R.id.tv_push_title);
        this.tv_content = (TextView) contentView.findViewById(R.id.tv_push_msg);

        tv_title.setText("设备:客厅插座");
        tv_content.setText("xxxxx");


        // 设置外部可点击

        // mMenuView添加OnTouchListener监听判断获取触屏位置如果在选择框外面则销毁弹出框
        this.view.setOnTouchListener(new View.OnTouchListener() {

            public boolean onTouch(View v, MotionEvent event) {

                //int height = view.findViewById(R.id.pop_layout).getTop();

                // int y = (int) event.getY();
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    //if (y < height) {
                    dismiss();
                    //}
                }
                return true;
            }
        });

        this.setFocusable(false);
        this.setTouchable(true);
        this.setOutsideTouchable(false);
        this.update();

        // 实例化一个ColorDrawable颜色为半透明
        this.setBackgroundDrawable(new BitmapDrawable());        // 设置弹出窗体的背景

        this.setAnimationStyle(R.style.take_photo_anim);
        this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

    }


    public void show() {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                //适配8.0系统
                TuyaPopWindow.this.showAtLocation((mContext.findViewById(android.R.id.content)), Gravity.NO_GRAVITY, 0, 0);
                //TuyaPopWindow.this.showAsDropDown(view, 0, 0);
            }
        });

        //2s 消失
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                TuyaPopWindow.this.dismiss();
            }
        }, 2000);

    }
}




二 、 定义PopWindow弹出位置
           TuyaPopWindow.this.showAtLocation((mContext.findViewById(android.R.id.content)), Gravity.NO_GRAVITY, 0, 0);


这里要注意的是不要用这个方法,因为在8.0系统上这样会显示在布局底部,具体原因待探究
TuyaPopWindow.this.showAsDropDown(view, 0, 0);

     
还有一点在设置popupWindow属性的时候 需要执行设置这个属性
this.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);


因为在4.0系统上会把状态栏算入布局中 这样会导致popupWindow覆盖掉状态栏

三、定义PopWindow 弹出动画
通过设置PopWindow的属性来实现
 this.setAnimationStyle(R.style.take_photo_anim);


这里要用到的是style属性

首先我们需要声明 进入和离开的动画

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="500"
        android:fromYDelta="-100%"
        android:toYDelta="0" />
    <alpha
        android:duration="500"
        android:fromAlpha="0.5"
        android:toAlpha="1.0" />
</set>


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="500"
        android:fromYDelta="0"
        android:toYDelta="-100%" />
    <alpha
        android:duration="500"
        android:fromAlpha="1.0"
        android:toAlpha="0.5" />
</set>



申明style
<style name="take_photo_anim" parent="android:Animation">
        <item name="android:windowEnterAnimation">@anim/pop_enter_anim</item>
        <item name="android:windowExitAnimation">@anim/pop_exit_anim</item>
    </style>



四、由于PopupWindow是依赖于Activity的,所以我们需要记录前台Activity
public class Constant {
     //前台 activity 栈
    private static LinkedList<Activity> foreActivityStack = new LinkedList<>();
   
    public static void attachForeActivity(Activity activity) {
        if (foreActivityStack.indexOf(activity) == -1) foreActivityStack.push(activity);
        //Log.e("huohuo","attachForeActivity  size:"+foreActivityStack.size()+"  push:"+activity);

    }

    public static void detachForeActivity(Activity activity) {

        foreActivityStack.remove(activity);
        //foreActivityStack.pop();
        //Log.e("huohuo","detachForeActivity size:"+foreActivityStack.size()+"  pop:"+activity);
    }

    public static Activity getForeActivity(){
        if(foreActivityStack.isEmpty())
            return null;
        //return foreActivityStack.peek().get();
        return foreActivityStack.peek();
    }
}


我们在每个Activity的onStart() onStop()方法中都调用
Constant.attachForeActivity(this);
Constant.detachForeActivity(this);


五、调用
if (Constant.getForeActivity() != null) {
            //应用在前台
            L.d(TAG, "getForeActivity true");
            View contentView = LayoutInflater.from(Constant.getForeActivity()).inflate(R.layout.push_custom_layout, null);
            TuyaPopWindow popWindow = new TuyaPopWindow(contentView,Constant.getForeActivity(), notify);
            popWindow.show();
        } 



  • 大小: 865.1 KB
分享到:
评论

相关推荐

    类似于popupwindow效果的Activity的Demo

    总的来说,这个Demo的核心在于利用自定义动画来模拟PopupWindow的弹出效果,同时通过NineOldAndroids库确保动画在各种Android版本上的兼容性。开发者可能使用了滑动动画,并结合appcompat_v7库提供了现代的用户界面...

    微信popupwindow

    在Android开发中,`PopupWindow` 是一个非常实用的组件,它允许我们创建弹出式窗口,可以在主界面之上显示一些额外的信息或者交互元素。在微信应用中,`PopupWindow` 被广泛用于实现各种功能,如消息通知、菜单选项...

    Android仿美团弹出框购物车

    - `PopupWindow`是Android中的一个类,用于创建浮动窗口,它可以模拟弹出框的效果。在本项目中,我们将使用`PopupWindow`来显示购物车内容,可以通过设置宽度、高度、背景透明度等属性来自定义其外观。 3. **数据...

    Android应用源码之仿微信标题栏右上角PopupWindow.zip

    本示例代码“Android应用源码之仿微信标题栏右上角PopupWindow”专注于实现一个类似微信应用中标题栏右上角的下拉弹出窗口(PopupWindow)。这个功能在很多应用中都常见,用于展示更多的功能选项或者设置,如消息...

    android通知栏下拉

    `PopupWindow`是一个可以显示在任意视图之上的浮动窗口,通常用于创建弹出式菜单、提示信息或者像通知栏下拉这样的交互元素。它的优点在于灵活性和可定制性,开发者可以根据需求自由设计窗口的样式和行为。 要创建...

    jquery 仿QQ校友的DIV弹出窗口效果

    在Web开发中,模拟弹出窗口是一种常见的交互设计,它可以用于展示信息、提示用户或进行更复杂的操作。本篇文章将详细解析如何使用jQuery库来创建一个仿QQ校友的DIV弹出窗口效果。这种效果主要依赖于JavaScript(JS)...

    详解Android 全局弹出对话框SYSTEM_ALERT_WINDOW权限

    另外,如果你想要自定义更复杂的全局弹出效果,例如使用`PopupWindow`,你可以创建一个继承自`View`的类,然后在需要弹出时,将其添加到`WindowManager`。以下是一个简单的示例: ```java public static void ...

    popWindow

    在Android应用中,PopupWindow常用于创建弹出式菜单、提示信息或者简单的对话框,提供了灵活的布局和展示方式。由于描述为空,我们将主要依据标签和文件名来推测可能涉及的知识点。 首先,"源码"标签表明我们可能会...

    ASP.NET实现托盘消息

    在ASP.NET中,实现托盘消息通常是指在客户端(用户浏览器)上模拟类似QQ这样的桌面应用,能够在屏幕右下角弹出通知或消息窗口的功能。这涉及到JavaScript或者JQuery等客户端脚本技术,因为ASP.NET本身是服务器端的...

    Android应用源码之来电弹屏实例代码,带关闭按钮-IT计算机-毕业设计.zip

    - 关闭按钮的实现通常涉及`PopupWindow.dismiss()`方法,用来隐藏或移除弹出的悬浮窗。 8. **测试与调试**: - 开发过程中,需要在真机上进行测试,因为模拟器可能不支持来电监听。同时,不同Android版本可能对...

    仿confirm的提示菜单.doc

    `$Delete`函数负责执行删除操作,先关闭弹出框,然后弹出一个警告框(`alert()`)通知用户已被删除,并提到可以在此处执行异步操作。最后,`$Hide`函数用于移除这个弹出框,从DOM中删除“PopupWindow”元素。 这个...

    android 高仿QQ

    2. **PopupWindow**:在Android中,PopupWindow用于创建弹出式窗口,通常用在需要临时显示一些信息或提供操作选项时。在高仿QQ项目中,可能用它来模拟消息提示或者下拉菜单,实现上方弹出显示的效果,增加应用的交互...

    类似qq的Pop显示

    1. Pop-up窗口:Pop-up窗口,简称Pop窗,是一种在用户界面上突然弹出的小窗口。在QQ和MSN等聊天应用中,当有新的消息到来时,会以Pop-up窗口的形式提醒用户,这种设计极大地提升了用户体验,因为它能够及时吸引用户...

    Android入门

    - 自定义弹出窗口。 - 可以控制显示位置和内容。 17. **scrollView使用** - 提供滚动功能。 - 可以嵌套多个控件。 18. **ProgressBar进度条及其子类** - 显示进度。 - SeekBar拖动条,用于调节数值。 - ...

Global site tag (gtag.js) - Google Analytics