android中给view添加遮罩层

1.在 res 目录中添加 id :

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="view_mask_id" type="id" />
</resources>

2.扩展方法:

/** 给一个 View 添加一层由 [res] 填充的遮罩层布局, 可通过 [isShowOrigin] 控制是否显示原始布局, 返回 [res] 填充后的布局. */
fun View?.addMask(@LayoutRes res: Int, isShowOrigin: Boolean = true): View? {
    this ?: run {
        Logs.w("addMask error! -----> view is null!")
        return null
    }
    val maskLayout = LayoutInflater.from(this.context).inflate(res, null, false)
    addMask(maskLayout, isShowOrigin)
    return maskLayout
}

/** 给一个 View 添加一层 [maskLayout] 遮罩层布局, 可通过 [isShowOrigin] 控制是否显示原始布局. */
fun View?.addMask(maskLayout: View, isShowOrigin: Boolean = true) {
    this ?: run {
        Logs.w("addMask error! -----> view is null!")
        return
    }
    val parent = this.parent as? ViewGroup
    parent ?: run {
        Logs.w("addMask error! -----> parent is null!")
        return
    }
    val originLayout = this
    val maskLayoutContainer = FrameLayout(originLayout.context)
    // 将原始布局替换为 container.
    originLayout.replaceWith(maskLayoutContainer)
    maskLayoutContainer.apply {
        val lp = FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT
        )
        // 如果需要显示原始布局, 添加原始布局到 container 中.
        if (isShowOrigin) {
            maskLayoutContainer.addView(originLayout.apply { layoutParams = lp })
        }
        // 添加 mask 布局.
        maskLayoutContainer.addView(maskLayout.apply { layoutParams = lp })
    }
    originLayout.setTag(R.id.view_mask_id, maskLayoutContainer)
}

/**
 * 移除遮罩层布局.
 */
fun View?.removeMask() {
    this ?: let {
        Logs.w("removeMask error! -----> View is null!")
        return
    }
    val originLayout = this
    val maskLayoutContainer = this.getTag(R.id.view_mask_id) as? ViewGroup
    maskLayoutContainer ?: let {
        Logs.w("removeMask error! -----> maskLayout is null!")
        return
    }
    maskLayoutContainer.replaceWith(originLayout)
}

/** 将 View 替换为 [res] 填充后的布局, 返回 [res] 填充后的布局. */
fun View?.replaceWith(@LayoutRes res: Int): View? {
    this ?: run {
        Logs.w("replaceWith error! -----> view is null!")
        return null
    }
    val replaceLayout = LayoutInflater.from(this.context).inflate(res, null, false)
    replaceWith(replaceLayout)
    return replaceLayout
}

/** 将 View 替换为 [replaceView]. */
fun View?.replaceWith(replaceView: View) {
    this ?: run {
        Logs.w("replaceWith error! -----> view is null!")
        return
    }
    val parent = this.parent as? ViewGroup
    parent ?: run {
        Logs.w("replaceWith error! -----> parent is null!")
        return
    }
    val originView = this
    val originViewIndex = parent.children.indexOf(originView)
    if (originViewIndex >= 0) {
        replaceView.id = originView.id
        parent.removeViewAt(originViewIndex) // 移除原始布局.
        replaceView.removeFromParent() // 添加之前, 先从父布局移除 replaceView.
        parent.addView(replaceView, originViewIndex, originView.layoutParams)
    } else {
        Logs.w("replaceWith error! -----> child index is $originViewIndex")
    }
}

/** 将 View 从它的父布局移除. */
fun View?.removeFromParent() {
    this ?: run {
        Logs.w("removeFromParent error! -----> view is null!")
        return
    }
    val parent = this.parent as? ViewGroup
    parent ?: run {
        Logs.w("removeFromParent error! -----> parent is null!")
        return
    }
    parent.removeView(this)
}

相关推荐

  1. androidview添加

    2024-04-30 15:38:05       33 阅读
  2. iOS app切换后台时添加模糊

    2024-04-30 15:38:05       59 阅读
  3. vue3 | 自定义组件

    2024-04-30 15:38:05       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-30 15:38:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-30 15:38:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-30 15:38:05       82 阅读
  4. Python语言-面向对象

    2024-04-30 15:38:05       91 阅读

热门阅读

  1. leetcode_40.组合总和 II

    2024-04-30 15:38:05       33 阅读
  2. 什么是AI推理

    2024-04-30 15:38:05       28 阅读
  3. conda修改当前环境中的python版本

    2024-04-30 15:38:05       35 阅读
  4. 响应式布局插件

    2024-04-30 15:38:05       34 阅读
  5. 行列式求解

    2024-04-30 15:38:05       32 阅读
  6. YOLOv8+bytetrack实现多目标追踪

    2024-04-30 15:38:05       38 阅读
  7. 生成能够精确匹配原字符串的正则表达式

    2024-04-30 15:38:05       38 阅读
  8. zynq基础知识学习(1)

    2024-04-30 15:38:05       30 阅读
  9. 【软测学习笔记】Linux入门Day01

    2024-04-30 15:38:05       28 阅读
  10. 点云和去噪

    2024-04-30 15:38:05       38 阅读