Android实现PopupWindow浮窗

首先展示一下实现效果:

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实现,有帮助的可以给个一键三连哦

新人报到,请多关照。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值