Android重新定位视图,错误的y值

时间:2013-11-26 21:58:00

标签: android android-layout android-view

我正在尝试将视图从一个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]的值相同)。

另一件事是,与原始视图相比,视图的宽度更小,高度更大。

这是什么原因?为了做到这一点,我需要做些什么?

2 个答案:

答案 0 :(得分:1)

请注意,这与this one不同,但the solution可能相同。

我做了一个简单的测试。用这个西洋双陆棋板。

a backgammon board draft with some chips in a point

然后:

  1. 将左侧的第一个芯片(底部的红色芯片)移动到右侧
  2. 将左侧的第二个芯片(底部的蓝色芯片)移动到右侧
  3. 将第三个芯片移动到右侧第一个位置
  4. 所以,它就是

    4          0     --->     4          3
    3          0     --->     0          1
    2          0     --->     0          2
    1          0     --->     0          0
    

    backgammon after moving chips around

    如您所见,结果并不正常,所有筹码都保持原来的位置。

    另一方面,正在添加视图并正确显示芯片(由于第三次移动,您可以连续看到两个红色芯片)

    实际上这是因为只是将芯片放在正确的位置并不会使它们强制布局。您需要将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值位置并进行设置。你不能只使用相同的。