为什么Framelayout中的setY不起作用?

时间:2018-05-21 09:16:13

标签: android

我将一个Imageview放在match_parent Framelayout中,Framelayout的可见性为GONE,然后计算ImageView的坐标和setX / Y,然后使Framelayout VISIABLE。但ImageView的布局位置很奇怪!

守则很简单:

override fun onVisibilityChanged(
    changedView: View?,
    visibility: Int) {

    if(visibility == View.VISIBLE && mTargetView != null){
        var location = intArrayOf(0,0)
        mTargetView?.getLocationOnScreen(location)

        var x = location[0] + mTargetView?.width!! / 2 - mIconWidth/2
        var y = location[1] - mIconHeight / 2 - mStatusBarH

        Log.d("lee","\nbefore x: ${mDelView.x}, y: ${mDelView.y}")
        /* 
         * use this code will get the right result.
        mLayoutParams.leftMargin = x
        mLayoutParams.topMargin = y
        */
        mDelView.x = x.toFloat()
        mDelView.y = y.toFloat()

        Log.d("lee","\nafter x: ${mDelView.x}, y: ${mDelView.y}")

    }

    super.onVisibilityChanged(changedView, visibility)
}

日志显示坐标是否正确:

lee: before x: 492.0, y: 332.0
after x: 492.0, y: 332.0

布局位置显示ImageView的布局位置始终位于左上角。使用下图时,使用LayoutParams边距,布局位置正确。这让我很困惑。

enter image description here enter image description here

2 个答案:

答案 0 :(得分:0)

  

布局位置显示ImageView的布局位置始终位于左上角

因为这是FrameLayout的工作原理。您想要手动定位容器的子项,使用RelativeLayout或编写自己的容器。

答案 1 :(得分:0)

视图的布局边界由视图的左,上,下,右位置决定,相对于父级。布局机制的第二阶段将计算这些位置。

/**
 * Sets the visual x position of this view, in pixels. This is equivalent to setting the
 * {@link #setTranslationX(float) translationX} property to be the difference between
 * the x value passed in and the current {@link #getLeft() left} property.
 *
 * @param x The visual x position of this view, in pixels.
 */
public void setX(float x) {
    setTranslationX(x - mLeft);
}

setX源代码显示此功能仅更改此视图的visual x位置,并且mLeft值不会更改。所以setX / Y不会改变布局位置。