Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

系统级弹窗消失与新建问题 #5

Closed
HMZhhh opened this issue Aug 20, 2019 · 2 comments
Closed

系统级弹窗消失与新建问题 #5

HMZhhh opened this issue Aug 20, 2019 · 2 comments

Comments

@HMZhhh
Copy link

HMZhhh commented Aug 20, 2019

首先很感谢开源这个项目,在使用当中有些地方发现的问题提出一下,
设置了 .setSidePattern(SidePattern.TOP) 之后 配合 .setGravity(Gravity.TOP, 0, 20)这个偏移 拖动功能就失效了。我的设置总属性如下:
EasyFloat.with(this).setLayout(R.layout.item_float_top_view)
.setMatchParent(true, false)
// .setSidePattern(SidePattern.TOP)
.setTag("only" + i)
.setDragEnable(true)
.setShowPattern(ShowPattern.FOREGROUND)
.setGravity(Gravity.TOP, 0, 20)

            .setAppFloatAnimator(null)
            .invokeView(this)
            .show();

因业务需要 弹窗会被下一个弹窗顶掉 也就是弹窗内容改变 可是 .invokeView(this) 的话貌似只能在新弹窗才能更新xml内容
然后在创新新弹窗和销毁上一个弹窗的时候 出现了一个问题 首先代码如下

private int i = 0;
@Override
public void invoke(View floatingView) {
    ((TextView) floatingView.findViewById(R.id.tv_tip_show)).setText("电");
    ((TextView) floatingView.findViewById(R.id.tv_tip_content)).setText("电气工程" + i);
}
@OnClick(R.id.btn)
public void onViewClicked() {
    if (EasyFloat.appFloatIsShow("only"+i)) {
        EasyFloat.dismissAppFloat(this, "only"+i);
    }
    i++;
    showFloat();
}

先判断是否显示 然后dismiss掉它 再show一个不同的tag 此时发现一个问题 0-1 Floatservice 正常启动 然后在 1-2的过程中 dismiss 1 之后 此时 2还未被启动 也就未添加到 floatTag 中 然后在1完结动画后 就stopService了 就这样 2 成了孤儿。。而后续 又因为 2被添加进了 floatTag 并且不会被清除,所以后续的 3 ,4等tag /**
* 关闭浮窗后,检测是否需要关闭Service
*/
fun checkStop(context: Context, floatTag: String?) {
// 先清除当条浮窗信息
if (floatMap.isNotEmpty()) floatMap.remove(floatTag)
// 如有没有其他浮窗存在,关闭Service
if (floatMap.isEmpty()) context.stopService(Intent(context, FloatService::class.java))
}
并不会stopService 就独独 2 会很尴尬

我的解决方法是
private int i = 0;
private int oldI = 0;
@OnClick(R.id.btn)
public void onViewClicked() {
oldI = i;
i++;
showFloat();
if (EasyFloat.appFloatIsShow("only" + oldI)) {
EasyFloat.dismissAppFloat(this, "only" + oldI);
}
}
先show 后 dismiss 目前看 是不会stopService 了所以每一个dismiss 都会执行。
当然 还是 希望能优化 这部分。。。

@princekin-f
Copy link
Owner

princekin-f commented Aug 20, 2019

你好,首先感谢反馈!

针对问题1:

  • setSidePattern(SidePattern.TOP)是设置浮窗始终吸附顶部的意思,意思说只能在顶部的左右拖动;
  • 而你设置了宽度MatchParent,所以就会出现左右也无法拖动的情况;
  • 如果想要支持拖拽到屏幕外部,就需要修改相关代码了。

针对问题2:测试了一下,确实出现你所说的问题。

  • 我这边是这样处理的,将stopService进行延迟执行:
/**
 * 关闭浮窗后,检测是否需要关闭Service
 */
fun checkStop(context: Context, floatTag: String?) {
    // 先清除当条浮窗信息
    if (floatMap.isNotEmpty()) floatMap.remove(floatTag)
    // 如有没有其他浮窗存在,延迟关闭Service
    if (floatMap.isEmpty()) {
        Handler(Looper.getMainLooper()).postDelayed({
            if (floatMap.isEmpty()) {
                context.stopService(Intent(context, FloatService::class.java))
            }
        }, 500)
    }
}

再次感谢你的反馈···

@HMZhhh
Copy link
Author

HMZhhh commented Aug 22, 2019

感谢解惑(* ̄︶ ̄)

@HMZhhh HMZhhh closed this as completed Aug 22, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants