Code Monkey home page Code Monkey logo

basepopup's Introduction

1.x版本 | 2.x版本 | English

Logo图片似乎加载不出来

BasePopup - Android下打造通用便捷的PopupWindow

Release Candy License Api Author


Compat组件 support lifecycle androidx
Release
Candy

apk体验下载

导航



特性

  • 更简单更精准的控制显示位置,通过Gravityoffset来控制您的PopupWindow
  • 本库为抽象类,对子类几乎没有约束,您完全可以像定制Activity一样来定制您的PopupWindow
  • 支持AnimationAnimator,随意控制您的PopupWindow的动画,再也不用去写蛋疼的xml了
  • 背景变暗、背景换色甚至背景给个Drawable都是一句话的事情
  • 背景模糊亦或是局部模糊也仅仅需要您一句话的配置
  • 返回键控制点击外部Dismiss控制外部事件响应控制三者分离,再也不用担心我的PopupWindow各种按键响应问题
    • 如果不满足默认的事件,没问题,我们还提供了事件传递,您的事件您来把握
  • PopupWindow跟随AnchorView位置不准?屏幕外不消失?在这里,Link方法为您排忧解难
  • 支持链式调用,还在为简单的PopupWindow使用不得不继承库的抽象类而感到烦躁?不妨来试试QuickPopupBuilder,想必您会爱上它的


注意事项

WARN

  • 请务必仔细阅读本README,每个版本升级请务必查阅更新日志,这可以为您减少不必要弯路
  • 请注意引用版本的问题,Release版本是稳定版,Candy是预览版。
    • Release版本:一般在Candy版本反复验证修复后发布到Release,如果您对稳定性要求较高,请使用Release版本。
    • Candy版本:一般新功能、issue修复都会发布到Candy版本,Candy版本发布比较频繁,但通常会拥有新的功能,如果您喜欢试验新功能同时对稳定性要求不高,请使用Candy版本。
    • Release和Candy两个版本互相切换可能会导致Build失败,这时候您Clean一下Project即可
  • 如果您是以前1.x版本的用户,现在想更新到2.x,请在更新前查阅:1.x迁移到2.x帮助文档
  • 从16年第一次提交到现在,本人技术也一直在进步,BasePopup也会一直迭代更新,所以,请谨慎选择版本哦~一不小心就颠覆了之前的实现。

Android P已经适配,感谢@Guolei1130收集的方法。

文章地址:android_p_no_sdkapi_support

本库一开始采用360的方法,但不得不走Native,为了个Popup不得不引入so感觉很不值得,在看到这篇文章后,才想起UnSafe类,因此本库采用方法5。

如果以后UnSafe类移除掉的话,再考虑Native方法。

最后再一次感谢大牛提供的方法~



快速入门


请参考文档:BasePopup手册


Api(请看Wiki,后续迁移至文档)

请看wiki(陆续完善中)

Link👉WIKI


更新日志 (历史更新)

  • 近期正在重构BasePopup,旨在代码更容易读,因此近期更新可能较慢,新版本将会对issue统一处理

  • 【Candy】2.2.2

    • 【Candy】190704
      • 修复AnimatorSet的时间问题 fix #203
    • 【Candy】190722
      • 回滚#188修复
      • 经检查,#188修复带来的问题比较严重,建议升级到该版本
    • 【Candy】190816
      • 考虑到很多用户提出全面屏会有蒙层无法填充的问题,因此增加setMaskLayoutWidthsetMaskLayoutHeight方法,该方法允许您自定义蒙层的高度
      • 开始重构BasePopupWindow,本次重构将会解决遗留问题同时缩减冗余代码,并提高代码可读性
    • 【Candy】190904
      • 重构屏幕宽高获取逻辑
      • 修改supporter名字为component
  • 【Release】2.2.1(2019/06/24)

    • 支持Service或者非ActivityContext里弹窗
    • 优化PopupUiUtils,优化获取屏幕宽高算法
    • 修改并优化键盘判断逻辑
    • 优化全屏状态下点击范围的判定,fixed #200
  • 【Release】2.2.0(2019/05/15)

    • 正式版2.2.0隆重归来,这次正式版又是一个重构版本哦~
    • 优化输入法对齐逻辑
    • 重构模糊逻辑:
      • 经测试,720p的手机在默认参数下全屏模糊时间平均在6ms~16ms之间
      • 增大默认参数的模糊程度
      • 模糊淡入淡出时间跟随Popup的动画时间
      • 修复模糊偶尔失效的情况
    • 测量/布局相关:
      • 重构测量逻辑:
        • 现在在clipToScreen的情况下,会根据剩余空间对PopupDecor进行重新测量,以保证Popup完整的显示,如果您需要保持原始的测量值,请调用keepSize(true)
        • 重构layout逻辑,针对outSideTouch优化
        • 适配屏幕旋转,fix #180
        • 采取flag代替各种boolean,清爽更简洁
        • 减少冗余代码
    • 优化相关:
      • 增加GravityMode值,现在允许您配置PopupGravity的参考模式啦~
        • RELATIVE_TO_ANCHOR:默认模式,以Anchor为参考点,指定PopupWindow显示在Anchor的方位
        • ALIGN_TO_ANCHOR_SIDE:对齐模式,以Anchor的边为参考点,指定PopupWindow的边与Anchor的哪条边对齐
      • 增加minWidth/minHeight 方法,增加maxWidth/maxHeight 方法,让他们相互对应~
      • 修复高度为match_parent和wrap_content的测量差异,现在可以安心地玩耍啦
      • 部分Api标记过时:
        • setAllowDismissWhenTouchOutside -> setOutSideDismiss
        • setAllowInterceptTouchEvent -> setOutSideTouchable
      • 增加setBackgroundView(View)方法,现在BasePopup的背景控件可以随意由你定制啦~当然PopupWindow的背景动画控制方法依旧生效
    • 包拆分:
      • 现在BasePopup将会进行包的拆分,源工程仅针对没有任何依赖的原生Android进行适配,如果您需要别的适配,请分别依赖以下模块或多个模块:
        • 如果您需要support库的支持,比如DialogFragment支持,请依赖
          • implementation 'com.github.razerdp:BasePopup-compat-support:{$latestVersion}'
        • 如果您需要lifecycle库的支持,比如destroy里自动释放或者关闭等,请依赖
          • implementation 'com.github.razerdp:BasePopup-compat-lifecycle:{$latestVersion}'
        • 如果您需要androidX库的支持,请依赖
          • implementation 'com.github.razerdp:BasePopup-compat-androidx:{$latestVersion}'
        • 请注意,如果您依赖了androidX支持组件,请不要依赖另外两个支持组件,否则会冲突
    • Bug fixed:
    • Other:
      • add 996 license

例子预览

GravityPopupFrag LocatePopupFrag
AnyPosPopupFrag UpdatePopupFrag
BlurSlideFromBottomPopupFrag CommentPopup
SlideFromBottomPopup InputPopup
ListPopup MenuPopup

打赏(看在我那么努力维护的份上。。。给个零食呗~)

支付宝

交流群

因QQ没时间管理,因此解散,同时开通微信群,主要用于交流和BasePopup的反馈,为了保证微信群的质量,因此只有打赏了之后才能进群~

因近期发现无法回复付款方,因此如果您已经微信支付打赏并需要进群,请重新再扫一遍支付宝并支付,我会退款给您并联系您~


常见问题

更多常见问题请看WIKI#常见问题

Q:如何取消默认的背景颜色

A:调用setBackgroundColor(Color.TRANSPARENT)或者setBackground(0)




Q:如何在dismiss()时不执行退出动画

A:调用dismiss(false)或者dismissWithOutAnimate()




Q:点击popupwindow背景部分不想让popupwindow隐藏怎么办

A:设置setOutSideDismiss(false)




Q:Service里无法弹出【自2.2.1版本开始支持非ActivityContext里弹出】

A:PopupWindow需要windowToken,因此ApplicationContext或者Service里面是无法弹出的,建议通过发出事件通知栈顶Activity来弹出




Q:为什么PopupWindow里面的EditText无法粘贴

ISSUE REF:#140

Google Issue Tracker:#36984016

A:PopupWindow内的View是无法获取WindowToken的,而粘贴功能也是一个PopupWindow,它的显示必定需要WindowToken,因此无法粘贴。




Q:如何不让PopupWindow的蒙层覆盖状态栏

A:设置setPopupWindowFullScreen(false)




Q:如何点击back键不关闭pop

A:设置setBackPressEnable(false)




Q:如何在BasePopup里使用ButterKnife

A:您可以在构造器中进行绑定:

   public DemoPopup(Context context) {
        super(context);
        ButterKnife.bind(this,getContentView());
    }



Q:为什么BasePopup的宽度不对或者留有一条缝隙

A:请务必留意您是否使用了头条类等修改Density的适配方案,BasePopup只遵循官方的测量方法并没有额外的添加别的测量方式,因此如果因为第三方修改导致的适配问题,本库概不负责

如果您用的是AndroidAutoSize,请尝试issue#13的解决方案:

在任何情况下本来适配正常的布局突然出现适配失效,适配异常等问题,只要重写 Activity 的 getResources() 方法即可,如果是 Dialog、PopupWindow 等控件出现适配失效或适配异常,同样在每次 show() 之前调用 AutoSize#autoConvertDensity() 即可




License

Apache-2.0

basepopup's People

Contributors

430public avatar bryant1410 avatar dadengpao avatar hshare avatar parfoismeng avatar razerdp avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.