Giter VIP home page Giter VIP logo

anylayer's Introduction

⚠️注意

项目已进行重构,将不再开发新功能,仅稳定性维护。

新项目地址Layer

AnyLayer

Android CI GitHub license Downloads Week Downloads Month Demo

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

浮层就是一个悬浮在其他View之上的View。通过使用代码动态控制View的添加和移除,可以实现例如Dialog/Popup/BottomSheet等弹窗,引导层,悬浮按钮,浮动通知,吐司等各种效果。

已实现的效果如下:

  • Dialog/BottomSheet效果
  • Popup效果
  • Toast效果
  • Guide效果
  • Overlay效果
  • Notification效果

如何集成

添加仓库

maven { url "https://www.jitpack.io" }

// 使用4.1.5和4.1.6必须添加,因高斯模糊用到的VisualEffect库暂时只发布在gitee仓库
// maven { url "https://gitee.com/goweii/maven-repository/raw/master/releases/" }

添加依赖

点击查看更新历史

// 完整引入
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:核心功能,所有浮层效果的实现
  • anylayer-ext:扩展功能,比如通用的动画实现和监听器的默认实现
  • anylayer-ktx:Kotlin扩展,方便再kt环境实现链式调用
  • anylayer-startup:Jetpack App Startup实现

报错ClassNotFoundException: Didn't find class androidx.startup.InitializationProvider?

anylayer-startup依赖于Jetpack App Startup,需要自行引入androidx.startup依赖。而且Jetpack Startup仅支持androidx,如果引用的是x.x.x-support需要自己在application初始化

为什么无法下载visualeffect相关依赖?

因为4.1.5和4.1.6用于实现背景高斯模糊的VisualEffect库暂时只发布在gitee仓库,需要加下gitee仓库,或者更新4.1.7之后版本。还是建议更新4.1.7之后版本,因为gitee仓库可能被封!

maven { url "https://gitee.com/goweii/maven-repository/raw/master/releases/" }

5.0.0版本怎么还没发正式版?

5.0.0版本不会发正式版了。因为5.0.0版本主要做的是一些重构,但是因为重构导致api和依赖方式变化太大,大版本号更新也没法表示这个变动之大。所以后面我又新起了一个项目去搞(新项目地址Layer)。而且新项目Layer已经发布正式版,欢迎大家迁移体验。 还有就是这个项目不会再开发新功能,只进行稳定性维护,实在没精力搞同时维护这么多开源项目了。

使用说明

截图

Demo下载

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

文档

Wiki

使用该库的产品

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

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

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

如何贡献

非常欢迎你的加入!提一个 Issue 或者提交一个 Pull Request

如何赞赏

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

wx_qrcode wx_qrcode wx_qrcode

anylayer's People

Contributors

goweii avatar mbacuiz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

anylayer's Issues

compatSoftInput概率性出现将DialogLayer移动过于高的问题

我的用法
mDialog?.onVisibleChangeListener(object :
Layer.OnVisibleChangeListener {
override fun onShow(layer: Layer) {
(layer as DialogLayer).compatSoftInput(true, etNote)
}

        override fun onDismiss(layer: Layer) {
            (layer as DialogLayer).removeSoftInput()
        }
    })

场景是一个底部弹出且始终处于底部的浮层,浮层内部一个输入框一个按钮。

使用view报错

View view = LayoutInflater.from(context).inflate(R.layout.dialog_confirm, null);
AnyLayer.with(context)
                .cancelableOnClickKeyBack(true)
                .cancelableOnTouchOutside(true)
                .contentView(view)
.show()

报错Attempt to write to field 'int android.widget.FrameLayout$LayoutParams.gravity' on a null object reference

用于过生产环境吗

看了下,使用View实现的弹窗,思路很好,解决了一些dialog与pop的痛点,请问作者此库用于过生产环境吗,表现如何

全局复用Layer会有问题

compatSoftInput处理有点问题,在remove时没有将softInputHelper置空。或者在重新调用compatSoftInput时应该重新attach,不然复用dialog会有问题

使用该库的APP信息收集

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

APP名 APP图标(128*128以内) 公司名(可选)
玩安卓 icon-wanandroid 个人

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

Layer contentView 宽度

我在TV设备上面使用AnyLayer.dialog 宽度会被固定,该怎么设置固定宽度?

执行消失的动画时,偶然会崩溃

java.lang.IllegalStateException: Cannot start this animator on a detached view!
at android.view.RenderNode.addAnimator(RenderNode.java:799)
at android.view.RenderNodeAnimator.setTarget(RenderNodeAnimator.java:299)
at android.view.RenderNodeAnimator.setTarget(RenderNodeAnimator.java:281)
at android.animation.RevealAnimator.(RevealAnimator.java:37)
at android.view.ViewAnimationUtils.createCircularReveal(ViewAnimationUtils.java:71)
at per.goweii.anylayer.AnimatorHelper.createCircularRevealOutAnim(AnimatorHelper.java:339)

坐标问题

AnyLayer中

private void initRootView(){
        Activity activity = Utils.getActivity(mContext);
        if (activity == null) {
            throw new NullPointerException();
        }
        mRootView = activity.getWindow().getDecorView().findViewById(android.R.id.content);
    }

...

private void initContainer() {
        if (mCancelableOnTouchOutside) {
            mViewHolder.getContainer().setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    dismiss();
                }
            });
        }
        if (mTargetView != null) {
            int[] locationTarget = new int[2];
            mTargetView.getLocationOnScreen(locationTarget);
            int[] locationRoot = new int[2];
            mRootView.getLocationOnScreen(locationRoot);
            int paddingTop = 0;
            int paddingBottom = 0;
            int paddingLeft = 0;
            int paddingRight = 0;
            if (mDirection == Direction.TOP) {
                paddingBottom = mRootView.getHeight() - locationTarget[1];
            } else if (mDirection == Direction.BOTTOM){
                paddingTop = locationTarget[1] - locationRoot[1] + mTargetView.getHeight();
            } else if (mDirection == Direction.LEFT){
                paddingRight = mRootView.getWidth() - locationTarget[0];
            } else if (mDirection == Direction.RIGHT){
                paddingLeft = locationTarget[0] - locationRoot[0] + mTargetView.getWidth();
            }
            mViewHolder.getContainer().setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom);
        }
    }

getLocationOnScreen是包括状态栏的,计算的坐标是整个屏幕的,而mRootView取的是android.R.id.content,此View是不包括状态栏的,所以mRootView.getHeight是忽略栏状态栏的高度,所算出的paddingBottom肯定是有偏差的。DecorView是包括状态栏的。
可作修改:

private void initRootView(){
        Activity activity = Utils.getActivity(mContext);
        if (activity == null) {
            throw new NullPointerException();
        }
        mRootView = (ViewGroup) activity.getWindow().getDecorView();
    }

使用compatSoftInput 出现如下问题

在我的两个界面中都使用了同一个dialog,代码如下:
`public static void showBottomInputDialog(Activity activity, OnDialogClickListener listener) {
AnyLayer.dialog(activity)
.backgroundDimDefault()
.gravity(Gravity.BOTTOM)
.contentView(R.layout.dialog_text_input)
.onVisibleChangeListener(new Layer.OnVisibleChangeListener() {
@OverRide
public void onShow(Layer layer) {
((DialogLayer) layer).compatSoftInput(true, layer.getView(R.id.edtText));
}

                @Override
                public void onDismiss(Layer layer) {
                    ((DialogLayer) layer).removeSoftInput();
                }
            })
            .onClick((layer, v) -> {
                if (v.getId() == R.id.iv_confirm) {
                    if (listener != null) {
                        String content = ((EditText) layer.getView(R.id.edtText)).getText().toString().trim();
                        if (ObjectUtils.isEmpty(content)) {
                            ToastUtils.showShort("请输入文字");
                        } else {
                            listener.onConfirm(content, layer);
                            layer.dismiss();
                        }
                    }
                } else if (v.getId() == R.id.iv_cancel) {
                    layer.dismiss();
                }

            }, R.id.iv_confirm, R.id.iv_cancel)
            .show();
}`

第一个界面弹窗后显示正常,如下:
image

第二个界面弹窗后,出现异常:
中间会多出一段空白,点击空白处,
image

空白处消失,如下:
image
再点击输入框后,页面显示正常,如下:
image

请问这种情况,我该如何处理呢?

棒棒棒!

希望库主可以更新了设计思路,给了小star的同学们想学习学习哈~ (^_−)☆

pop形式支持指定区域的背景灰色吗

平时用pop弹窗的大多需求为在某个view位置下面弹窗,该内容下面的剩余部分背景置灰处理,这块的处理会受限于一些android 版本产生一些适配性的差异,这种情况能支持吗

依赖加载不到

我使用Android Studio 4.2 beta 5版本,没使用代理。编译时报如下错误:
Could not resolve com.github.goweii:AnyLayer:4.1.4-androidx.
> Could not get resource 'https://dl.bintray.com/tencentqcloudterminal/maven/com/github/goweii/AnyLayer/4.1.4-androidx/AnyLayer-4.1.4-androidx.pom'.
> Could not HEAD 'https://dl.bintray.com/tencentqcloudterminal/maven/com/github/goweii/AnyLayer/4.1.4-androidx/AnyLayer-4.1.4-androidx.pom'. Received status code 403 from server: Forbidden
> Could not resolve com.github.goweii:AnyLayer:4.1.4-androidx.
> Could not get resource 'https://dl.bintray.com/umsdk/release/com/github/goweii/AnyLayer/4.1.4-androidx/AnyLayer-4.1.4-androidx.pom'.
> Could not HEAD 'https://dl.bintray.com/umsdk/release/com/github/goweii/AnyLayer/4.1.4-androidx/AnyLayer-4.1.4-androidx.pom'. Received status code 403 from server: Forbidden

提几个建议

是否可以增加几个类型:
1.bottomSheet样式的dialog
2.仿抖音评论长按删除的dialog
3.单选列表的dialog

AnyLayer.dialog 滚动视图不显示滚动条

版本4.1.4-androidx
代码位于demo的 per/goweii/android/anylayer/DragActivity.java:66
嵌入ScrollView 或者Recyleview等滚动视图是不显示滚动条,
我自己的项目是这种情况, 使用demo 也是这种情况.
按理说应该显示滚动条的,不知道是为什么
QQ20210513-160633

布局问题

最新版使用锚点效果添加的View宽度异常

NullPointerException

java.lang.NullPointerException

Attempt to invoke virtual method 'android.view.View android.view.View.findFocus()' on a null object reference

per.goweii.anylayer.ViewManager$1.run(ViewManager.java:153)

Anylayer会自动获取焦点的问题

使用中如果edittext拥有焦点,键盘处于展开状态,这时候用anylayer弹出popu会导致edittext失去焦点,键盘状态不变,但是无法输入,请问有好的解决办法

gravity 无效

mDialogLayer.gravity(Gravity.BOTTOM); 无效
版本:3.2.0
不管gravity设置什么属性都是top状态

BUG

圆形揭露 关闭同时不断点击屏幕,关闭动画会重复执行导致屏幕闪烁

minSdk version to at least 19

minSdk version to at least 19,感觉minSdk 19太高了,兼容不好。
没看代码的Sdk需求,如无特殊,推荐能小一些。

Bug

传入一个new出来的View,或者inflate出来的View对象,传入contentView函数,第二次就会弹不出来。
initContent函数中,mContent第二次getParent是不为空的。
原函数:

private void initContent() {
        if (mContent != null) {
            if (mContent.getParent() == null) {
                mContent.setClickable(true);
                if (mGravity != -1) {
                    FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mContent.getLayoutParams();
                    params.gravity = mGravity;
                    mContent.setLayoutParams(params);
                }
                mViewHolder.getContentWrapper().addView(mContent);
            }
        }
    }

作修改:

private void initContent() {
        if (mContent != null) {
            ViewGroup contentGroup = (ViewGroup) mContent.getParent();
            if (contentGroup != null) {
                contentGroup.removeView(mContent);
            }
            mContent.setClickable(true);
            if (mGravity != -1) {
                FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mContent.getLayoutParams();
                params.gravity = mGravity;
                mContent.setLayoutParams(params);
            }
            mViewHolder.getContentWrapper().addView(mContent);
        }
    }

Toast键盘遮挡问题

小米手机上使用AnyLayer.toast(),如果软键盘处于打开状态,会被toast软键盘挡住,其他手机没试过,不清楚。

可以让跟随targetView滑动吗?

  1. 可以使用targetView.getViewTreeObserver().addOnScrollChangedListener来监听target的滑动事件
  2. PopupWindow有类似的功能
  3. 目前看了下应该是不可以的,demo好像弹出popup后也动不了了。
    如有误请斧正

然后看了下似乎是用margin来控制弹出的坐标的,个人感觉用layout方法好些

如何提一个有效的Issues?

我觉得提一个Issue至少要包括下面3个点:

  • 报错日志
  • 调用代码
  • 页面显示

不然我可能会直接关掉这个Issue。

点击屏幕两次dialog才会消失

我使用AnyLayer.dialog(getContext())创建并显示了一个dialog,第一次,点击屏幕一次就会消失,但是再次显示的话,如果使用第一次创建时保留下来的对象,直接调用layer.show(),那么就要点击屏幕两次才会退出。而且demo中的NormalActivity中的layer_dark_bg也出现了这种情况

void showSaveDlg(){
        if(actionLayer1 == null){
            actionLayer1 = AnyLayer.dialog(getContext())
                    .contentView(R.layout.dlg_circle_article_action_copy_and_save)
                    .backgroundDimDefault()
                    .cancelableOnTouchOutside(true)
                    .gravity(Gravity.BOTTOM)
                    .contentAnimator(new DialogLayer.AnimatorCreator() {
                        @Override
                        public Animator createInAnimator(@NonNull View content) {
                            return AnimatorHelper.createBottomInAnim(content);
                        }

                        @Override
                        public Animator createOutAnimator(@NonNull View content) {
                            return AnimatorHelper.createBottomOutAnim(content);
                        }
                    })
                    .onShowListener(new Layer.OnShowListener() {
                        @Override
                        public void onShowing(@NonNull Layer layer) {
                            
                        }
                        @Override
                        public void onShown(@NonNull Layer layer) {

                        }
                    })
                    .onClickToDismiss(R.id.iv_close);
        }
        actionLayer1.show();
    }

移除不彻底的问题

在一个APP主界面弹出了一个DIALOG,然后关掉,再次从微信公众号跳转到APP主界面,此时弹出一个DIALOG会导致 之前在主界面弹出的DIALOG出现在下方

4.1.5-androidx

build报错如下:
Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.

Could not resolve all task dependencies for configuration ':app:debugCompileClasspath'.
Could not resolve per.goweii.visualeffect:visualeffect-core:1.0.3.
Required by:
project :app > com.github.goweii.AnyLayer:anylayer:4.1.5-androidx
> Could not resolve per.goweii.visualeffect:visualeffect-core:1.0.3.
> Could not get resource 'https://dl.bintray.com/rongcloud/maven/per/goweii/visualeffect/visualeffect-core/1.0.3/visualeffect-core-1.0.3.pom'.
> Could not HEAD 'https://dl.bintray.com/rongcloud/maven/per/goweii/visualeffect/visualeffect-core/1.0.3/visualeffect-core-1.0.3.pom'. Received status code 403 from server: Forbidden
Could not resolve per.goweii.visualeffect:visualeffect-blur:1.0.3.
Required by:
project :app > com.github.goweii.AnyLayer:anylayer:4.1.5-androidx
> Could not resolve per.goweii.visualeffect:visualeffect-blur:1.0.3.
> Could not get resource 'https://dl.bintray.com/rongcloud/maven/per/goweii/visualeffect/visualeffect-blur/1.0.3/visualeffect-blur-1.0.3.pom'.
> Could not HEAD 'https://dl.bintray.com/rongcloud/maven/per/goweii/visualeffect/visualeffect-blur/1.0.3/visualeffect-blur-1.0.3.pom'. Received status code 403 from server: Forbidden
Could not resolve per.goweii.visualeffect:visualeffect-view:1.0.3.
Required by:
project :app > com.github.goweii.AnyLayer:anylayer:4.1.5-androidx
> Could not resolve per.goweii.visualeffect:visualeffect-view:1.0.3.
> Could not get resource 'https://dl.bintray.com/rongcloud/maven/per/goweii/visualeffect/visualeffect-view/1.0.3/visualeffect-view-1.0.3.pom'.
> Could not HEAD 'https://dl.bintray.com/rongcloud/maven/per/goweii/visualeffect/visualeffect-view/1.0.3/visualeffect-view-1.0.3.pom'. Received status code 403 from server: Forbidden


我加上maven { url "https://gitee.com/goweii/maven-repository/raw/master/releases/" },build成功了。但是app运行报错,如下:

java.lang.RuntimeException: Unable to get provider androidx.startup.InitializationProvider: java.lang.ClassNotFoundException: Didn't find class "androidx.startup.InitializationProvider" on path: DexPathList[[zip file "/data/app/...

这是要我依赖startup吗?求解决

界面存在RecyclerView造成RecyclerView滑动

你好,在存在RecyclerView加载图片的界面调用, 并且有点击存在时,

onClick(AnyLayer.OnLayerClickListener { p0, p1 ->
                        p0.dismiss()
                        when (p1.id) {
                            R.id.tv_edit -> {
                                startActivity<NewTaskActivity>("order" to mData)
                            }
                            R.id.tv_delete -> {
                                mData?.apply {
                                    mPresenter.operatorRewardOrder(id, RewardOrderBean.OPERATOR_TYPE_REVOKE)
                                }
                            }
                            else -> {
                            }
                        }
                    }, R.id.tv_edit, R.id.tv_delete, R.id.tv_cancel)

会造成RecyclerView向下滑动一段距离, 请问这个能解决么?

点击前
点击后

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.