我将一个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边距,布局位置正确。这让我很困惑。
答案 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不会改变布局位置。