需求:在一張圖片上放置多個按鈕,並能精確控制每個按鈕的位置(如標記點、熱區交互)。
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/your_image"
android:adjustViewBounds="true">
<Button
android:id="@+id/btn_mark1"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="100dp"
android:layout_marginTop="150dp"
android:text="A" />
<Button
android:id="@+id/btn_mark2"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginLeft="200dp"
android:layout_marginTop="300dp"
android:text="B" />
</RelativeLayout>
原理:RelativeLayout允許子View通過layout_marginLeft/Top相對容器左上角定位。圖片作為背景自動鋪滿,按鈕懸浮其上。
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:src="@drawable/your_image"
android:adjustViewBounds="true"
android:scaleType="fitCenter" />
<Button
android:id="@+id/btn_mark1"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="top|left"
android:layout_marginLeft="100dp"
android:layout_marginTop="150dp" />
</FrameLayout>
優勢:FrameLayout專為疊加設計,layout_gravity+margin控制更直觀,圖片可獨立設置scaleType適配不同螢幕。
// 容器:FrameLayout container = findViewById(R.id.container);
Button btn = new Button(this);
btn.setText("動態點");
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
params.leftMargin = 120; // x坐標
params.topMargin = 200; // y坐標
params.gravity = Gravity.TOP | Gravity.LEFT;
container.addView(btn, params);
// 移動按鈕:更新LayoutParams後requestLayout()
params.leftMargin = 150;
btn.setLayoutParams(params);
OnTouchListener。ACTION_DOWN記錄初始rawX/rawY與leftMargin/topMargin。ACTION_MOVE計算偏移量,更新LayoutParams並requestLayout()。ACTION_UP可保存最終位置到數據庫/SharedPreferences。若圖片與按鈕位置需按比例縮放:
scale = displayWidth / imageWidth。PercentFrameLayout(支持庫)直接用百分比定位。