以 FrameLayout 作为根布局,在另一个视图之上添加视图,偏移量为 X、Y
With FrameLayout as root layout, add view on top of another one, with offset of X,Y
我想在现有视图之上放置一个视图。我定位的视图位于 LinearLayout 内,而 LinearLayout 位于 FrameLayout 内。
我在想有一种方法可以用 RelativeLayout 做到这一点,因为我已经让它部分工作了。我想将新视图对齐到左下角或左上角(作为原点),然后将 X 和 Y 偏移到我指定的某个精确值。
如何实现?
想法是这样的:
public static void placeTextRelativeToBottomLeftOfViewAtXY(final FrameLayout layout, View component, int x, int y, String text) {
final TextView textView = new TextView(getContext());
textView.setId((int)System.currentTimeMillis());
final RelativeLayout relativeLayout = new RelativeLayout(getContext());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
params.setMargins(x, y, 0,0);
params.addRule(RelativeLayout.LEFT_OF, component.getId());
relativeLayout.setLayoutParams(params);
relativeLayout.setBackgroundColor(Color.TRANSPARENT);
textView.setText("+500 points!");
textView.bringToFront();
relativeLayout.addView(textView, params);
layout.addView(relativeLayout);
}
根据评论中的附加信息,即使可以在 FrameLayout
中重叠不同的布局,这些布局也只能定位自己的子布局。
RelativeLayout
将无法相对于不同兄弟或父布局中的视图定位其子视图之一。
方法是扁平化布局的层次结构,将根布局设置为 RelativeLayout
或 ConstraintLayout
。
ConstraintLayout
在定位视图方面比较灵活,但也比较难学。
这里我留下了一个替代方案,与 RelativeLayout
一起用作根视图。需要注意的重要项目是 LayoutParams
的设置,这有时有点令人困惑。
LayoutParams
是在子视图上设置的,但是使用的class取决于父视图。
还要记住,要保持页边距独立显示,您需要将 dp 转换为像素(为简单起见,我没有这样做,但在 SO 中有如何执行此操作的示例)。
它还使用 View.generteViewId()
为动态创建的视图获取 id。
为简单起见,我在 xml 中包含了引用 View
,但我也可以动态创建。
布局
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rlContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvCenterText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Texto estatico"
android:layout_centerInParent="true"/>
</RelativeLayout>
主要Activity
public class DynamicViewsActivity extends AppCompatActivity {
RelativeLayout rlContainer;
TextView centerText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dynamicviews);
rlContainer = findViewById(R.id.rlContainer);
centerText = findViewById(R.id.tvCenterText);
placeTextRelativeToBottomLeftOfViewAtXY(rlContainer, centerText, 100,10, "Hola");
}
public void placeTextRelativeToBottomLeftOfViewAtXY(final RelativeLayout layout, View component, int x, int y, String text) {
final TextView textView = new TextView(this);
textView.setId(View.generateViewId());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(x, y, x,y);
params.addRule(RelativeLayout.LEFT_OF, component.getId());
params.addRule(RelativeLayout.ALIGN_BASELINE, component.getId());
textView.setLayoutParams(params);
textView.setText(text);
layout.addView(textView);
}
}
我想在现有视图之上放置一个视图。我定位的视图位于 LinearLayout 内,而 LinearLayout 位于 FrameLayout 内。
我在想有一种方法可以用 RelativeLayout 做到这一点,因为我已经让它部分工作了。我想将新视图对齐到左下角或左上角(作为原点),然后将 X 和 Y 偏移到我指定的某个精确值。
如何实现?
想法是这样的:
public static void placeTextRelativeToBottomLeftOfViewAtXY(final FrameLayout layout, View component, int x, int y, String text) {
final TextView textView = new TextView(getContext());
textView.setId((int)System.currentTimeMillis());
final RelativeLayout relativeLayout = new RelativeLayout(getContext());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
params.setMargins(x, y, 0,0);
params.addRule(RelativeLayout.LEFT_OF, component.getId());
relativeLayout.setLayoutParams(params);
relativeLayout.setBackgroundColor(Color.TRANSPARENT);
textView.setText("+500 points!");
textView.bringToFront();
relativeLayout.addView(textView, params);
layout.addView(relativeLayout);
}
根据评论中的附加信息,即使可以在 FrameLayout
中重叠不同的布局,这些布局也只能定位自己的子布局。
RelativeLayout
将无法相对于不同兄弟或父布局中的视图定位其子视图之一。
方法是扁平化布局的层次结构,将根布局设置为 RelativeLayout
或 ConstraintLayout
。
ConstraintLayout
在定位视图方面比较灵活,但也比较难学。
这里我留下了一个替代方案,与 RelativeLayout
一起用作根视图。需要注意的重要项目是 LayoutParams
的设置,这有时有点令人困惑。
LayoutParams
是在子视图上设置的,但是使用的class取决于父视图。
还要记住,要保持页边距独立显示,您需要将 dp 转换为像素(为简单起见,我没有这样做,但在 SO 中有如何执行此操作的示例)。
它还使用 View.generteViewId()
为动态创建的视图获取 id。
为简单起见,我在 xml 中包含了引用 View
,但我也可以动态创建。
布局
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rlContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvCenterText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Texto estatico"
android:layout_centerInParent="true"/>
</RelativeLayout>
主要Activity
public class DynamicViewsActivity extends AppCompatActivity {
RelativeLayout rlContainer;
TextView centerText;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dynamicviews);
rlContainer = findViewById(R.id.rlContainer);
centerText = findViewById(R.id.tvCenterText);
placeTextRelativeToBottomLeftOfViewAtXY(rlContainer, centerText, 100,10, "Hola");
}
public void placeTextRelativeToBottomLeftOfViewAtXY(final RelativeLayout layout, View component, int x, int y, String text) {
final TextView textView = new TextView(this);
textView.setId(View.generateViewId());
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(x, y, x,y);
params.addRule(RelativeLayout.LEFT_OF, component.getId());
params.addRule(RelativeLayout.ALIGN_BASELINE, component.getId());
textView.setLayoutParams(params);
textView.setText(text);
layout.addView(textView);
}
}