如何在RelativeLayout中将视图与没有边距的另一个视图对齐?

时间:2016-08-19 03:56:17

标签: android android-layout android-relativelayout

我创建了这些视图>>> □口□

<View
    android:id="@+id/a"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:background="@color/opaque_red" />
<View
    android:id="@+id/b"
    android:layout_width="20dp"
    android:layout_height="20dp"
    android:layout_alignBottom="@id/a"
    android:layout_toRightOf="@id/a"
    android:background="@color/opaque_red" />
<View
    android:id="@+id/c"
    android:layout_width="20dp"
    android:layout_height="20dp"
    android:layout_alignBottom="@id/a"
    android:layout_toLeftOf="@id/a"
    android:background="@color/opaque_red" />

然后我让a可以在屏幕内移动

// v is whole screen
a=v.findViewById(R.id.a);

a.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {

        if (motionEvent.getAction() == MotionEvent.ACTION_MOVE || motionEvent.getAction() == MotionEvent.ACTION_DOWN) {

            int x = (int) motionEvent.getRawX();
            int y = (int) motionEvent.getRawY();

            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) a.getLayoutParams();

            // calculate x y should set to a, int[0] is x, int[1] is y
            int[] xy=centerPointToLeftTop(x,y,a.getMeasuredWidth(),a.getMeasuredHeight());

            // limit the a inside the screen. b and c just follow the a, they can go to outside of screen
            if(xy[0]<0) {
                params.leftMargin = 0;
            } else if (xy[0] > v.getMeasuredWidth()- a.getMeasuredWidth()){
                params.leftMargin=v.getMeasuredWidth()-a.getMeasuredWidth();
            } else {
                params.leftMargin = xy[0];
            }
            a.setLayoutParams(params);
            v.invalidate();
        }

        return true;
    }
});

保证金是改变Android视图位置的唯一方法

但边距也会影响两个视图之间的对齐,因此c视图(左方框)不会跟随a视图

如何在没有边距的情况下对齐视图?或者是否有其他方法可以在不改变边距的情况下移动视图?

1 个答案:

答案 0 :(得分:0)

删除

android:layout_alignBottom="@id/a"
android:layout_toLeftOf="@id/a"

从视图c。因为这些行会通知android如果移动我们还需要移动c。因此,删除这些行并添加任何将视图与窗口相关的属性,而不是元素a。