MDC-104 Android: Thành phần nâng cao Material (Kotlin)

logo_components_color_2x_web_96dp.png

Thành phần Material (MDC) giúp nhà phát triển triển khai Material Design. Được tạo bởi một nhóm kỹ sư và nhà thiết kế trải nghiệm người dùng tại Google, MDC có hàng chục thành phần giao diện người dùng đẹp mắt và hữu ích, đồng thời có sẵn cho Android, iOS, web và Flutter.

material.io/develop

Trong lớp học lập trình MDC-103, bạn đã tuỳ chỉnh màu sắc, độ nâng và kiểu chữ của các Thành phần Material (MDC) để tạo kiểu cho ứng dụng.

Một thành phần trong hệ thống Material Design thực hiện một tập hợp các tác vụ được xác định trước và có một số đặc điểm nhất định, chẳng hạn như nút. Tuy nhiên, nút không chỉ là cách để người dùng thực hiện một hành động, mà còn là một biểu hiện trực quan về hình dạng, kích thước và màu sắc, cho người dùng biết rằng nút đó có tính tương tác và sẽ có điều gì đó xảy ra khi chạm hoặc nhấp vào.

Nguyên tắc của Material Design mô tả các thành phần theo quan điểm của nhà thiết kế. Chúng mô tả nhiều chức năng cơ bản có trên nhiều nền tảng, cũng như các phần tử giải phẫu tạo nên từng thành phần. Ví dụ: một phông nền chứa lớp sau và nội dung của lớp đó, lớp trước và nội dung của lớp đó, các quy tắc chuyển động và lựa chọn hiển thị. Bạn có thể tuỳ chỉnh từng thành phần này cho phù hợp với nhu cầu, trường hợp sử dụng và nội dung của từng ứng dụng. Phần lớn các thành phần này là những chế độ xem, chế độ kiểm soát và chức năng truyền thống trong SDK của nền tảng.

Mặc dù nguyên tắc của Material Design đặt tên cho nhiều thành phần, nhưng không phải thành phần nào cũng phù hợp để sử dụng lại mã và do đó, không phải thành phần nào cũng có trong MDC. Bạn có thể tự tạo những trải nghiệm này để đạt được một kiểu tuỳ chỉnh cho ứng dụng của mình, tất cả đều sử dụng mã truyền thống.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ thêm một phông nền vào Shrine. Bộ lọc này sẽ lọc các sản phẩm xuất hiện trong lưới không đối xứng theo danh mục. Bạn sẽ sử dụng:

  • Hình dạng
  • Có chuyển động
  • Các lớp SDK Android truyền thống

Các thành phần MDC-Android trong lớp học lập trình này

  • Hình dạng

Bạn cần có

  • Kiến thức cơ bản về hoạt động phát triển Android
  • Android Studio (tải xuống tại đây nếu bạn chưa có)
  • Một trình mô phỏng hoặc thiết bị Android (có trong Android Studio)
  • Mã mẫu (xem bước tiếp theo)

Bạn đánh giá kinh nghiệm của mình trong việc tạo ứng dụng Android ở mức nào?

Người mới bắt đầu Trung cấp Thành thạo

Bạn đang tiếp tục từ MDC-103?

Nếu bạn đã hoàn thành MDC-103, thì mã của bạn sẽ sẵn sàng cho lớp học lập trình này. Chuyển sang bước 3.

Bạn mới bắt đầu?

Tải ứng dụng khởi đầu của lớp học lập trình xuống

Tải ứng dụng ban đầu xuống

Ứng dụng khởi đầu nằm trong thư mục material-components-android-codelabs-104-starter/kotlin. Hãy nhớ cd vào thư mục đó trước khi bắt đầu.

...hoặc sao chép từ GitHub

Để sao chép lớp học lập trình này từ GitHub, hãy chạy các lệnh sau:

git clone https://github.com/material-components/material-components-android-codelabs
cd material-components-android-codelabs/
git checkout 104-starter

Tải mã khởi đầu trong Android Studio

  1. Sau khi trình hướng dẫn thiết lập hoàn tất và cửa sổ Welcome to Android Studio (Chào mừng bạn đến với Android Studio) xuất hiện, hãy nhấp vào Open an existing Android Studio project (Mở một dự án hiện có trong Android Studio). Chuyển đến thư mục mà bạn đã cài đặt mã mẫu, rồi chọn kotlin -> shrine (hoặc tìm shrine trên máy tính) để mở dự án Vận chuyển.
  2. Chờ một lát để Android Studio tạo và đồng bộ hoá dự án, như được thể hiện bằng các chỉ báo hoạt động ở cuối cửa sổ Android Studio.
  3. Tại thời điểm này, Android Studio có thể phát sinh một số lỗi bản dựng vì bạn thiếu SDK Android hoặc các công cụ bản dựng, chẳng hạn như lỗi được minh hoạ bên dưới. Hãy làm theo hướng dẫn trong Android Studio để cài đặt/cập nhật các thành phần này và đồng bộ hoá dự án của bạn.

Thêm các phần phụ thuộc của dự án

Dự án cần có một phần phụ thuộc trên thư viện hỗ trợ MDC Android. Mã mẫu mà bạn đã tải xuống có thể đã liệt kê phần phụ thuộc này, nhưng bạn nên thực hiện các bước sau để đảm bảo.

  1. Chuyển đến tệp build.gradle của mô-đun app và đảm bảo rằng khối dependencies có một phần phụ thuộc vào MDC Android:
api 'com.google.android.material:material:1.1.0-alpha06'
  1. (Không bắt buộc) Nếu cần, hãy chỉnh sửa tệp build.gradle để thêm các phần phụ thuộc sau và đồng bộ hoá dự án.
dependencies {
    api 'com.google.android.material:material:1.1.0-alpha06'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.android.volley:volley:1.1.1'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.21"
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:core:1.1.0'
    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
    androidTestImplementation 'androidx.test:runner:1.2.0-alpha05'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha05'
}

Chạy ứng dụng khởi đầu

  1. Đảm bảo rằng cấu hình bản dựng ở bên trái nút Chạy / Phátapp.
  2. Nhấn vào nút Chạy / Phát màu xanh lục để tạo và chạy ứng dụng.
  3. Trong cửa sổ Select Deployment Target (Chọn mục tiêu triển khai), nếu bạn đã có một thiết bị Android trong danh sách các thiết bị có sẵn, hãy chuyển đến Bước 8. Nếu không, hãy nhấp vào Create New Virtual Device (Tạo thiết bị ảo mới).
  4. Trong màn hình Select Hardware (Chọn phần cứng), hãy chọn một thiết bị điện thoại, chẳng hạn như Pixel 2, rồi nhấp vào Next (Tiếp theo).
  5. Trong màn hình System Image (Hình ảnh hệ thống), hãy chọn một phiên bản Android gần đây, tốt nhất là cấp độ API cao nhất. Nếu chưa cài đặt, hãy nhấp vào đường liên kết Tải xuống xuất hiện rồi hoàn tất quá trình tải xuống.
  6. Nhấp vào Tiếp theo.
  7. Trên màn hình Thiết bị Android ảo (AVD), hãy giữ nguyên các chế độ cài đặt rồi nhấp vào Finish (Hoàn tất).
  8. Chọn một thiết bị Android trong hộp thoại mục tiêu triển khai.
  9. Nhấp vào Ok.
  10. Android Studio sẽ tạo bản dựng ứng dụng, triển khai ứng dụng và tự động mở ứng dụng đó trên thiết bị mục tiêu.

Thành công! Bạn sẽ thấy ứng dụng Shrine đang chạy trên thiết bị của mình.

Phông nền là nền tảng ở xa nhất của một ứng dụng, xuất hiện phía sau tất cả nội dung và thành phần khác. Thẻ này bao gồm 2 lớp: lớp sau (hiển thị các thao tác và bộ lọc) và lớp trước (hiển thị nội dung). Bạn có thể dùng một phông nền để hiển thị thông tin và các thao tác tương tác, chẳng hạn như điều hướng hoặc bộ lọc nội dung.

Che giấu nội dung trong lưới

Trong shr_product_grid_fragment.xml, hãy thêm thuộc tính android:visibility="gone" vào NestedScrollView để tạm thời xoá nội dung sản phẩm:

shr_product_grid_fragment.xml

<androidx.core.widget.NestedScrollView
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_marginTop="56dp"
   android:background="@color/productGridBackgroundColor"
   android:elevation="8dp"
   android:visibility="gone"
   app:layout_behavior="@string/appbar_scrolling_view_behavior">

Chúng ta sẽ lắp đặt một phông nền ở khu vực này. Để tránh xuất hiện đường phân chia giữa thanh ứng dụng trên cùng và nội dung trình đơn xuất hiện trên phông nền, chúng ta sẽ đặt màu của phông nền giống với màu của thanh ứng dụng trên cùng.

Trong shr_product_grid_fragment.xml, hãy thêm nội dung sau làm phần tử đầu tiên trong FrameLayout gốc, trước AppBarLayout:

shr_product_grid_fragment.xml

<LinearLayout
   style="@style/Widget.Shrine.Backdrop"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center_horizontal"
   android:orientation="vertical"
   android:paddingTop="100dp"
   android:paddingBottom="100dp">

</LinearLayout>

Trong styles.xml, hãy thêm nội dung sau:

styles.xml

<style name="Widget.Shrine.Backdrop" parent="">
   <item name="android:background">?attr/colorAccent</item>
</style>

Chính xác! Bạn đã thêm một phông nền đẹp vào giao diện người dùng của Shrine. Tiếp theo, chúng ta sẽ thêm một trình đơn.

Thêm trình đơn

Về cơ bản, trình đơn là một danh sách các nút văn bản. Chúng tôi sẽ thêm một số điện thoại tại đây.

Tạo một tệp bố cục mới có tên shr_backdrop.xml trong thư mục res -> layout rồi thêm nội dung sau:

shr_backdrop.xml

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

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_featured_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_apartment_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_accessories_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_shoes_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_tops_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_bottoms_label" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_dresses_label" />

   <View
       android:layout_width="56dp"
       android:layout_height="1dp"
       android:layout_margin="16dp"
       android:background="?android:attr/textColorPrimary" />

   <com.google.android.material.button.MaterialButton
       style="@style/Widget.Shrine.Button.TextButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/shr_account_label" />

</merge>

Thêm danh sách này vào LinearLayout mà bạn vừa thêm vào shr_product_grid_fragment.xml bằng thẻ <include>:

shr_product_grid_fragment.xml

<LinearLayout
   style="@style/Widget.Shrine.Backdrop"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:gravity="center_horizontal"
   android:orientation="vertical"
   android:paddingTop="88dp">

   <include layout="@layout/shr_backdrop" />
</LinearLayout>

Tạo bản dựng và chạy. Màn hình chính của bạn sẽ có dạng như sau:

Giờ thì chúng ta đã thiết lập phông nền. Hãy khôi phục nội dung mà chúng ta đã ẩn trước đó.

Trước khi chúng ta thực hiện bất kỳ thay đổi nào đối với Shrine trong lớp học lập trình này, nội dung sản phẩm chính nằm ở bề mặt phía sau cùng. Khi bạn thêm một phông nền, nội dung này sẽ được nhấn mạnh hơn vì xuất hiện phía trước phông nền đó.

Thêm một lớp mới

Chúng ta nên hiện lại lớp lưới sản phẩm. Xoá thuộc tính android:visibility="gone" khỏi NestedScrollView:

shr_product_grid_fragment.xml

<androidx.core.widget.NestedScrollView
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_marginTop="56dp"
   android:background="@color/productGridBackgroundColor"
   android:elevation="8dp"
   app:layout_behavior="@string/appbar_scrolling_view_behavior">

Hãy tạo kiểu cho lớp trước bằng một vết cắt ở góc trên cùng bên trái. Material Design gọi loại chế độ tuỳ chỉnh này là hình dạng. Vùng hiển thị của Material có thể hiển thị ở nhiều hình dạng. Hình dạng giúp tăng độ nổi bật và tạo kiểu cho các vùng hiển thị, đồng thời có thể dùng để thể hiện thương hiệu. Hình dạng Material có thể có các góc và cạnh cong hoặc góc cạnh, cũng như số lượng cạnh bất kỳ. Chúng có thể đối xứng hoặc không đối xứng.

Thêm hình dạng

Sửa đổi hình dạng của lưới. Chúng tôi đã cung cấp một nền hình dạng tuỳ chỉnh, nhưng hình dạng này chỉ hiển thị chính xác trên Android Marshmallow trở lên. Chúng tôi có thể đặt nền shr_product_grid_background_shape trên NestedScrollView của bạn chỉ dành cho Android Marshmallow trở lên. Trước tiên, hãy thêm một id vào NestedScrollView để chúng ta có thể tham chiếu nó trong mã, như sau:

shr_product_grid_fragment.xml

<androidx.core.widget.NestedScrollView
   android:id="@+id/product_grid"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:layout_marginTop="56dp"
   android:background="@color/productGridBackgroundColor"
   android:elevation="8dp"
   app:layout_behavior="@string/appbar_scrolling_view_behavior">

Sau đó, hãy đặt nền theo phương thức lập trình trong ProductGridFragment.kt. Thêm logic sau để đặt nền vào cuối onCreateView(), ngay trước câu lệnh return:

ProductGridFragment.kt

// Set cut corner background for API 23+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
       view.product_grid.background = context?.getDrawable(R.drawable.shr_product_grid_background_shape)
}

Cuối cùng, chúng ta sẽ cập nhật tài nguyên màu productGridBackgroundColor (cũng được dùng cho nền hình dạng tuỳ chỉnh) như sau:

colors.xml

<color name="productGridBackgroundColor">#FFFBFA</color>

Tạo và chạy:

Chúng tôi đã tạo cho Shrine một hình dạng có kiểu dáng tuỳ chỉnh cho bề mặt chính của ứng dụng. Do độ nâng của bề mặt, người dùng có thể thấy có một thứ gì đó ngay phía sau lớp màu trắng ở phía trước. Hãy thêm chuyển động để người dùng có thể thấy nội dung: trình đơn.

Chuyển động là một cách để giúp ứng dụng của bạn trở nên sống động. Chuyển động có thể lớn và kịch tính, tinh tế và tối giản hoặc ở bất kỳ mức độ nào khác. Loại chuyển động bạn sử dụng phải phù hợp với tình huống. Chuyển động được áp dụng cho các thao tác lặp lại thường xuyên phải nhỏ và tinh tế để không tốn quá nhiều thời gian một cách thường xuyên. Những tình huống khác (chẳng hạn như lần đầu tiên người dùng mở ứng dụng) có thể bắt mắt hơn và giúp người dùng tìm hiểu cách sử dụng ứng dụng của bạn.

Thêm chuyển động hiển thị vào nút trình đơn

Động tác này là hình ở phía trước di chuyển thẳng xuống. Chúng tôi đã cung cấp cho bạn một trình nghe lượt nhấp để hoàn thành ảnh động chuyển đổi cho trang tính, trong NavigationIconClickListener.kt. Chúng ta có thể thiết lập trình nghe lượt nhấp này trong ProductGridFragement của onCreateView(), trong phần chịu trách nhiệm thiết lập thanh công cụ. Thêm dòng sau để đặt trình nghe lượt nhấp trên biểu tượng trình đơn của thanh công cụ:

ProductGridFragment.kt

view.app_bar.setNavigationOnClickListener(NavigationIconClickListener(activity!!, view.product_grid))

Phần này hiện sẽ có dạng như sau:

ProductGridFragment.kt

// Set up the toolbar.
(activity as AppCompatActivity).setSupportActionBar(view.app_bar)
view.app_bar.setNavigationOnClickListener(NavigationIconClickListener(activity!!, view.product_grid))

Tạo bản dựng và chạy. Nhấn nút trình đơn:

Nhấn lại vào biểu tượng trình đơn điều hướng để ẩn trình đơn.

Điều chỉnh chuyển động của lớp trước

Chuyển động là một cách hay để thể hiện thương hiệu của bạn. Hãy xem ảnh động hiển thị trông như thế nào khi sử dụng một đường cong thời gian khác.

Cập nhật trình nghe lượt nhấp trong ProductGridFragment.kt để truyền một Trình nội suy đến trình nghe lượt nhấp của biểu tượng điều hướng, như sau:

ProductGridFragment.kt

view.app_bar.setNavigationOnClickListener(NavigationIconClickListener(activity!!, view.product_grid, AccelerateDecelerateInterpolator()))

Điều này tạo ra một hiệu ứng khác, phải không?

Hệ thống biểu tượng mang thương hiệu cũng mở rộng sang các biểu tượng quen thuộc. Hãy tuỳ chỉnh biểu tượng hiển thị và hợp nhất biểu tượng đó với tiêu đề để tạo ra một diện mạo độc đáo, mang dấu ấn thương hiệu.

Thay đổi biểu tượng nút trình đơn

Thay đổi nút trình đơn để hiển thị một biểu tượng có thiết kế hình kim cương. Cập nhật Thanh công cụ trong shr_product_grid_fragment.xml để sử dụng biểu tượng mới có gắn thương hiệu mà chúng tôi đã cung cấp cho bạn (shr_branded_menu) và đặt các thuộc tính app:contentInsetStartandroid:padding để thanh công cụ phù hợp hơn với quy cách của nhà thiết kế:

shr_product_grid_fragment.xml

<androidx.appcompat.widget.Toolbar
   android:id="@+id/app_bar"
   style="@style/Widget.Shrine.Toolbar"
   android:layout_width="match_parent"
   android:layout_height="?attr/actionBarSize"
   android:paddingStart="12dp"
   android:paddingLeft="12dp"
   android:paddingEnd="12dp"
   android:paddingRight="12dp"
   app:contentInsetStart="0dp"
   app:navigationIcon="@drawable/shr_branded_menu"
   app:title="@string/shr_app_name" />

Chúng ta sẽ cập nhật trình nghe lượt nhấp trong onCreateView() trong ProductGridFragment.kt một lần nữa để lấy các đối tượng có thể vẽ cho thanh công cụ khi trình đơn mở và khi trình đơn đóng, như sau:

ProductGridFragment.kt

// Set up the toolbar.
(activity as AppCompatActivity).setSupportActionBar(view.app_bar)
view.app_bar.setNavigationOnClickListener(NavigationIconClickListener(
       activity!!,
       view.product_grid,
       AccelerateDecelerateInterpolator(),
       ContextCompat.getDrawable(context!!, R.drawable.shr_branded_menu), // Menu open icon
       ContextCompat.getDrawable(context!!, R.drawable.shr_close_menu))) // Menu close icon

Tạo và chạy:

Tuyệt vời! Khi phông nền có thể xuất hiện, biểu tượng trình đơn hình kim cương sẽ xuất hiện. Khi trình đơn có thể bị che khuất, biểu tượng đóng sẽ xuất hiện thay thế.

Trong suốt 4 lớp học lập trình này, bạn đã thấy cách sử dụng các Thành phần Material để tạo ra những trải nghiệm người dùng độc đáo và trang nhã, thể hiện cá tính và phong cách của một thương hiệu.

Các bước tiếp theo

Lớp học lập trình này (MDC-104) sẽ hoàn tất chuỗi lớp học lập trình này. Bạn có thể khám phá thêm nhiều thành phần trong MDC-Android bằng cách truy cập vào Danh mục thành phần MDC-Android.

Để thử thách thêm với lớp học lập trình này, hãy sửa đổi ứng dụng Shrine để thay đổi hình ảnh sản phẩm xuất hiện khi một danh mục được chọn trong trình đơn phông nền.

Để tìm hiểu cách kết nối ứng dụng này với Firebase để có một phần phụ trợ hoạt động, hãy xem Lớp học lập trình Firebase Android.

Tôi đã hoàn thành lớp học lập trình này trong một khoảng thời gian hợp lý và không tốn nhiều công sức

Hoàn toàn đồng ý Đồng ý Không đồng ý cũng không phản đối Không đồng ý Hoàn toàn không đồng ý

Tôi muốn tiếp tục sử dụng Thành phần Material trong tương lai

Hoàn toàn đồng ý Đồng ý Không đồng ý cũng không phản đối Không đồng ý Hoàn toàn không đồng ý