- 浏览: 220858 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
啊嘞嘞勒:
游戏结束无法显示
自己制作的 java 版 2048游戏 -
VIP庚:
dufangyu1990 写道VIP庚 写 ...
Android 视频通话(一) -
dufangyu1990:
VIP庚 写道dufangyu1990 写 ...
Android 视频通话(一) -
VIP庚:
dufangyu1990 写道VIP庚 写道dufangyu1 ...
Android 视频通话(一) -
dufangyu1990:
VIP庚 写道dufangyu1990 写道VIP庚 写道du ...
Android 视频通话(一)
最近遇到一个需求,下面记录下实现方法 以及遇到的一些坑
需求如下:当app在后台时 收到push消息用系统的Notification进行通知;当app在前台时 收到push后采用自定义风格弹出通知
效果如下:
第一种情况这里不探究 第二种情况这里采用PopWindow实现
步骤:
一 、实现自定义PopWindow类
二 、 定义PopWindow弹出位置
这里要注意的是不要用这个方法,因为在8.0系统上这样会显示在布局底部,具体原因待探究
还有一点在设置popupWindow属性的时候 需要执行设置这个属性
因为在4.0系统上会把状态栏算入布局中 这样会导致popupWindow覆盖掉状态栏
三、定义PopWindow 弹出动画
通过设置PopWindow的属性来实现
这里要用到的是style属性
首先我们需要声明 进入和离开的动画
申明style
四、由于PopupWindow是依赖于Activity的,所以我们需要记录前台Activity
我们在每个Activity的onStart() onStop()方法中都调用
五、调用
需求如下:当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(); }
发表评论
-
2018 Flag
2019-02-23 16:24 412一年多没写博客了,2018年工作太忙了,但是也收获到 ... -
在Android源码下编译jni所需要知道的事~
2017-03-21 16:40 2901以下只是自己的一些总结,欢迎讨论 通过NDK编译jni网上有 ... -
Android 通过PathMeasure和Path实现动画
2016-12-24 17:07 5845最近一直在学习android框架,也就没怎么写博客了。前几 ... -
解决 Android 写入图片后 系统图库中看不到
2016-10-30 17:47 3191将一个图片通过写入外部存储后,打开系统图库找不到该图片 ... -
Android 6.0 对权限的处理
2016-09-01 14:15 2995最近要将拍的照片写入到手机外部存储中,开始测试时一点问题都 ... -
Android Dialog设置TYPE_SYSTEM_ALERT 有些手机不能显示问题
2016-08-08 11:46 11585在对话框初始的时候,设置 mProgressDialo ... -
Java 关于在公网上无法发送UDP数据给客户端问题
2016-05-19 00:22 5636最近在弄语音通话,当在局域网测试程序的时候,tcp和udp ... -
SnackBar 中添加多个按钮
2016-05-11 13:26 3918最近无意间看到一篇文章,解决了我很久以前的困扰 简单介 ... -
根据汉字拼音排序
2016-05-05 19:38 2322最近在做操作联系人数据这一块,当读取系统表中的联系人的数据 ... -
Android 开源图表库 ------ MPAndroidChart
2016-04-16 18:27 0最近在开发心率方面,要绘制心率图,准备自己写自定义view ... -
Android 命名空间和自定义属性
2016-03-18 13:06 4248在布局文件中经常看到 xmlns:android=&q ... -
Android 自定义属性和命名空间
2016-03-18 13:03 0在布局文件中经常看到 xmlns:android=&q ... -
组件之间通信------ EventBus 学习心得
2016-03-07 22:12 4666Android 线程、组件之间通信可以通过Handler消息处 ... -
常见的几种排序方法
2016-03-07 18:47 734由于最近要应付面试,所以把几个常见的排序方法有复习了一下。 ... -
关于Fragment所需要知道的概念
2016-03-02 00:16 1438可以把Fragment想成Activity中的模块,这个模 ... -
Android沉浸式通知栏的一个开源库SystemBarTint简单使用
2016-02-20 20:54 4292什么是沉浸式设模式?沉浸模式计就是把用来导航的各种界面操作 ... -
Netty 4.0 实现心跳检测和断线重连
2016-02-17 21:42 32811一 实现心跳检测 原理:当服务端每隔一段时间就会向客户端发送心 ... -
Netty4.0 实现心跳检测和客户端断线重连
2016-02-17 21:41 1一 实现心跳检测 原理:当服务端每隔一段时间就会向客户端发送心 ... -
Netty4.0 实现心跳检测和客户端断线重连
2016-02-17 21:41 1一 实现心跳检测 原理:当服务端每隔一段时间就会向客户端发送心 ... -
Struts学习的总结
2016-02-06 21:07 1837一 Struts使用步骤 1 导入Struts jar包 2 ...
相关推荐
很多应用采用的底部弹出菜单实现,通过自定义PopupWindow实现
Android从屏幕底部滑动弹出PopupWindow,有动画效果,类似于sharesdk的分享页面滑动弹出效果。
顶部弹出对话框PopupWindow,
博客地址:http://blog.csdn.net/lowprofile_coding/article/details/47785421 说明:从屏幕底部弹出PopupWindow,有弹出隐藏动画效果.背景设置透明度.
PopupWindow 底部弹出透明度
Android 单击listview弹出popupwindow弹出框,里面还附带listview右滑删除按钮。博客网址:http://blog.csdn.net/qq_16064871
自定义Spinner(PopupWindow实现的弹出下拉框),类似网站的下拉式窗口效果,封装好了,可以直接使用。。不用像自带的弹出式窗口难看。。。3分不贵
详细介绍PopupWindow各种样式弹出显示动画,显示位置控制, 1> Activity中直接new PopupWindow()对象来使用; 2> 各种样式自定义PopupWindow; 3> PopupWindow的入场和出场动画样式;
从屏幕底部弹出PopupWindow,有弹出隐藏动画效果.背景设置透明度.
在android 开发中,让popupwindow 弹出在点击按钮的上方中间; 说明文档见我的博客
Android popupWindow 仿微信弹出效果我的博客http://blog.csdn.net/xiaoyuan511
popupwindow 遮罩 窗帘式 从上往下 半显示 带动画 漂亮
用popupWindow自定义弹出框
ActivityGroup和popupwindow实现UC弹出菜单客户端,可自己添加Activity
popupwindow弹出框.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
AndroidListView+PopupWindow实现item点击弹出PopupWindow 博客地址:https://blog.csdn.net/dreams_deng/article/details/104618270
PopupWindow测试demo(解决PopupWindow被输入法弹上去之后无法恢复原位问题)
自定义popupwindow,解决了7.0弹出位置的错乱。点击按钮实现在控件的上下左右弹出的效果。还实现的dp和px的相互转换
供需要查看源码和喜欢研究源码的朋友可以下载看下,里面主要包含弹出框的四种动画类型,和相对于横竖效果的Button的相对位置
大家可自行学习,研究,并补充该demo.