记录一个弹框的实现过程

记录一些不难但是需要费些劲的小需求,以备忘记时可以查询,避免浪费时间,也希望能帮助到其他人。
一、需求
记录一个弹框的实现过程_第1张图片
涉及的知识点
1、背景不变暗
2、图中数字长度会变化,同时界面也可以滚动,所以图标位置会变化,弹框位置需要随图标的变化而变化
二、实现过程
1、背景变暗
第一个方法、style-android:backgroundDimEnabled(最终采用此方法):在弹框的style配置中,配置这个选项,并设置为false

第二个方法、 lp.dimAmount =0f;(未验证,就先不细说了)
2、位置
a:获取控件的绝对位置
由于整体布局采取了线性布局,直接获取图标的x、y值,只能获取 相对父控件的相对布局,通过搜索,找到获取绝对坐标的方法如下

val location = IntArray(2)  
ivTip.getLocationInWindow(location) //获取在当前窗口内的绝对坐标  
//ivTip.getLocationOnScreen(location)//获取在整个屏幕内的绝对坐标

采用上面的方法,可以获取图标的绝对坐标值,为弹框位置的确定打好基础

b:指定弹框位置弹出的位置
有了图标的坐标,下一步是让弹框的位置定位到图标的位置,首先,让dialog在指定位置展现方法如下:

Window window = dialog.getWindow();  
window.getDecorView().setPadding(0, 0, 0, 0);  
window.setGravity(gravity);  
WindowManager.LayoutParams lp = window.getAttributes();  
lp.x = x;  
lp.y = y;  
//设置显示位置  
dialog.onWindowAttributesChanged(lp);

方法中的x,y就是指定位置的坐标;
之后,由于弹框本身的空间,还需要计算下,弹框左上角的位置,根据标注计算如下:

x=location[0] - ConvertUtils.dp2px(172f),  
y=location[1]

这里的locationg就是a步骤中图标的坐标,可以看到y坐标和图标一致,x坐标则是图标坐标减去弹框背景中尖头到左边的距离。
由此需求实现
三、延申
1、Android的坐标系,以及控件的坐标和不同的获取方式
2、多种api的含义,如x、scrollX等的含义

你可能感兴趣的:(android)