Android PopupWindow使用,轻松实现微博主界面(二)

欢迎各位访问的博客,博客地址

一、概述

1.继承关系:

java.lang.Object
   ↳    android.widget.PopupWindow

可以看出它并不是继承于View,而是Object的子类,位于app包下,和Dialog类似;

2.实现效果:

  • 微博效果
    这里写图片描述

  • 电商购物效果
    这里写图片描述

二、基本使用

贴上微博效果的代码如下:

    @OnClick(R.id.compose_btn)
    public void onComposeBtnClicked(View view){
        initPopup();
    }

    private void initPopup() {
        View customView = getLayoutInflater().inflate(R.layout.popup_custome_view, null);
        final PopupWindow popupWindow = new PopupWindow(customView,
                WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, true);
        popupWindow.setAnimationStyle(R.style.popupAnimation);
        popupWindow.setBackgroundDrawable(new BitmapDrawable());

        //由于PopupWindow没有提供监听动画的接口和获取动画的接口,这里做了延时一个动画的时长
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
                    getWindow().setStatusBarColor(Color.TRANSPARENT);
                }
            }
        }, 200);
        customView.findViewById(R.id.close_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                popupWindow.dismiss();
            }
        });
        popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
                    getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
                }
            }
        });
        popupWindow.showAtLocation(mTabHost, Gravity.BOTTOM, 0, 0);
        popupWindow.update();
    }

可以看出触发点击事件时候显示显示popupWindow:

  • 初始化popupWindow中必须设置:
popupWindow.setBackgroundDrawable(new BitmapDrawable());

否则无法show;

  • 设置动画:
popupWindow.setAnimationStyle(R.style.popupAnimation);

这里要在style中配置:

<style name="popupAnimation" parent="android:Animation" mce_bogus="1">
      <item name="android:windowEnterAnimation">@anim/pop_enter</item>
      <item name="android:windowExitAnimation">@anim/pop_exit</item>
</style>

pop_enter的xml

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

pop_exit的xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:fromYDelta="0%"
        android:toYDelta="100%"
        android:duration = "200"/>
    <alpha
        android:duration="200"
        android:fromAlpha="1.0"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:toAlpha="0.0" />
</set>
  • 关于动画:
    查了很久没发现popupwindow的动画监听,并且无法获取动画实例,所以这里的动画监听使用了new Handler().postDelayed的延时方式处理;

三、存在的问题

如果popupwindow中有弹出软键盘的交互,就好比我的效果图二中需要弹出软键盘,这里试了下在Activity中配置windowSoftInputMode为adjustResize或者是adjustPan在弹出软键盘时候均会遮挡输入框,但是在原生android上是不会遮挡的,在国内小米和魅族上测试均会遮挡,我想了一下应该是国内改了FrameWork层中window的相关参数导致的,解决这个问题需要给popupwindow设置:

mPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
mPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

如果想在弹出popupwindow时候改变window的背景色,比如我效果图二的效果,这里可以在show的时候一并设置window的背景alpha,在dismiss的时候在设置回来:
show的时候:

private void show() {
        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.alpha = 0.7f;
        getWindow().setAttributes(params);
        mPopupWindow.showAtLocation(mRecycler, Gravity.BOTTOM, 0, 0);
    }

dismiss的时候:

mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
                @Override
                public void onDismiss() {
                    WindowManager.LayoutParams params = getWindow().getAttributes();
                    params.alpha = 1f;
                    getWindow().setAttributes(params);
                }
            });

四、总结

  1. popupwindow和dialog一样都是和View平级的控件,都在app包下;
  2. popupwindow是处在整个Activity最顶层,设置在window层级;
  3. Window是Activity在Attach时候创建的,在创建的过程中会设置windowsoftInputmode属性值,这里可以参考老罗的这篇博文:http://blog.csdn.net/luoshengyang/article/details/8223770
  4. 关于windowsoftInputmode相关值得含义:
    【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置
    【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
    【C】stateHidden:用户选择activity时,软键盘总是被隐藏
    【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
    【E】stateVisible:软键盘通常是可见的
    【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
    【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
    【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
    【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
展开阅读全文

Python数据分析与挖掘

01-08
92讲视频课+16大项目实战+源码+¥800元课程礼包+讲师社群1V1答疑+社群闭门分享会=99元   为什么学习数据分析?       人工智能、大数据时代有什么技能是可以运用在各种行业的?数据分析就是。       从海量数据中获得别人看不见的信息,创业者可以通过数据分析来优化产品,营销人员可以通过数据分析改进营销策略,产品经理可以通过数据分析洞察用户习惯,金融从业者可以通过数据分析规避投资风险,程序员可以通过数据分析进一步挖掘出数据价值,它和编程一样,本质上也是一个工具,通过数据来对现实事物进行分析和识别的能力。不管你从事什么行业,掌握了数据分析能力,往往在其岗位上更有竞争力。    本课程共包含五大模块: 一、先导篇: 通过分析数据分析师的一天,让学员了解全面了解成为一个数据分析师的所有必修功法,对数据分析师不在迷惑。   、基础篇: 围绕Python基础语法介绍、数据预处理、数据可视化以及数据分析与挖掘......这些核心技能模块展开,帮助你快速而全面的掌握和了解成为一个数据分析师的所有必修功法。   三、数据采集篇: 通过网络爬虫实战解决数据分析的必经之路:数据从何来的问题,讲解常见的爬虫套路并利用三大实战帮助学员扎实数据采集能力,避免没有数据可分析的尴尬。   四、分析工具篇: 讲解数据分析避不开的科学计算库Numpy、数据分析工具Pandas及常见可视化工具Matplotlib。   五、算法篇: 算法是数据分析的精华,课程精选10大算法,包括分类、聚类、预测3大类型,每个算法都从原理和案例两个角度学习,让你不仅能用起来,了解原理,还能知道为什么这么做。
©️2020 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值