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

Cách tạo viền (border) cho ImageView trong Android

Giới thiệu

Bài viết này minh họa cách tạo viền (border) cho ImageView bằng cách sử dụng android:background trỏ đến một drawable shape XML chứa <stroke>. Cách này đơn giản, không cần thư viện bên thứ ba.

Các bước thực hiện

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

Mở Android Studio, chọn File → New Project và tạo dự án. Chuẩn bị một ảnh trong res/drawable/image.jpg (hoặc png).

Bước 2: Thiết kế giao diện (res/layout/activity_main.xml)

<?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"
    tools:context=".MainActivity">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@drawable/image_border"
        android:padding="7dp"
        android:scaleType="centerInside"
        android:src="@drawable/image" />

</RelativeLayout>

Bước 3: Code logic (src/MainActivity.java)

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

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

Bước 4: Tạo drawable viền (res/drawable/image_border.xml)

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="https://schemas.android.com/apk/res/android"
    android:shape="rectangle">

    <stroke
        android:width="8dp"
        android:color="#01fee9" /> <!-- Viền xanh cyan, dày 8dp -->

    <!-- Tùy chọn: bo góc -->
    <corners android:radius="16dp" />

    <!-- Tùy chọn: màu nền bên trong (nếu ảnh có trong suốt) -->
    <solid android:color="@android:color/transparent" />

</shape>

Bước 5: Cấu hình AndroidManifest.xml

<?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

Kết nối thiết bị, nhấn Run. ImageView hiển thị ảnh với viền xanh cyan (#01fee9) dày 8dp, bo góc 16dp, padding 7dp tạo khoảng cách giữa ảnh và viền.

Các biến thể viền (Shape Drawable)

1. Viền đơn giản (chỉ stroke)

<shape android:shape="rectangle">
    <stroke android:width="2dp" android:color="#FF0000" />
</shape>

2. Viền chấm (dashed) – API 24+

<shape android:shape="rectangle">
    <stroke
        android:width="4dp"
        android:color="#000000"
        android:dashWidth="10dp"
        android:dashGap="5dp" />
    <corners android:radius="8dp" />
</shape>

3. Viền gradient

<shape android:shape="rectangle">
    <stroke android:width="4dp" />
    <gradient
        android:startColor="#FF0000"
        android:endColor="#0000FF"
        android:angle="45" />
    <corners android:radius="12dp" />
</shape>

4. Viền đôi (double border) – dùng layer-list

<layer-list xmlns:android="https://schemas.android.com/apk/res/android">
    <!-- Viền ngoài -->
    <item>
        <shape>
            <stroke android:width="4dp" android:color="#FFFFFF" />
            <corners android:radius="16dp" />
        </shape>
    </item>
    <!-- Viền trong -->
    <item android:left="4dp" android:top="4dp" android:right="4dp" android:bottom="4dp">
        <shape>
            <stroke android:width="2dp" android:color="#000000" />
            <corners android:radius="12dp" />
        </shape>
    </item>
</layer-list>

Cách khác tạo border cho ImageView

CáchƯu điểmNhược điểm
background + shape (bài này)Đơn giản, XML, hiệu năng tốtKhó làm border tròn hoàn hảo cho ảnh vuông
CardViewHỗ trợ radius, elevation, padding dễ dàngThêm dependency, view cha thêm
Custom View override onDraw()Kiểm soát hoàn toànPhức tạp, dễ bug
Glide/Picasso transformationXử lý tại load ảnhChỉ ảnh load từ network
MaterialShapeDrawable (Material Components)Hiện đại, themeableYêu cầu Material Components lib

Lưu ý

  • android:padding trên ImageView tạo khoảng cách giữa ảnh (src) và viền (background)
  • scaleType="centerInside" giữ tỷ lệ ảnh, fit trong khung
  • Để viền tròn hoàn hảo: corners radius = max(width, height)/2 + ảnh vuông
  • Shape drawable không hỗ trợ gradient stroke trước API 24 (dùng layer-list thay thế)