我正在尝试将视图从一个RelativeLayout容器移动到另一个RelativeLayout,在下面的代码中名为transparentOverlay。 (另一个是叠加层,我打算用它来制作我的动画)。
这是我的布局结构:
<RelativeLayout
android:id="@+id/rootLayer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/activity_padding">
<!-- The value of activity_padding is 16dp -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" >
....
</RelativeLayout>
<!-- Transparent layer -->
<RelativeLayout
android:id="@+id/transparentOverlay"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent" />
</RelativeLayout>
以下是我正在使用的代码:
int[] prevLocForView = new int[2];
view.getLocationOnScreen(prevLocForView);
RelativeLayout rl = (RelativeLayout) rootLayer.findViewById(R.id.transparentOverlay);
int[] rlLoc = new int[2];
rl.getLocationOnScreen(rlLoc);
rl.addView(view);
RelativeLayout.LayoutParams layoutParams = (android.widget.RelativeLayout.LayoutParams) view.getLayoutParams();
layoutParams.leftMargin = currentLocForLetterView[0] - rlLoc[0];
layoutParams.topMargin = currentLocForLetterView[1] - rlLoc[1];
它显示在容器中的正确位置,但是,它从以下代码返回错误的y值:
int[] temp = new int[2];
view.getLocationInWindow(temp);
x值是正确的,但y值是先前的370,现在是24(与rlLoc[1]
的值相同)。
另一件事是,与原始视图相比,视图的宽度更小,高度更大。
这是什么原因?为了做到这一点,我需要做些什么?
答案 0 :(得分:1)
请注意,这与this one不同,但the solution可能相同。
我做了一个简单的测试。用这个西洋双陆棋板。
然后:
所以,它就是
4 0 ---> 4 3
3 0 ---> 0 1
2 0 ---> 0 2
1 0 ---> 0 0
如您所见,结果并不正常,所有筹码都保持原来的位置。
另一方面,正在添加视图并正确显示芯片(由于第三次移动,您可以连续看到两个红色芯片)
实际上这是因为只是将芯片放在正确的位置并不会使它们强制布局。您需要将onLayoutChangeListener添加到您正在移动的视图中,这样您就可以在执行后对布局更改做出反应,因此,在您获得最终位置后:
public class YourView extends View {
private int[] currentLocation = new int[2];
/*.....
* blah,blah,blah
* .....*/
public void init() {
this.addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
int[] newLocation = new int[2];
v.getLocationOnScreen(newLocation);
Log.d("New location:", "("+newLocation[0]+","+newLocation[1]+")");
/** Do whatever is needed with old and new locations **/
currentLocation = newLocation;
}
});
}
答案 1 :(得分:0)
该值始终与视图的父级相关。 因此,您必须计算新的y值位置并进行设置。你不能只使用相同的。