首先展示一下实现效果:
1.第一步首先是绘制样式
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.cardview.widget.CardView
android:id="@+id/view_pop"
android:layout_marginBottom="@dimen/dp_10"
android:layout_marginStart="@dimen/dp_31"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:cardBackgroundColor="#1A1A1A"
app:cardCornerRadius="@dimen/dp_10"
app:cardElevation="@dimen/dp_0"
android:layout_width="245dp"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_pop_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/popUpWindow_text"
android:padding="@dimen/dp_10"
app:gilroyFont="regular"
android:textSize="@dimen/sp_14"
android:textColor="@color/color_f6f6f6" />
</androidx.cardview.widget.CardView>
<ImageView
android:id="@+id/triangle_one"
android:layout_width="@dimen/dp_20"
android:layout_height="8dp"
android:layout_marginBottom="@dimen/dp_2"
android:layout_gravity="start|bottom"
android:src="@mipmap/ic_triangle_down"/>
</FrameLayout>
UI绘制上可能会有一定的出入 ,大家根据所需的实际弹窗宽高去设置,博主这里是一个限定宽度的弹窗,根据内容去适配弹窗高度,弹窗下方三角形的位置是可以改变的,这样方便去适配不同位置的按钮(例如我需要弹出PopupWindow弹窗的位置在屏幕的角落)
2.第二步则是写弹出逻辑,每一步骤博主都有详细讲解。由于三角形是出现在点击按钮的上方,则需要给到该按钮在屏幕上的位置参数,这样就能够调整三角形图标的位置了。
private fun showPopupWindow(x:Int,y: Int) {
//通过layoutInflater实例,从布局文件R.layout.yourPopupWindow中加载弹出窗口的布局并将其转换为View对象
val popupView = layoutInflater.inflate(R.layout.yourPopupWindow, null) as View
//通过 findViewById获取弹出窗口布局中的弹窗控件
val popText = popupView.findViewById<TextView>(R.id.tv_pop_text)
//通过 findViewById获取弹出窗口布局中的三角形控件
val third = popupView.findViewById<ImageView>(R.id.triangle_one)
//创建一个 PopupWindow 对象,指定弹出窗口的内容视图、宽度和高度,并设置是否可获取焦点
val popupWindow = PopupWindow(
popupView,
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
true
)
//为弹出窗口内的TextView设置文本内容
popText.setText(context.getString(R.string.popUpWindow_text))
//计算popupHeight,xOffset,yOffset,其中xOffset表示横向偏移量,yOffset表示纵向偏移量
popupView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
val popupHeight = popupView.measuredHeight
val xOffset = x
val yOffset = y - popupHeight
//显示弹出窗口
popupWindow.showAtLocation(binding.root, Gravity.NO_GRAVITY, xOffset, yOffset)
//调整三角形图标的位置
third.x = x.toFloat()
}
3.最后一步则是给按钮绑定上点击事件,获取按钮在屏幕上的位置并传参。
binding.yourBotton.setOnClickDelay {
val location = IntArray(2)
binding.yourBotton.getLocationOnScreen(location)
val xData = location[0]
val yData = location[1]
showPopupWindow(xData,yData)
}
以上就是一个简单的PopupWindow实现,有帮助的可以给个一键三连哦
新人报到,请多关照。