MỤC LỤC
CÁC TỪ VIẾT TẮT 4
DANH MỤC HÌNH ẢNH 5
TÓM TẮT 7
ABSTRACT 8
CHƯƠNG 1 GIỚI THIỆU TỔNG QUAN 9
1. GIỚI THIỆU 9
2. MỤC TIÊU CẦN ĐẠT ĐƯỢC 10
3. KHÓ KHĂN 12
4. HƯỚNG GIẢI QUYẾT 13
5. PHẠM VI ĐỀ TÀI 13
7. BỐ CỤC CỦA QUYỂN LUẬN VĂN 14
CHƯƠNG 2 CƠ SỞ LÝ THUYẾT 15
1. KHÁI NIỆM, LỊCH SỬ HÌNH THÀNH VÀ PHÁT TRIỂN ANDROID 15
1.1. Khái niệm Android 15
1.2. Lịch sử hình thành và phát triển 15
1.3. Lịch sử cập nhật 17
2. MÁY ẢO DALVIK 18
3. KIẾN TRÚC CỦA ANDROID 19
3.1. Tầng ứng dụng 19
3.2. Application framework 20
3.3. Library 20
3.4. Android Runtime 21
3.5. Linux kernel 22
4. ANDROID EMULATOR 22
5. HƯỚNG DẪN CÀI ĐẶT ANDROID VỚI ECLIPSE 23
5.1. Download Android SDK 23
5.2. Tích hợp Android SDK vào Eclipse 25
5.3. Android Virtual Device (Emulator) 26
5.4. Một số chức năng cần biết khi lập trình Android với Eclipse 27
6. CÁC THÀNH PHẦN TẠO NÊN MỘT ỨNG DỤNG ANDROID 28
6.1. AndroidManifest.xml 36
6.2. File R.java 38
7. CHU KỲ ỨNG DỤNG ANDROID 43
7.1. Chu kỳ sống thành phần 43
7.2. Activity Stack 43
7.3. Các trạng thái của chu kỳ sống 44
7.4. Chu kỳ sống của ứng dụng 45
7.5. Các sự kiện trong chu kỳ sống của ứng dụng 45
7.6. Thời gian sống của ứng dụng 46
7.7. Thời gian hiển thị của activity 46
7.8. Các phương thức của chu kỳ sống 46
8. XML TRONG ANDROID 49
9. MULTIMEDIA 55
9.1. Giới thiệu gói android.media 59
9.2. Giới thiệu class android.media.MediaPlayer 60
9.3. Playing audio, video 65
9.4. Giới thiệu lớp android.media.MediaRecorder 71
10. GIỚI THIỆU VỀ ANDROID GRAPHICS 74
10.1. Các lựa chọn khi vẽ đồ họa 74
10.2. Vẽ với Canvas 75
CHƯƠNG 3 PHẦN ỨNG DỤNG 85
1. ĐẶC TẢ BÀI TÓAN 85
3. MỤC TIÊU CẦN ĐẠT ĐƯỢC 86
4. HƯỚNG GIẢI QUYẾT 86
5. SƠ ĐỒ USECASE, SƠ ĐỒ CLASS 86
5.1. Sơ đồ usecase, sơ đồ class giữa các thành phần giao diện 86
5.2. Thông tin các Class 87
6. ĐẶC TẢ CHỨC NĂNG 89
6.1. Chức năng đăng ký thông tin 89
6.2. Chức năng đăng nhập 89
6.3. Chức năng lấy lại mật khẩu đã mất 90
6.4. Chức năng thay đổi mật khẩu 90
6.5. Chức năng chơi cờ ca rô online 90
6.6. Chức năng chat 90
6.7. Chức năng xem thông tin người chơi 90
7. QUÁ TRÌNH ĐÁNH CỜ CA RÔ ONLINE CỦA HAI NGƯỜI CHƠI 91
8. VẼ BÀN CỜ 91
9. GIỚI THIỆU CON ROBOT (BOT) 94
10. GIAO DIỆN GAME ĐÁNH CỜ CA RÔ 95
PHẦN KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 99
1. Kết luận 99
1.1. Kết quả đạt được của nhóm 99
1.2. Kết quả đạt được của cá nhân 99
2. Hướng phát triển 100
TÀI LIỆU THAM KHẢO 101
102 trang |
Chia sẻ: netpro | Lượt xem: 4833 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đề tài Lập trình đa phương tiện (Multimedia) trên nền tảng Android, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
dữ liệu. Chẳng hạn như, dữ liệu contact, dữ liệu SMS,… Phần này có thể coi nó như là tên của một table
Phần D: Phần này chỉ đến đúng vị trí của dữ liệu, có thể coi phần này như là ID của row trong table hoặc một dữ liệu nào đó dùng để truy vấn.
VD: Uri chỉ đến contact thứ 0 trong CSDL là
content://contacts/people/0
Để có thể thực hiện truy vấn đến vùng dữ liệu được chỉ ra bởi một Uri ta cần có 2 đối tượng con trỏ được cung cấp bởi Activity đó là: Cursor và ContentResolver.
Để lấy được 2 đối tượng này thì trong Activity sử dụng hàm
getContentResolver() trả về đối tượng ContentResolver.
getContentResolver().query(Uri uri); trả về đối tượng Cursor.
4. Intent: nền tảng để truyền tải các thông báo. Intent được sử dụng để gửi các thông báo đi nhằm khởi tạo một Activity hay Service để thực hiện công việc bạn mong muốn.
Khái niệm Intend:
Là một cấu trúc dữ liệu mô tả cách thức, đối tượng thực hiện của một Activity
Là cầu nối giữa các Activity: ứng dụng Android thường bao gồm nhiều Activity, mỗi Activity hoạt động độc lập với nhau và thực hiện những công việc khác nhau. Intent chính là người đưa thư, giúp các Activity có thể triệu gọi cũng như truyền các dữ liệu cần thiết tới một Activity khác. Điều này cũng giống như việc di chuyển qua lại giữa các Forms trong lập trình Windows Form.
Hình 2.14: Truyền dữ liệu giữa 2 Activity
Dữ liệu của Intend:
Intent về cơ bản là một cấu trúc dữ liệu, được mô tả trong lớp android.content.Intent
Các thuộc tính của một đối tượng Intend:
Hình 2.15: Các thuộc tính của Intend
Các Action được định nghĩa sẵn:
Dưới đây là những hằng String đã được định nghĩa sẵn trong lớp Intent. Đi kèm với nó là các Activity hay Application được xây dựng sẵn sẽ được triệu gọi mỗi khi Intent tương ứng được gửi (tất nhiên khi được cung cấp đúng data). VD: Gọi tới một số điện thoại:
Intent dialIntent =
new Intent(Intent.ACTION_DIAL,Uri.parse("tel:123456"));
startActivity(dialIntent);
Hình 2.16: Các Action đã được định nghĩa sẵn trong Intend
5. Broadcast Receiver: thành phần thu nhận các Intent bên ngoài gửi tới.
VD: bạn viết một chương trình thay thế cho phần gọi điện mặc định của Android, khi đó bạn cần một BR để nhận biết các Intent là các cuộc gọi tới.
6. Notification: đưa ra các cảnh báo mà không làm cho các Activity phải ngừng hoạt động. Activity, Service, Broadcast Receiver và Content Provider mới là những thành phần chính cấu thành nên ứng dụng Android, bắt buộc phải khai báo trong AndroidManifest.
AndroidManifest.xml
Trong bất kì một project Android nào khi tạo ra đều có một file AndroidManifest.xml, file này được dùng để định nghĩa các screen sử dụng, các permission cũng như các theme cho ứng dụng. Đồng thời nó cũng chứa thông tin về phiên bản SDK cũng như main activity sẽ chạy đầu tiên.
File này được tự động sinh ra khi tạo một Android project. Trong file manifest bao giờ cũng có ba thành phần chính đó là: application, permission và version.
Dưới đây là nội dung của một file AndroidManifest.xml
<manifest xmlns:android=""
package="lean.game.gomoku.activity"
android:versionCode="1"
android:versionName="1.0">
<activity android:name=".LoginActivity"
android:label="@string/app_name">
Application
Thẻ , bên trong thẻ này chứa các thuộc tính được định nghĩa cho ứng dụng Android như:
android:icon = “drawable resource” à Ở đây đặt đường dẫn đến file icon của ứng dụng khi cài đặt. VD: android:icon = “@drawable/icon”.
android:name = “string” à thuộc tính này để đặt tên cho ứng dụng Android. Tên này sẽ được hiển thị lên màn hình sau khi cài đặt ứng dụng.
android:theme = “drawable theme” à thuộc tính này để đặt theme cho ứng dụng. Các theme là các cách để hiển thị giao diện ứng dụng.
Ngoài ra còn nhiều thuộc tính khác…
Permission
Bao gồm các thuộc tính chỉ định quyền truy xuất và sử dụng tài nguyên của ứng dụng. Khi cần sử dụng một loại tài nguyên nào đó thì trong file manifest của ứng dụng cần phải khai báo các quyền truy xuất như sau:
SDK version
Thẻ xác định phiên bản SDK được khai báo như sau:
.
Ở đây chỉ ra phiên bản SDK nhỏ nhất mà ứng dụng hiện đang sử dụng.
File R.java
File R.java là một file tự động sinh ra ngay khi tạo ứng dụng, file này được sử dụng để quản lý các thuộc tính được khai báo trong file XML của ứng dụng và các tài nguyên hình ảnh.
Mã nguồn của file R.java được tự động sinh khi có bất kì một sự kiện nào xảy xa làm thay đổi các thuộc tính trong ứng dụng. Chẳng hạn như, bạn kéo và thả một file hình ảnh từ bên ngoài vào project thì ngay lập tức thuộc tính đường dẫn đến file đó cũng sẽ được hình thành trong file R.java hoặc xoá một file hình ảnh thì đường dẫn tương ứng đến hình ảnh đó cũng tự động bị xoá.
Có thể nói file R.java hoàn toàn không cần phải đụng chạm gì đến trong cả quá trình xây dựng ứng dụng.
Dưới đây là nội dung của một file R.java:
package lean.game.gomoku;
public final class R {
public static final class anim {
public static final int cycle_7=0x7f040000;
public static final int shake=0x7f040001;
}
public static final class array {
public static final int difficulty=0x7f060000;
}
public static final class attr {
}
public static final class color {
public static final int Blue=0x7f070008;
public static final int Red=0x7f070007;
public static final int background=0x7f070002;
public static final int background2=0x7f070000;
public static final int background3=0x7f070001;
public static final int dark=0x7f070005;
public static final int foreground=0x7f070006;
public static final int green=0x7f07000b;
public static final int hilite=0x7f070003;
public static final int light=0x7f070004;
public static final int selected=0x7f070009;
public static final int white=0x7f07000a;
public static final int yellow=0x7f07000c;
}
public static final class drawable {
public static final int a128=0x7f020000;
public static final int a16=0x7f020001;
public static final int a32=0x7f020002;
public static final int a64=0x7f020003;
public static final int cocaro100=0x7f020004;
public static final int hinhnen=0x7f020005;
public static final int icon=0x7f020006;
public static final int o16=0x7f020007;
public static final int o32=0x7f020008;
public static final int o64=0x7f020009;
public static final int osao=0x7f02000a;
public static final int users=0x7f02000b;
public static final int users2=0x7f02000c;
public static final int web=0x7f02000d;
public static final int x128=0x7f02000e;
public static final int x16=0x7f02000f;
public static final int x32=0x7f020010;
public static final int x64=0x7f020011;
}
public static final class id {
public static final int Imgwinner=0x7f090014;
public static final int TextView01=0x7f09000a;
public static final int about_button=0x7f090011;
public static final int about_content=0x7f090000;
public static final int btn_register=0x7f090009;
public static final int cmdlogin=0x7f09000d;
public static final int cmdmainmenu=0x7f090015;
public static final int editText_email=0x7f090008;
public static final int editText_pass=0x7f090006;
public static final int editText_repass=0x7f090007;
public static final int editText_username=0x7f090005;
public static final int exit_button=0x7f090012;
public static final int lvChannel=0x7f090002;
public static final int playOnline_button=0x7f09000e;
public static final int practice_button=0x7f09000f;
public static final int register_button=0x7f090010;
public static final int rule_content=0x7f090013;
public static final int textView1=0x7f090003;
public static final int tv1=0x7f090004;
public static final int tvChannel=0x7f090001;
public static final int txt_pass=0x7f09000c;
public static final int txt_user=0x7f09000b;
}
public static final class layout {
public static final int about=0x7f030000;
public static final int chan=0x7f030001;
public static final int dangky=0x7f030002;
public static final int login=0x7f030003;
public static final int main=0x7f030004;
public static final int winlayout=0x7f030006;
}
public static final class raw {
public static final int nhacnen=0x7f050000;
public static final int tiengvotay=0x7f050001;
}
public static final class string {
public static final int BluePlayer_label=0x7f080007;
public static final int RedPlayer_label=0x7f080006;
public static final int about_label=0x7f080003;
public static final int about_text=0x7f080010;
public static final int about_title=0x7f080008;
public static final int app_name=0x7f080000;
public static final int channel_label=0x7f080011;
public static final int exit_label=0x7f080004;
public static final int hint_email=0x7f08000f;
public static final int hint_password=0x7f08000d;
public static final int hint_repassword=0x7f08000e;
public static final int hint_username=0x7f08000c;
public static final int login=0x7f080014;
public static final int main_title=0x7f080001;
public static final int new_game_title=0x7f080005;
public static final int password_text=0x7f08001a;
public static final int play_online=0x7f080009;
public static final int practice=0x7f08000a;
public static final int register=0x7f08000b;
public static final int rule_label=0x7f080002;
public static final int rule_text=0x7f080013;
public static final int rule_title=0x7f080012;
public static final int username_text=0x7f080019;
public static final int winner_Back=0x7f080018;
public static final int winner_newgame=0x7f080017;
public static final int winner_text=0x7f080015;
public static final int winner_title=0x7f080016;
}
}
CHU KỲ ỨNG DỤNG ANDROID
Một tiến trình Linux gói gọn một ứng dụng Android đã được tạo ra cho ứng dụng khi codes cần được run và sẽ còn chạy cho đến khi:
Nó không phụ thuộc.
Hệ thống cần lấy lại bộ nhớ mà nó chiếm giữ cho các ứng dụng khác .
Một sự khác thường và đặc tính cơ bản của Android là thời gian sống của tiến trình ứng dụng không được điều khiển trực tiếp bới chính nó. Thay vào đó, nó được xác định bởi hệ thống qua một kết hợp của:
Những phần của ứng dụng mà hệ thống biết đang chạy.
Những phần quan trọng như thế nào đối với người dùng.
Bao nhiêu vùng nhớ chiếm lĩnh trong hệ thống.
Chu kỳ sống thành phần
Các thành phần ứng dụng có một chu kỳ sống, tức là mỗi thành phần từ lúc bắt đầu khởi tạo và đến thời điểm kết thúc. Giữa đó, đôi lúc chúng có thể là active hoặc inactive, hoặc là trong trường hợp activies nó có thể visible hoặc invisible.
Hình 2.17: Chu kỳ sống thành phần
Activity Stack
Bên trong hệ thống các activity được quản lý như một activity stack. Khi một Activity mới được start, nó được đặt ở đỉnh của stack và trở thành activity đang chạy, activity trước sẽ ở bên dưới activity mới và sẽ không thấy trong suốt quá trình activity mới tồn tại.
Nếu người dùng nhấn nút Back thì activity kết tiếp của stack sẽ di duyển lên và trở thành active.
Hình 2.18: Activity stack
Các trạng thái của chu kỳ sống
Một Activity chủ yếu có 4 trạng thái chính sau:
Active hoặc running: Khi Activity được chạy trên màn hình. Activity này tập trung vào những thao tác của người dùng trên ứng dụng.
Paused: Activity được tạm dừng (paused) khi mất focus nhưng người dùng vẫn trông thấy. Có nghĩa là một Activity mới ở trên nó nhưng không bao phủ đầy màn hình. Một Activity tạm dừng là còn sống nhưng có thể bị kết thúc bởi hệ thống trong trường hợp thiếu vùng nhớ.
Stopped: Nếu nó hoàn toàn bao phủ bởi Activity khác. Nó vẫn còn trạng thái và thông tin thành viên trong nó. Người dùng không thấy nó và thường bị loại bỏ trong trường hợp hệ thống cần vùng nhớ cho tác vụ khác.
Killed: Khi hệ thống bị thiếu bộ nhớ, nó sẽ giải phóng các tiến trình theo nguyên tắc ưu tiên. Các Activity ở trạng thái stop hoặc paused cũng có thể bị giải phóng và khi nó được hiển thị lại thì các Activity này phải khởi động lại hoàn toàn và phục hồi lại trạng thái trước đó.
Hình 2.19: Các trạng thái của chu kỳ sống
Chu kỳ sống của ứng dụng
Trong một ứng dụng Android có chứa nhiều thành phần và mỗi thành phần đều có một chu trình sống riêng. Và ứng dụng chỉ được gọi là kết thúc khi tất cả các thành phần trong ứng dụng kết thúc. Activity là một thành phần cho phép người dùng giao tiếp với ứng dụng. Tuy nhiên, khi tất cả các Activity kết thúc và người dùng không còn giao tiếp được với ứng dụng nữa nhưng không có nghĩa là ứng dụng đã kết thúc. Bởi vì ngoài Activity là thành phần có khả năng tương tác người dùng thì còn có các thành phần không có khả năng tương tác với người dùng như là Service, Broadcast receiver. Có nghĩa là những thành phần không tương tác người dùng có thể chạy background dưới sự giám sát của hệ điều hành cho đến khi người dùng tự tắt chúng.
Các sự kiện trong chu kỳ sống của ứng dụng
Nếu một Activity được tạm dừng hoặc dừng hẳn, hệ thống có thể bỏ thông tin khác của nó từ vùng nhớ bởi việc finish() (gọi hàm finish() của nó), hoặc đơn giản giết tiến trình của nó. Khi nó được hiển thị lần nữa với người dùng, nó phải được hoàn toàn restart và phục hồi lại trạng thái trước. Khi một Activity chuyển qua chuyển lại giữa các trạng thái, nó phải báo việc chuyển của nó bằng việc gọi hàm transition.
Hình 2.20: Các sự kiện của một ứng dụng
Tất cả các phương thức là những móc nối mà bạn có thể override để làm tương thích công việc trong ứng dụng khi thay đổi trạng thái. Tất cả các Activity bắt buộc phải có onCreate() để khởi tạo ứng dụng. Nhiều Activity sẽ cũng hiện thực onPause() để xác nhận việc thay đổi dữ liệu và mặt khác chuẩn bị dừng hoạt động với người dùng.
Thời gian sống của ứng dụng
Bảy phương thức chuyển tiếp định nghĩa trong chu kỳ sống của một Activity. Thời gian sống của một Activity diễn ra giữa lần đầu tiên gọi onCreate() đến trạng thái cuối cùng gọi onDestroy(). Một Activity khởi tạo toàn bộ trạng thái toàn cục trong onCreate(), và giải phóng các tài nguyên đang tồn tại trong onDestroy().
Thời gian hiển thị của activity
Visible lifetime của một activity diễn ra giữa lần gọi một onStart() cho đến khi gọi onStop(). Trong suốt khoảng thời gian này người dùng có thể thấy activity trên màn hình, có nghĩa là nó không bị foreground hoặc đang tương tác với người dùng. Giữa 2 phương thức người dùng có thể duy trì tài nguyên để hiển thị activity đến người dùng.
Các phương thức của chu kỳ sống
Hình 2.21: Các phương thức chu kỳ sống của ứng dụng
Phương thức: onCreate()
Được gọi khi activity lần đầu tiên được tạo.
Ở đây bạn làm tất cả các cài đặt tĩnh -- tạo các view, kết nối dữ liệu đến list và .v.v
Phương thức này gửi qua một đối tượng Bundle chứa đựng từ trạng thái trược của Activity.
Luôn theo sau bởi onStart().
Phương thức: onRestart()
Được gọi sau khi activity đã được dừng, chỉ một khoảng đang khởi động lần nữa (stared again).
Luôn theo sau bởi onStart()
Phương thức: onStart()
Được gọi trước khi một activity visible với người dùng.
Theo sau bởi onResume() nếu activity đến trạng thái foreground hoặc onStop() để nó trở nên ẩn.
Phương thức: onResume()
Được gọi trước khi activity bắt đầu tương tác với người dung.
Tại thời điểm này activity ở trên đỉnh của stack activity.
Luôn theo sau bởi onPause().
Phương thức: onPause()
Được gọi khi hệ thống đang resuming activity khác.
Phương thức này là điển hình việc giữ lại không đổi dữ liệu.
Nó nên được diễn ra một cách nhanh chóng bởi vì activity kế tiếp sẽ không được resumed ngay cho đến khi nó trở lại.
Theo sau bởi onResume nếu activity trở về từ ở trước, hoặc bởi onStop nếu nó trở nên visible với người dùng.
Trạng thái của activity có thể bị giết bởi hệ thống.
Phương thức: onStop()
Được gọi khi activity không thuộc tầm nhìn của người dùng.
Nó có thể diễn ra bởi vì nó đang bị hủy, hoặc bởi vì activity khác vừa được resumed và bao phủ nó.
Được theo sau bởi onRestart() nếu activity đang được gọi trở lại để tương tác với người dùng, hoặc onDestroy() nếu activity đang bỏ.
Trạng thái của activity có thể bị giết bởi hệ thống.
Phương thức: onDestroy()
Được gọi trước khi activity bị hủy.
Đó là lần gọi cuối cùng mà activity này được nhận.
Nó được gọi khác bởi vì activity đang hoàn thành, hoặc bởi vì hệ thống tạm thời hủy để tiết kiệm vùng nhớ.
Bạn có thể phân biệt giữa hai kịch bản với phương isFinshing().
Trạng thái của activity có thể được giết bởi hệ thống.
XML TRONG ANDROID
Không giống như lập trình java thông thường, lập trình Android ngoài các lớp được viết trong *.java còn sử dụng XML để thiết kế giao diện cho ứng dụng.
Nền tảng Android là một nền tảng phát triển di động mã nguồn mở. Nó giúp bạn truy cập vào tất cả các khía cạnh của thiết bị di động mà nó chạy trên đó, từ các đồ họa cấp thấp, đến phần cứng như là thiết bị camera trên điện thoại. Với rất nhiều thứ có thể sử dụng Android, có thể bạn sẽ tự hỏi tại sao bạn cần tìm hiểu đến XML. Đó không phải vì làm việc với XML rất thú vị, mà là nó đang làm việc với những thứ mà nó kích hoạt. XML thường được dùng như là một định dạng dữ liệu trên Internet. Nếu bạn muốn truy cập dữ liệu từ Internet, các khả năng có thể là dữ liệu sẽ ở dạng XML. Nếu bạn muốn gửi dữ liệu đến một dịch vụ Web, có thể bạn cũng cần gửi cả dữ liệu XML. Nói ngắn gọn là nếu ứng dụng Android của bạn thúc đẩy Internet, thì có thể bạn sẽ cần phải làm việc với XML. Thật may mắn là bạn có rất nhiều lựa chọn có sẵn để làm việc với XML trên Android.
Một trong những ưu điểm lớn nhất của nền tảng Android chính là việc nó thúc đẩy ngôn ngữ lập trình Java. Android SDK không hoàn toàn cung cấp sẵn mọi thứ cho Môi trường Thời gian chạy Java (JRE) chuẩn của bạn, nhưng nó lại hỗ trợ một phần rất đáng kể cho nó. Nền tảng Java đã và đang hỗ trợ rất nhiều cách khác nhau để làm việc với XML trong thời gian nhất định, và hầu hết các API có liên quan đến XML của Java đều được hỗ trợ đầy đủ trên Android. Ví dụ, Simple API của Java cho XML (SAX) và Document Object Model (DOM) hiện đều có sẵn trên Android. Nhiều năm qua, cả hai API này là một phần của công nghệ Java. Sản phẩm Streaming API mới đây cho XML (StAX) hiện chưa có trong Android. Tuy nhiên, Android lại cung cấp một thư viện tương đương về mặt chức năng. Điều cuối cùng là Java XML Binding API cũng không có sẵn trong Android. Chắc chắn có thể thực hiện API này trong Android. Tuy nhiên, nó lại có xu hướng là một API nặng ký, với rất nhiều thể hiện khác nhau thuộc các lớp khác nhau thường cần việc trình bày một tài liệu XML. Do vậy mà nó không lý tưởng lắm cho một môi trường bị ràng buộc chẳng hạn như thiết bị cầm tay mà Android được thiết kế để chạy trên đó.
Cũng giống như các ứng dụng WPF trong .NET hiện nay (XAML), khi lập trình ứng dụng ta thiết kế giao diện bằng XML và cài đặt các xử lý khi tương tác với giao diện trong code. Tất nhiên bạn hoàn toàn có thể thiết kế 1 giao diện như ý muốn mà không cần tới bất cứ 1 dòng XML nào, nhưng sử dụng XML sẽ đơn giản công việc đi rất nhiều. Đồng thời sử dụng XML sẽ giúp việc chỉnh sửa ứng dụng sau này trở nên dễ dàng.
Trong Android, các Layout được dùng để quản lý các thành phần giao diện khác theo 1 trật tự nhất định. Bạn có thể sử dụng các Layout để dễ dàng đặt các đối tượng cần thiết vào ứng dụng.
· FrameLayout: FrameLayout được dùng để bố trí các đối tượng theo kiểu giống như là các Layer trong Photoshop. Những đối tượng nào thuộc Layer bên dưới thì sẽ bị che khuất bởi các đối tượng thuộc Layer nằm trên. FrameLayer thường được sử dụng khi muốn tạo ra các đối tượng có khung hình bên ngoài chẳng hạn như contact image button.
Ví dụ:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Day la dong thu 1"
android:textSize="10dip"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Day la dong thu 2"
android:textSize="20dip"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Day la dong thu 3"
android:textSize="30dip"
/>
Kết quả:
Hình 2.22: FrameLayout
· LinearLayout: thêm các thành phần con theo 1 chiều nhất định (ngang hoặc dọc). Đây là layout được sử dụng nhiều nhất.
Ví dụ:
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Day la dong thu 1"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Day la dong thu 2"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Day la dong thu 3"
/>
Kết quả:
Hình 2.23: LinearLayout
· RelativeLayout: Layout này cho phép bố trí các widget theo một trục đối xứng ngang hoặc dọc. Để đặt được đúng vị trí thì các widget cần được xác định một mối ràng buộc nào đó với các widget khác. Các ràng buộc này là các ràng buộc trái, phải, trên, dưới so với một widget hoặc so với layout parent. Dựa vào những mối ràng buộc đó mà RetaliveLayout cũng không phụ thuộc vào kích thước của screen thiết bị. Ngoài ra, nó còn có ưu điểm là giúp tiết kiệm layout sử dụng nhằm mục đích giảm lượng tài nguyên sử dụng khi load đồng thời đẩy nhanh quá trình xử lý.
Hình 2.24: RelativeLayout
Ví dụ:
Kết quả:
Hình 2.25: RelativeLayout
· TableLayout: Layout này được sử dụng khi cần thiết kế một table chứa dữ liệu hoặc cần bố trí các widget theo các row và column. Chẳng hạn như, giao diện của một chiếc máy tính đơn giản hoặc một danh sách dữ liệu.
Hình 2.26: TableLayout
Ví dụ:
Kết quả:
Hình 2.27: TableLayout
AbsoluteLayout: Layout này được sử dụng để bố trí các widget vào một vị trí bất kì trong layout dựa vào 2 thuộc tính toạ độ x, y. Tuy nhiên, kiểu layout này rất ít khi được dùng bởi vì toạ độ của các đối tượng luôn cố định và sẽ không tự điều chỉnh được tỷ lệ khoảng cách giữa các đối tượng. Khi chuyển ứng dụng sang một màn hình có kích thước với màn hình thiết kế ban đầu thì vị trí của các đối tượng sẽ không còn được chính xác như ban đầu.
Layout được sử dụng nhằm mục đích thiết kế giao diện cho nhiều độ phân giải. Thường khi lập trình nên kết hợp nhiều layout với nhau để tạo ra giao diện bạn mong muốn.
MULTIMEDIA
Ngày nay, người sử dụng điện thoại di động không chỉ để thực hiện những cuộc gọi thông thường mà họ còn sử dụng điện thoại cho nhiều việc khác như: chatting, lướt web, nghe nhạc, xem video và xem tivi trực tuyến. Trong phần này chúng ta sẽ nghiên cứu thiết bị di động sử dụng hệ điều hành Android để phát một tập tin audio, xem video, và ghi âm.
Nền tảng Android cung cấp sẵn bộ mã hóa và giải mã đa dạng cho các định dạng phương tiện truyền thông. Do đó bạn có thể dễ dàng tích hợp âm thanh, video, và hình ảnh vào các ứng dụng của bạn. Việc truy cập vào nền tảng các phương tiện truyền thông là khá đơn giản bằng cách sử dụng các thành phần tạo nên Android như Intent và Activity.
Android cho phép bạn phát âm thanh và video từ một số kiểu nguồn dữ liệu. Bạn có thể phát âm thanh và video từ các tập tin media được lưu trữ trong nguồn tài nguyên của ứng dụng (raw resources), từ các tập tin độc lập trong hệ thống tập tin, hoặc từ một dòng dữ liệu nhận được từ một kết nối mạng. Để phát âm thanh, video và hình ảnh từ những ứng dụng ta sử dụng lớp MediaPlayer (MediaPlayer class).
Nền tảng Android cũng cho phép ta ghi lại âm thanh và video, nơi được hỗ trợ bởi phần cứng của thiết bị di động. Để ghi âm thanh hoặc video ta sử dụng MediaRecorder class. Lưu ý rằng các bộ giả lập không có các phần cứng để hỗ trợ ghi lại âm thanh hoặc video nhưng trên thực tế các thiết bị di động hỗ trợ các khả năng này rất tốt và được truy cập thông qua MediaRecorder class.
Android hỗ trợ các định dạng đa phương tiện như sau:
Phát lại, tải về và xử lí các định dạng âm thanh, hình ảnh bao gồm: 3GPP, MPEG-4, AAC, MP3.
Mã hóa và giải mã các định dạng video, hình ảnh ảnh với các định dạng: MPEG-4, H.263, AVC(H.264), và JPEG.
Bộ mã hóa/giải mã tiếng nói ảnh với các định dạng: AMR-NB và AMR-WB.
Bộ mã hóa/giải mã âm thanh ảnh với các định dạng: MP3, AAC, và AAC+, WMA.
Ghi lại video, hình ảnh với các định dạng: 3GPP, MPEG-4, JPEG.
Trong thực tế thì chỉ có OGG, WMA, và MP3 làm việc tốt trong bộ giả lập, nhưng WMA thì có dung lượng và tốc độ rất lớn nên ít được sử dụng. Vì vậy, để phát triển tốt các ứng dụng trên bộ giả lập ta nên sử dụng hai định dạng: OGG và MP3 (mono cho thoại và stereo cho âm nhạc) OGG sẽ làm việc tốt cho các video clip ngắn và âm thanh cho trò chơi.
Về khả năng tương thích, thiết bị sử dụng hệ điều hành Android sẽ hỗ trợ tốt các multimedia codecs sau.
Name
Encoder
Decoder
Details
File/Container format
Audio
AAC LC/LTP
X
Mono/Stereo
content in any
combination of
standard bit rates
up to 160 kbps
and sampling
rates between 8
to 48kHz
3GPP (.3gp)
and MPEG-4
(.mp4, .m4a).
No support for
raw AAC (.aac)
HE-AACv1 ( AAC+)
X
HE-AACv2(ehanced AAC+)
X
AMR-NB
X
X
4.75 to 12.2 kbps
sampled @ 8kHz
3GPP (.3gp)
AMR-WB
X
9 rates from 6.60
kbit/s to 23.85
kbit/s sampled @
16kHz
3GPP (.3gp)
MP3
X
Mono/Stereo
8-320Kbps
constant (CBR) or
variable bit-rate
(VBR)
MP3 (.mp3)
MIDI
X
MIDI Type 0 and 1.
DLS Version 1 and
2. XM
Các file đính kèm theo tài liệu này:
- Lập trình đa phương tiện (Multimedia) trên nền tảng Android.docx