Android知识进阶(遥远的重头开始)弹窗

Android-开源通用弹窗的封装CommonPopupWind

2019-07-21  本文已影响6人  MonkeyLei

终于也是自己封装一些东西了,不管烂不烂,还是自我鼓励了一把!(之前学maven发布也是这个目的)

开源地址: FanChael/CommonPopupWindow

弹窗效果如下:

image image image image

@tip后面会逐渐完善吧,目前先暂停一小段时间的更新。(基本使用可以了,后面打算用其中的更新弹窗模块+rx家族+json->做一个App更新的框架,新的项目搭建起来就快多了);

@tip注册登录弹窗每家样式不一样,而且目前主流的是页面式的,就是全屏的那种,所以注册登录如果有比较原生的国外的样式,打算借鉴一下

@tip再加强下自身的学习,加强下设计模式,加强下源码,加强下他人好的框架的学习,要加强的东西忒多了!

下面就简单介绍下使用方式吧(新建一个工程试试):

引入工程:

    //未引入记得引入 - 注册登录弹窗需要
    implementation 'com.android.support:design:28.0.0'

    //1.0.4 自定义+分享弹窗+注册登录弹窗+更新弹窗
    implementation 'com.hl:poplibrary:1.0.4'

1. 自定义布局走起

1.1 比如我们之前用Spinner搞得下拉列表

image

其中布局为:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/deep_gray"
    tools:context=".MainActivity">

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="20dp"
        android:dropDownVerticalOffset="50dp"
        android:background="@drawable/spinner_bg_shape"
        android:entries="@array/spingarr"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

spinner_bg_shape.xml为:(其他都是颜色值,随便设置就好)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <corners android:radius="6dp" />
    <stroke
        android:width="2dp"
        android:color="@color/gray" />
    <solid android:color="#00ffffff" />
</shape>

1.2 现在替换为我们的定义的通用弹窗来搞试试

1.2.1 测试布局修改为activity_main.xml

 <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/deep_gray"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="20dp"
        android:background="@drawable/spinner_bg_shape"
        android:onClick="popTest"
        android:text="假北京"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

1.2.2 弹窗布局为 pop_address.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical">

    <TextView
        android:id="@+id/pa_haidianTv"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="海淀" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="昌平" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="朝阳" />
</LinearLayout>

1.2.3 调用(内部做了说明,应该不是难理解)

     /**
     * 弹窗测试
     * @param view
     */
    public void popTest(View view) {
        ///< 动画BasePopView.ANIMATION _animation可以传null
        ///< 可以选择调用无参数bOutsideTouchable、_backColor的方法(默认点击外部不消失)
        ///< 点击事件回调_onClickListenner可以传null
        BasePop.Builder builder = BasePopView.show(this,
                view, R.layout.pop_address,
                ScreenUtil.getScreenW(this), 0, ///< 0 - 表示高度内容包裹 -1 - 表示屏幕高度
                true, -1,
                BasePopView.ANIMATION.SCALE,                    ///< 方位显示方式只支持缩放动画->BasePopView.ANIMATION.SCALE
                new OnEventListenner.OnBaseClickListenner() {
                    @Override
                    public void onClick(View view) {
                        ///< 包含了跟布局下第一层子控件的点击事件(多层嵌套暂时未做处理,考虑的是作为一个弹窗没有那么复杂)
                        switch (view.getId()) {
                            case R.id.pa_haidianTv:
                                Toast.makeText(MainActivity.this, "点击了海淀", Toast.LENGTH_SHORT).show();
                                break;
                        }
                    }
                }, BasePopView.GRAVITY.LEFTTOP_TO_LEFTBOTTOM);
    }

1.2.4 显示效果如下 - - 其他显示效果,可以参考FanChael/CommonPopupWindow

image

2 分享弹窗(或许会被别人用到)FanChael/CommonPopupWindow

提供两种常用的分享弹窗样式(其中第二种仿tecent样式)

默认提供四种常规分享平台按钮+一个复制链接按钮(wx,circle,qq,sina,link)

提供了从上至下,从下至上两种出场方式

分享图标超过5个的情况下,可以选择采用水平滑动,或者网格方式进行展示;低于五个会做均分

2.1 默认常规分享调用

        ///< 点击事件回调
        OnEventListenner.OnShareClickListenner onShareClickListenner = new OnEventListenner.OnShareClickListenner() {
            @Override
            public void onClick(View view, int pos) {
                Toast.makeText(MainActivity.this, "pos=" + pos, Toast.LENGTH_SHORT).show();
            }
        };
        ///< 不提供分享资源的情况,默认提供了四种常规分享平台按钮+一个复制链接按钮/采用的是水平展示(条目过多的情况下,可以左右滑动)
        BasePop.Builder builder = SharePopView.showShare(this, view,
                null,  null,
                BasePopView.SIMPLE_GRAVITY.FROM_BOTTOM,
                SharePopView.SHOW_TYPE.HORIZON,
                onShareClickListenner);
image

2.2 提供分享资源(仿tecent的样式调用)

    List<String> _share2Name = new ArrayList<>();
        _share2Name.add("华为");
        _share2Name.add("阿里");
        _share2Name.add("小米");
        _share2Name.add("毛豆");
        _share2Name.add("无聊");
        _share2Name.add("华为");
        _share2Name.add("阿里");
        _share2Name.add("小米");
        _share2Name.add("毛豆");
        _share2Name.add("无聊");
        List<Integer> _share2Icon = new ArrayList<>();
        _share2Icon.add(R.drawable.share_qq);
        _share2Icon.add(R.drawable.share_qq);
        _share2Icon.add(R.drawable.share_qq);
        _share2Icon.add(R.drawable.share_qq);
        _share2Icon.add(R.drawable.share_qq);
        _share2Icon.add(R.drawable.share_qq);
        _share2Icon.add(R.drawable.share_qq);
        _share2Icon.add(R.drawable.share_qq);
        _share2Icon.add(R.drawable.share_qq);
        _share2Icon.add(R.drawable.share_qq);
        ///< 点击事件回调
        OnEventListenner.OnShareClickListenner onShareClickListenner = new OnEventListenner.OnShareClickListenner() {
            @Override
            public void onClick(View view, int pos) {
                Toast.makeText(MainActivity.this, "pos=" + pos, Toast.LENGTH_SHORT).show();
            }
        };
        ///< 不提供分享资源的情况,默认提供了四种常规分享平台按钮+一个复制链接按钮/采用的是水平展示(条目过多的情况下,可以左右滑动)
        BasePop.Builder builder = SharePopView.showShare(this, view,
                _share2Name,  _share2Icon,
                BasePopView.SIMPLE_GRAVITY.FROM_BOTTOM,
                SharePopView.SHOW_TYPE.HORIZON,
                onShareClickListenner);
image image

别的像更新弹窗可以参考相关文档 FanChael/CommonPopupWindow

剩下的就参考教程来就好!小萌新的新项目用了。小白也算是兑现了之前的计划“通用弹窗计划”,当然无知的地方还在多,错的地方也还多,只有努力了....

其他学习相关

另外关于Dialog, DialogFragment, PopupWindow比较 Dialog, DialogFragment, PopupWindow比较 - 可以参考下,底部有很多相关解读

官方目前推荐采用DialogFragment创建对话框https://developer.android.google.cn/reference/android/app/DialogFragment - 其中比较重要的一点就是声明周期的管理(更方便的做适配) - 当然不一定都要用这个替代以前的。有些知名app也是某些情况下采用了alertDialog,都没做什么样式(感觉还是好看,更主题颜色很搭)

这样想的话,小白的整个通用弹窗貌似还有很多情况没做测试以及处理(比如横竖屏切换...后续还得更完善)

其他相关搜集...多看看也没啥坏处

image
上一篇 下一篇

猜你喜欢

热点阅读