Android View.getLayoutParams() leftMargin 和 topMargin 给出 0
Android View.getLayoutParams() leftMargin and topMargin give 0
我在 RelativeLayout 中有一个视图,其中 layout_alignParentBottom 和 layout_alignParentRight 属性设置为 true,如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rlroot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<View
android:id="@+id/v_green"
android:layout_height="@dimen/square_size"
android:layout_width="@dimen/square_size"
android:background="@color/green"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
我希望能够移动此视图。我正在努力实现以下目标:
@Override
public boolean onTouch(View v, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
xDelta = X - lParams.leftMargin;
yDelta = Y - lParams.topMargin;
Log.d("MainActivity","Action_Down:X="+X+",Y="+Y+",xD="+xDelta+",yD="+yDelta+",lm="+lParams.leftMargin+",tm="+lParams.topMargin);
break;
case MotionEvent.ACTION_UP:
Log.d("MainActivity","Action_up");
break;
case MotionEvent.ACTION_POINTER_DOWN:
Log.d("MainActivity","Action_Pointer_Down");
break;
case MotionEvent.ACTION_POINTER_UP:
Log.d("MainActivity","Action_Pointer_Up");
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
layoutParams.leftMargin = X - xDelta;
layoutParams.topMargin = Y - yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
v.setLayoutParams(layoutParams);
Log.d("MainActivity","Action_Move:X="+X+",Y="+Y+",xD="+xDelta+",yD="+yDelta);
break;
}
rootLayout.invalidate();
return true;
}
问题是 layoutParams.leftMargin 和 layoutParams.topMargin 被发现为 0(从日志中找到)所以当我触摸视图时它会跳到左上角然后我可以正确移动它。为什么在RelativeLayout的右下角是0?事情是我在 RelativeLayout 屏幕的四个角上有四个视图,我希望能够移动它们。都有同样的问题。
终于找到解决办法了。问题在于 alignParentBottom 或 alignParentTop 等视图属性等于 true。我通过从视图中删除这些属性来验证它,我可以拖动它们。所以我所做的是在 onTouch 的 ACTION_DOWN 内部,我检查了视图的 4 个 alignParentXXXX 属性中的任何一个是否为真。如果发现设置为 true 我将其设置为 false 并添加所需的初始保证金。以下是 2 个属性的示例代码:
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
if(lParams.getRule(RelativeLayout.ALIGN_PARENT_BOTTOM)==RelativeLayout.TRUE)
{
lParams.topMargin = v.getTop();
lParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,0);
Log.d("MainActivity","added Rule bottom");
}
if(lParams.getRule(RelativeLayout.ALIGN_PARENT_TOP)==RelativeLayout.TRUE)
{
lParams.bottomMargin = v.getBottom();
lParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,0);
Log.d("MainActivity","added Rule top");
}
其他 2 个属性也类似。这现在对我有用。我还在我的 blog 中编写了完整的代码,以防将来有人遇到这个问题。
我在 RelativeLayout 中有一个视图,其中 layout_alignParentBottom 和 layout_alignParentRight 属性设置为 true,如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/rlroot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<View
android:id="@+id/v_green"
android:layout_height="@dimen/square_size"
android:layout_width="@dimen/square_size"
android:background="@color/green"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
/>
</RelativeLayout>
我希望能够移动此视图。我正在努力实现以下目标:
@Override
public boolean onTouch(View v, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
xDelta = X - lParams.leftMargin;
yDelta = Y - lParams.topMargin;
Log.d("MainActivity","Action_Down:X="+X+",Y="+Y+",xD="+xDelta+",yD="+yDelta+",lm="+lParams.leftMargin+",tm="+lParams.topMargin);
break;
case MotionEvent.ACTION_UP:
Log.d("MainActivity","Action_up");
break;
case MotionEvent.ACTION_POINTER_DOWN:
Log.d("MainActivity","Action_Pointer_Down");
break;
case MotionEvent.ACTION_POINTER_UP:
Log.d("MainActivity","Action_Pointer_Up");
break;
case MotionEvent.ACTION_MOVE:
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
layoutParams.leftMargin = X - xDelta;
layoutParams.topMargin = Y - yDelta;
layoutParams.rightMargin = -250;
layoutParams.bottomMargin = -250;
v.setLayoutParams(layoutParams);
Log.d("MainActivity","Action_Move:X="+X+",Y="+Y+",xD="+xDelta+",yD="+yDelta);
break;
}
rootLayout.invalidate();
return true;
}
问题是 layoutParams.leftMargin 和 layoutParams.topMargin 被发现为 0(从日志中找到)所以当我触摸视图时它会跳到左上角然后我可以正确移动它。为什么在RelativeLayout的右下角是0?事情是我在 RelativeLayout 屏幕的四个角上有四个视图,我希望能够移动它们。都有同样的问题。
终于找到解决办法了。问题在于 alignParentBottom 或 alignParentTop 等视图属性等于 true。我通过从视图中删除这些属性来验证它,我可以拖动它们。所以我所做的是在 onTouch 的 ACTION_DOWN 内部,我检查了视图的 4 个 alignParentXXXX 属性中的任何一个是否为真。如果发现设置为 true 我将其设置为 false 并添加所需的初始保证金。以下是 2 个属性的示例代码:
case MotionEvent.ACTION_DOWN:
RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) v.getLayoutParams();
if(lParams.getRule(RelativeLayout.ALIGN_PARENT_BOTTOM)==RelativeLayout.TRUE)
{
lParams.topMargin = v.getTop();
lParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,0);
Log.d("MainActivity","added Rule bottom");
}
if(lParams.getRule(RelativeLayout.ALIGN_PARENT_TOP)==RelativeLayout.TRUE)
{
lParams.bottomMargin = v.getBottom();
lParams.addRule(RelativeLayout.ALIGN_PARENT_TOP,0);
Log.d("MainActivity","added Rule top");
}
其他 2 个属性也类似。这现在对我有用。我还在我的 blog 中编写了完整的代码,以防将来有人遇到这个问题。