Git Product home page Git Product logo

anylayer's Introduction

求职

AnyLayer

Android稳定高效的浮层创建管理框架。

什么是浮层?浮层就是一个悬浮在其他View上方的View。但是2个View处于同一个Window。

可实现Dialog/Popup/BottomSheet等弹窗,引导层,悬浮按钮,浮动通知,吐司等效果。

GitHub主页

Demo下载

简介

如果你的App用的是单Activity架构,那么这个就是系统Dialog/PopupWindow/Toast的完美替代。而且可以实现悬浮按钮和引导层等一些列功能。

不是单Activity也不影响,上面这些功能一样可以实现,只是Toast无法跨页面,会随Activity一起关闭。

  • 同时兼容support和androidx
  • 链式调用
  • 支持自由扩展
  • 实现几种常用效果
    • Dialog/BottomSheet效果
    • Popup效果
    • Toast效果
    • Guide效果
    • Overlay效果
    • Notification效果

说明

详细原理和使用说明本人会在后续补上,但因个人开发,时间不定,请谅解。

或有大佬在看过源码后,愿意写下分析文章或使用说明来分享的,欢迎联系本人。写得比较详细的本人将会放到README中供大家查阅,提前谢过。

当然也欢迎加群共同探讨,共同进步。

QQ群:147715512(爱Android)

使用该库的产品

如果你的产品正在使用AnyLayer,欢迎留下相关信息

这些信息将用来帮助更多开发者关注并使用本框架,增加框架的活跃度。而高活跃度则意味着更多隐藏BUG被发现并修复,即活跃度等同于框架的健壮性。同时这也是我维护项目的最大动力,感谢。

APP名 APP图标 公司名
玩安卓 个人
熊猫淘学 西安熊猫宝宝网络科技有限公司
MBA大师 MBA大师

截图

截图效果较差,建议下载Demo体验最新功能

20210610_190449.gif 20210610_190537.gif 20210610_190654.gif 20210610_190715.gif

使用说明

集成

  • 添加仓库

// build.gradle(Project:)
allprojects {
    repositories {
        maven { url "https://www.jitpack.io" }
        
        // 使用4.1.5及以后版本必须添加,因高斯模糊用到的VisualEffect库暂时只发布在gitee仓库
        // maven { url "https://gitee.com/goweii/maven-repository/raw/master/releases/" }
    }
}
// build.gradle(Module:)
dependencies {
    // 完整引入,二选一
    implementation "com.github.goweii:AnyLayer:$version"
    
    // 按需引入
    // 基础库
    // implementation "com.github.goweii.AnyLayer:anylayer:$version"
    // 扩展库(依赖基础库)
    // implementation "com.github.goweii.AnyLayer:anylayer-ext:$version"
    // Kotlin扩展库(依赖基础库和扩展库)
    // implementation "com.github.goweii.AnyLayer:anylayer-ktx:$version"
    // 自动初始化(依赖基础库和Jetpack Startup)
    // implementation "com.github.goweii.AnyLayer:anylayer-startup:$version"
}
  • 一些问题/建议

    • 建议按需引入 anylayer-startup依赖于Jetpack Startup,需要自行引入。而且Jetpack Startup仅支持androidx,如果引用的是x.x.x-support需要自己在application初始化
    • 这几个依赖有啥区别?
      • anylayer:核心功能,所有浮层效果的实现
      • anylayer-ext:扩展功能,比如通用的动画实现和监听器的默认实现
      • anylayer-ktx:Kotlin扩展,方便再kt环境实现链式调用
      • anylayer-startup:Jetpack Startup实现

更新说明

点击查看

类间关系

  • AnyLayer(提供常用效果的调用入口)

  • ViewManager(管理View的动态添加移除和KeyEvent事件注册)

  • Layer(对ViewManager的包装,实现进出场动画逻辑和事件监听,规范接口形式,分离出ViewHolder/ListenerHolder/Config三大内部类)

  • AnimatorHelper(创建常用属性动画)

类说明

AnyLayer

一个工厂效果的工具类,与Layer类族的关系就像Executors于Executor的关系这样。

只是提供了静态方法方便调用,不用new来new去的。

/**
 * 创建一个DialogLayer
 * 这个Context不能是ApplicationContext
 */
public static DialogLayer dialog(Context context)

/**
 * 创建一个DialogLayer
 * 依附的是当前显示的Activity
 */
public static DialogLayer dialog()

/**
 * 创建一个DialogLayer
 * 依附的是特定Class的Activity实例,这个Activity必须是已经启动的
 */
public static DialogLayer dialog(Class<Activity> clazz)

/**
 * 创建一个DialogLayer
 * 会启动一个新的全透明Activity依附
 */
public static void dialog(LayerActivity.OnLayerCreatedCallback callback)

/**
 * 创建一个PopupLayer
 */
public static PopupLayer popup(View targetView)

/**
 * 创建一个ToastLayer
 * 依附的是当前显示的Activity
 */
public static ToastLayer toast()

/**
 * 创建一个ToastLayer
 * 这个Context不能是ApplicationContext
 */
public static ToastLayer toast(Context context)

/**
 * 创建一个OverlayLayer
 * 这个Context不能是ApplicationContext
 */
public static OverlayLayer overlay(Context context)

/**
 * 创建一个GuideLayer
 * 这个Context不能是ApplicationContext
 */
public static GuideLayer guide(Context context)

/**
 * 创建一个NotificationLayer
 * 这个Context不能是ApplicationContext
 */
public static NotificationLayer notification(Context context)

ViewManager

这个就不介绍了吧?一般用的时候也用不到,后面原理剖析的时候再说吧!

Layer

上面类间关系简单描述了一下

对ViewManager的包装,实现进出场动画逻辑和事件监听,规范接口形式,分离出ViewHolder/ListenerHolder/Config三大内部类

可以看出这个类是所有效果的基类,有以下几个特定:

  • 对ViewManager的包装

    可以自由指定父布局和子布局,可以通过继承在onGetParent和onCreateChild中返回,也可以通过parent()和child()方法设置。

    其次是几个生命周期回调方法

    • onAttach(View刚被添加到父布局)
    • onPreDraw(View开始绘制前,这里开始执行进场动画)
    • onShow(View显示,进场动画结束)
    • onPreRemove(View准备移除时,这里开始执行出场动画)
    • onDetach(View已被移除,出场动画结束)
  • 实现进出场动画逻辑

    在onPreDraw和onPreRemove中实现了进出场动画的流程。可通过继承在onCreateInAnimator和onCreateOutAnimator中返回,也可以通过animator()方法设置。

    其中AnimatorCreator为创建自定义进出场动画的接口

  • 事件监听

    有几个常用的事件监听,在ListenerHolder中统一管理

    • DataBindCallback(绑定数据)
    • OnClickListener(点击事件监听)
    • OnShowListener(显示动画开始和结束监听)
    • OnDismissListener(消失时动画开始和结束监听)
    • OnVisibleChangeListener(显示隐藏状态改变的监听)
  • 分离出ViewHolder/ListenerHolder/Config三大内部类

    这个看名字应该就知道了,就不介绍了。

FrameLayer

继承自Layer,强制父布局为FrameLayout。主要就是引入了Layer层级概念。

DecorLayer

继承自FrameLayer,强制父布局为DecorView。

而这个层级就是由两个静态内部类实现的

  • LayerLayout

    继承自FrameLayout,是各个层级浮层的容器,直接添加进DecorView。

  • LevelLayout

    继承自FrameLayout,定义了Level概念,是每个浮层的父布局,也就是在外面包了一层,用来控制浮层上下层级的容器。这个是直接添加进LayerLayout的。

好了就这么多了。更多了细节还是看源码吧。

DialogLayer

Dialog效果的浮层。用上面的描述就是:

规范子布局层级,加入背景层,分离动画为背景动画和内容动画

一个一个来看。

  • 规范子布局层级,加入背景层

    从DecorLayer的介绍中可以知道LevelLayout是该类浮层的直接父布局。但它并不是DialogLayer中contentView的直接父布局。就是因为又加了一个ViewGroup把contextView和background包裹起来。布局文件是这样子的。

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout android:id="@+id/fl_container" >
        <ImageView android:id="@+id/iv_background" />
        <FrameLayout android:id="@+id/fl_content_wrapper" />
    </FrameLayout>

    contentView其实是直接添加至fl_content_wrapper中的。

  • 分离动画为背景动画和内容动画

    因为有了contextView和background的概念,原来的动画就不好用了。所以从写了动画的创建逻辑,分离了背景和前景应用不同的动画。

PopupLayer

继承自DialogLayer,加入了锚点定位。

ToastLayer

吐司

GuideLayer

引导层

OverlayLayer

悬浮按钮

NotificationLayer

通知

如果你觉得还不错,就请我喝杯咖啡吧~

wx_qrcode

anylayer's People

Contributors

goweii avatar mbacuiz 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.