如何检查自定义视图是否有禁用的父视图?

How to check if a custom View has a disabled parent?

我有一个视图在禁用时可以进行一些自定义绘图:

override fun onDraw(canvas: Canvas) {
    // Drawing...

    if (!this.isEnabled) {
        // Custom drawing...
    }
}

当父对象之一被禁用时,它也绘制此禁用状态是合乎逻辑的。但是,即使其中一个父视图被禁用,isEnabled 也是如此。

android:duplicateParentState 看起来它可以做到,但我有时会深深地嵌套这个视图,它会转移所有状态(按下等)。

处理这个问题的规范方法是什么?

这是我目前的解决方案:

override fun onDraw(canvas: Canvas) {
    // Drawing...

    // Check for both the view and all its parents.
    if (!this.isEnabled || isAnyParentDisabled(parent)) {
        // Custom drawing...
    }
}

private fun isAnyParentDisabled(parent: ViewParent?): Boolean {
    // Recursively check for each parent if it's 
    // a View that has isEnabled set to false.
    val v = parent as? View ?: return false
    return if (v.isEnabled)
        anyParentDisabled(v.parent)
    else
        true
}

它有效,但它会在每次抽奖时通过所有 parents。