huburt-Hu / NewbieGuide

Android 快速实现新手引导层的库,通过简洁链式调用,一行代码实现引导层的显示
Apache License 2.0
3.56k stars 521 forks source link

你好,请问动态设置控件位置后,如何将遮罩层位置相应调整呢? #104

Closed jinshenglongsw closed 5 years ago

jinshenglongsw commented 5 years ago

现在我的需求是activity中两个fragment来回切换,首页4个按钮(位置是动态换算屏幕宽度后固定位置,非权重)绘制出了以后添加蒙板在按钮下方,但这个位置该如何固定呢?宽度倒是可以跟按钮的位置设置为一样的,可高度却无法满足要求。 现在个人的解决方案是 在 globallistener中获取动态设置按钮的坐标位置,取得高度后 设置 遮罩层提示按钮的 margin= 按钮的高度+ 按钮高度 /2 ,但还是不准。有什么好的思路可以借鉴吗? 困扰了一段时间,望回复。谢谢

huburt-Hu commented 5 years ago

是使用“相对高亮位置的引导布局”吗?没太清楚你想要实现的效果,可以贴张图说明下

jinshenglongsw commented 5 years ago

首页是这个样子的。 image 这四个按钮的位置,我不是在布局中设置权重来做的,而是addOnGlobalLayoutListener中获得屏幕 宽度后,设置的(leftButtonParams.setMarginStart((Utils.getScreenWidth() - emergencyTextView.getWidth() 2) / 3);), 顺便在这个监听中 获取 四个按钮的 X,Y坐标保存。 获得这4个按钮的坐标以后,我在设置蒙版的setOnLayoutInflatedListener里边找到蒙板提示按钮,设置layoutparams,代码为: leftButtonParams.setMargins((Utils.getScreenWidth() - emergencyTextView.getWidth() 2) / 3, diyipai_y + (emergencyTextView.getHeight()/2), 0, 0); (上面思路是:按钮左边的marginLeft跟按钮本身的marginLeft设置一样就好,MarginTop是 获取按钮的Y坐标+按钮高度的一半)。 按照这种思路绘制出的蒙板位置有偏差(思路正确的话位置应为紧贴按钮)。 是我逻辑出了问题嘛?或者可能有更好的解决方法吧,希望能给提个思路。感谢百忙中的回复,谢谢您。

huburt-Hu commented 5 years ago

传入高亮有试过直接传入view吗?然后使用RelativeGuide来摆放引导视图

jinshenglongsw commented 5 years ago

传入高亮有试过直接传入view吗?然后使用RelativeGuide来摆放引导视图

1.现在用这种方式来试着摆放了一下,蒙板的位置是对的,但凹槽却出现问题了。 image 上图是 设置 RelativeGuide 后 凹槽位置出错的问题(.addHighLight(issueTextView, // new RelativeGuide(R.layout.view_guide_simple..)

image 上图是直接添加后,凹槽位置没问题(.addHighLight(issueTextView)) 感觉应该跟我的动态控制按钮位置有关系吧。

2.还有就是如果这样的话,是没有设置:setLayoutRes的,这样的话怎么跳转到下个按钮的蒙板呢?

挺麻烦作者的,像我这样的需求应该不多。。望能回复,请注意身体,谢谢。

jinshenglongsw commented 5 years ago

传入高亮有试过直接传入view吗?然后使用RelativeGuide来摆放引导视图

按照老哥的思路,我重新做了布局,然后在按钮监听中设置controller,算是解决了所有问题吧。 这个问题感觉也没多大意义? 老哥可以关闭了,还是麻烦您了。

JasonBtc commented 3 years ago

蒙层有偏差怎么解决的啊?我这边也出现了这个问题

JasonBtc commented 3 years ago

我也是加了relativeguide引导布局, 蒙层的高亮就有偏差了

jinshenglongsw commented 3 years ago

我也是加了relativeguide引导布局, 蒙层的高亮就有偏差了

我刚看了一下代码,准确的记不清了,你自己看一下。 .addGuidePage( //添加2页引导页 GuidePage.newInstance()//创建一个实例 .setEnterAnimation(enterAnimation)//进入动画 .setExitAnimation(exitAnimation)//退出动画 .setEverywhereCancelable(false)//是否点击任意地方跳转下一页或者消失引导层,默认true .addHighLight(fireTextView, new RelativeGuide(R.layout.guide_common, Gravity.BOTTOM) {

                                @Override
                                protected void offsetMargin(MarginInfo marginInfo, ViewGroup viewGroup, View view) {
                                    super.offsetMargin(marginInfo, viewGroup, view);

                                    marginInfo.leftMargin = Utils.dip2px(getActivity(), 50);
                                    marginInfo.rightMargin = Utils.dip2px(getActivity(), 50);
                                }

                                @Override
                                protected void onLayoutInflated(View view, final Controller controller) {
                                    super.onLayoutInflated(view, controller);

                                    TextView textView = view.findViewById(R.id.guide_commonTextView);
                                    textView.setText(getString(R.string.guide_fire_tip));
                                    textView.setOnClickListener(new View.OnClickListener() {
                                        @Override
                                        public void onClick(View v) {
                                            controller.showPage(2);
                                        }
                                    });

                                    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
                                    params.gravity = Gravity.LEFT;
                                    //위에서 50dp 의 margin + leftView 의 크기 + 버튼 크기 /2
                                    params.setMarginStart(widthView.getWidth() - Utils.dip2px(getActivity(), 50) + (fireTextView.getWidth() / 2));
                                    ImageView imageView = view.findViewById(R.id.guide_commonImageView);
                                    imageView.setLayoutParams(params);

                                    //이미지 수평 180도 돌림.
                                    imageView.setScaleX(-1);
                                    imageView.setScaleY(1);
                                }
                            })

            )