Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Đặt vị trí tuyệt đối (absolute position) cho View trong Android

Giới thiệu

Ví dụ này minh họa cách đặt một View (ImageView) tại tọa độ chính xác (x, y) trên màn hình bằng cách sử dụng RelativeLayout.LayoutParams với leftMargin và topMargin trong code Java (không dùng XML).

Bước 1: Tạo dự án mới

Tạo project Android Studio: File → New Project.

Bước 2: Layout gốc (res/layout/activity_main.xml)

Chỉ cần một RelativeLayout rỗng làm container.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/relativeLayout"
    tools:context=".MainActivity">
</RelativeLayout>

Bước 3: MainActivity - Tạo View và đặt vị trí tuyệt đối

Tạo ImageView động, set LayoutParams với width/height cố định và marginLeft/marginTop để xác định vị trí.

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RelativeLayout rl = findViewById(R.id.relativeLayout);
        ImageView iv = new ImageView(this);
        iv.setImageResource(R.drawable.image); // Cần có image trong drawable

        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(500, 400); // width, height (px)
        params.leftMargin = 100; // X position
        params.topMargin = 300;  // Y position
        rl.addView(iv, params);
    }
}

Bước 4: Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Chạy ứng dụng

Chạy app, ImageView sẽ xuất hiện tại vị trí (100px, 300px) từ góc trên-trái của RelativeLayout, kích thước 500x400px.

Lưu ý quan trọng

  • Đơn vị leftMargin/topMargin là pixel, không phải dp. Cần convert: px = dp * density.
  • Cách này không responsive - vị trí cố định pixel sẽ lệch trên màn hình khác density/kích thước.
  • Khuyến nghị dùng ConstraintLayout với constraints (bias, chain, guideline) hoặc translationX/Y cho animation.
  • Nếu cần overlay hệ thống (system alert window), dùng WindowManager.LayoutParams với type TYPE_APPLICATION_OVERLAY (yêu cầu quyền SYSTEM_ALERT_WINDOW).