Tải bản đầy đủ (.pdf) (24 trang)

ứng dụng Java cho điện thoại di động

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (493.99 KB, 24 trang )

Đồ án tốt nghiệp Ứng dụng Java cho điện thoại di động


20
CHƯƠNG 2 HƯỚNG TIẾP CẬN

Khi lập trình trên điện thoại di động, cần phải khai thác được các thế mạnh của
điện thoại ngày nay là âm thanh và hình ảnh. Trong phần này chúng em sẽ trình bày
một số kỹ thuật xử lý âm thanh, một số kỹ thuật xử lý đồ họa và kỹ thuật xử lý phím
cũng sẽ được trình bày chi tiết. Tất cả các kỹ thuật này được thử nghiệm thành công
trên các điện thoại của các hãng điện thoại lớn như Nokia, Samsung hay Sony
Ericssion.
2.1 Xử lý hình ảnh đồ hoạ
2.1.1 Tìm hiểu các đối tượng đồ họa
Ngày nay với sự phát triển nhanh chóng của công nghệ di động, chiếc điện
thoại di động không còn đơn giản như trước đây là có nhiệm vụ thoại mà còn là
phương tiện rất hữu hiệu trong công việc và giải trí. Về hình ảnh, trước đây màn
hình điện thoại di động chỉ là màn hình đen trắng nhưng ngày nay màn hình điện
thoại là màn hình màu và ở một số loại điện thoại mới có đến vài trăm ngàn màu.
Đó là những ưu điểm mà giúp điện thoại di động ngày càng thân thiết với người sử
dụng hơn. Với những ưu điểm đó, vậy thì làm sao để xây dựng các ứng dụng giải trí
trên điện thoại di động hiệu quả. Phần này sẽ trình bày những khía cạnh cơ bản giúp
cho việc khai thác các điểm mạnh về đồ hoạ một cách hiệu quả hơn.
Hầu hết các điện thoại di động ngày nay đều sử dụng công nghệ Java. Thế
mạnh của ngôn ngữ này là có thể chạy được trên các platform khác nhau. Để xây
dựng các ứng dụng giải trí mạnh về đồ hoạ, môi trường MIDP 1.0 cung cấp cho
chúng ta hai mức đồ hoạ cơ bản là đồ họa mức thấp và đồ hoạ mức cao. Đồ hoạ
mức cao dùng cho văn bản hay form. Đồ hoạ mức thấp dùng cho các ứng dụng trò
chơi yêu cầu phải vẽ lên màn hình.




Đồ án tốt nghiệp Ứng dụng Java cho điện thoại di động


21
Hình sau biểu diễn hai mức độ đồ hoạ.

Cả hai lớp đồ hoạ mức thấp và lớp đồ họa mức cao đều là con của lớp
Displayable
. Trong MIDP chỉ có một lớp
Displayable
được hiển thị tại một
thời điểm, có thể định nghĩa nhiều màn hình nhưng chỉ hiển thị một màn hình.
Public abstract class Canvas extends Displayable
Public abstract class Screen extends Displayable
- Đồ hoạ mức cao: là lớp con của lớp
Screen
. Nó cung cấp các thành phần như
Textbox, List, Form, Alert.
Ta ít điều khiển việc sắp xếp các thành phần trên
màn hình. Việc sắp xếp phụ thuộc vào nhà sản xuất.
Textbox: Cho phép người dùng nhập và soạn thảo văn bản. Ta có thể định
nghĩa số ký tự tối đa, giới hạn loại dữ liệu nhập (số học, mật khẩu, email,…) và hiệu
chỉnh nội dung textbox. Kích thước thật sự của textbox có thể nhỏ hơn yêu cầu khi
chạy trong thực tế (do giới hạn của thiết bị). Kích thước thật sự của textbox có thể
lấy bằng phương thức getMaxSize().
List: Chứa danh sách các lựa chọn, người dùng có thể tương tác với danh sách
và chọn một hay nhiều item. Có 3 loại danh sách là: IMPLICIT, EXCLUSIVE và
MULTIPLE.
Alert: hiển thị một màn hình pop-up trong một khoảng thời gian, nó được dùng

để cảnh báo hay thông báo lỗi.Thời gian hiển thị có thể đuợc thiết lập bởi ứng dụng
Displayable
Lớp Canvas Lớp Screen
ListTextbox AlertForm
Mức thấp Mức cao
- Các ứng dụng
game
- Vẽ lên màn hình
- Các sự kiện nhấn
phím
- Ít tính khả chuyển
- Các ứng dụng doanh nghiệp
- Có tính khả chuyển cao.
- Không điều khiển các thành phần
Đồ án tốt nghiệp Ứng dụng Java cho điện thoại di động


22
hoặc được thiết lập là FOREVER cho đến khi người dùng nhấn phím bất kỳ để
đóng lại.
Form: Cho phép hiển thị nhiều item khác nhau trên một màn hình.
- Đồ hoạ mức thấp: là lớp con của lớp
Canvas
. Lớp này cung cấp các phương thức
đồ họa cho phép vẽ lên màn hình cùng với các phương thức xử lý sự kiện bàn phím.
Lớp này dùng cho các ứng dụng trò chơi cần điều khiển nhiều việc vẽ lên màn hình.
Khi có một ứng dụng đòi hỏi đồ họa mạnh chắc chắn ứng dụng đó phải sử
dụng các lớp này. Đây là những lớp đồ hoạ cấp thấp chạy được trên hầu hết các loại
điện thoại di động hỗ trợ Java. Một số thử nghiệm việc ứng dụng các hàm đồ họa
cấp thấp của MIDP 1.0 đề xây dựng các ứng dụng yêu cầu khả năng đồ hoạ cao cho

thấy tốc độ thực hiện nhanh hơn khi sử dụng MIDP 2.0.
2.1.2 Kỹ thuật xử lý hoạt hình
Một trong những thành phần không kém phần quan trọng khi xây dựng các
ứng dụng mạnh về đồ hoạ là tạo các hiệu ứng hoạt hình. Để làm được điều đó,
MIDP 1.0 cung cấp cho ta các đối tượng Timer, Thread, Runnable cho phép thực
hiện các hiệu ứng theo chu kỳ thời gian định trước.
2.1.2.1 Sử dụng đối tượng Timer đề tạo hoạt hình
Trong đồ án, các game sử dụng các lớp về đồ hoạ để biểu diễn các hình ảnh và
sử dụng Timer cho việc làm chuyển động các đối tượng cũng như tính thời gian.
Hoạt hình thực chất là sự luân phiên thay đổi các hình theo một khoảng thời gian
xác định. Tuỳ vào số lượng hình ảnh và khoảng thời gian mà hiệu ứng sẽ diễn ra
đẹp hay không đẹp.
Mô tả kỹ thuật xử lý hoạt hình sử dụng đối tượng Timer.
Public class MainGame extends Canvas {
Public MainGame(){
// Khởi tạo Timer
tm = new Timer();
doAnimation tt = new doAnimation ();
Đồ án tốt nghiệp Ứng dụng Java cho điện thoại di động


23
tm.schedule(tt, 500,500); // Thiết lập thời gian hoạt
hình
}
Protected void paint(Graphics g){
// Các thao tác vẽ hình ảnh
}

public class doAnimation extends TimerTask {

public final void run(){
// Cập nhật hình ảnh
repaint(); // vẽ lại màn hình sau khi cập nhật
}
}
}
Theo khoảng thời gian xác định, hình ảnh sẽ được lớp doAnimation cập nhật
mới và phương thức
repaint()
sẽ được gọi để cập nhật lại hình ảnh trên thiết bị.
Phương thức
repaint()
sẽ gọi phương thức
paint(Graphic g)
để vẽ lại màn
hình theo các tham số được cập nhật trong phương thức
run()
của lớp
doAnamation.
2.1.2.2 Sử dụng Thread đề tạo hoạt hình
Một hướng khác khi tạo hiệu ứng hoạt hình là ta có thể dùng thread đề định
thời gian. Thread được lớp
java.lang.Thread
cung cấp, nó có nhiều phương thức
nhưng có phương thức quan trọng mà ta cần chú ý khi xây dựng ứng dụng là start() .
Start()
– để khởi động thread
Kỹ thuật sử dụng thread được thực hiện như sau:
public class GameCanvas
{

private final int DELAY = 100;
private GameThread thread;
private boolean running;
public GameCanvas()
{
}
public void start()
{
running = true;
Đồ án tốt nghiệp Ứng dụng Java cho điện thoại di động


24
thread = new GameThread();
thread.start();
}
public void stop()
{
running = false;
}
public class GameThread extends Thread
{
public void run()
{
while (running)
{
// Cập nhật hình ảnh
// Kiểm tra các điều kiện chuyển động
// vẽ lại hình ảnh
try

{
Thread.sleep(DELAY);
} catch (Exception ex) { }
}
}
}
}

Cờ running cho biết thread có đang thực hiện hay không, thread sẽ dừng khi cờ
này được gán bằng false khi gọi phương thức stop(). DELAY cho biết thời gian lặp
lại hành động của thread.
2.1.2.3 Sử dụng giao diện Runnable đề tạo hoạt hình
Cách khác để tạo hoạt hình là sử dụng giao diện Runnable của lớp
java.lang.Runnable
. Giao diện này được thiết kế để cung cấp những phương
thức thông dụng cho những đối tượng hoạt hình và nó được kế thừa từ lớp Thread.
Giao diện Runnable có một phương thức duy nhất là
run().
Khi một đối tuợng sử
dụng giao diện Runnable đề tạo thread, phương thức
run()
được gọi để thực thi
thread.
Kỹ thuật sử dụng giao diện Runnable được cài đặt như sau:
public class GameCanvas implements Runnable
{
private final int DELAY = 100;
private Thread thread;
private boolean running;
public GameCanvas()

{
Đồ án tốt nghiệp Ứng dụng Java cho điện thoại di động


25
}
public void start()
{
running = true;
thread = new Thread(this);
thread.start();
}
public void stop()
{
running = false;
}
public void run()
{
while (running)
{
// Cập nhật hình ảnh
// Kiểm tra tương thích
// vẽ lại hình ảnh
try
{
Thread.sleep(DELAY);
} catch (Exception ex) { }
}
}
}


Do nó được kế thừa từ Thread nên cũng có cờ running cho biết giao diện có
đang thực thi hay không, và nó sẽ ngừng khi cờ running được thiết lập là false khi
phương thức stop() được gọi.
Khi lập trình xử lý hoạt hình, chúng ta nên cân nhắc giữa việc sử dụng Thread
và sử dụng Timer. Thread không thích hợp cho việc tạo các hiệu ứng hoạt hình theo
từng frame (frame-rate), cách tốt nhất đối với hoạt hình dạng này là ta dùng đối
tượng Timer vì đối tượng này không sử dụng trực tiếp đồng hồ hệ thống nên việc
thực hiện hoạt hình sẽ hiệu quả hơn. Timer dễ sử dụng hơn Thread nhưng do ban
đầu Java chưa hỗ trợ lớp Timer nên có một số game sử dụng Thread đề thay thế.
2.2 Xử lý thao tác bàn phím
Do chúng ta xây dựng ứng dụng dựa trên giao diện lập trình cấp thấp nên ta có
thể dễ dàng kiểm soát thao tác phím dựa trên đối tượng Canvas. Hầu hết các ứng
dụng J2ME đều sử dụng Thread cho việc kiểm soát bàn phím. Khi người dùng nhấn
Đồ án tốt nghiệp Ứng dụng Java cho điện thoại di động


26
một phím trên điện thoại, một sự kiện được lập tức gửi cho ứng dụng, ứng dụng sẽ
nhận sự kiện, phân tích phím nhấn và xử lý hành động tương ứng.
Đối tượng Canvas cung cấp phương thức
keyPressed (int keycode)
để xử
lý phím nhấn, đây là cách xử lý sự kiện bấm phím.
private int key;
public void keyPressed(int keyCode)
{
// Xử lý hành động tương ứng
switch (keyCode){
case -1:

case 50: //Up or Number 2
// Hành động khi nhấn phím
break;

case -2:
case 56: //down or Number 8
break;

case -3:
case 52: // Left or Number 4
break;

case -4:
case 54: // Nhấn phím số 6 hoặc phím Right
break;

case -5:
case 53: // Nhấn phím 5 hoặc phím Select
break;
}
repaint(); // Vẽ lại màn hình sau khi nhấn phím
}

public void keyReleased(int keyCode)
{
// Đặt = 0 khi không có phím nào đuợc nhấn.
key = 0;
}

Khi có sự kiện nhấn phím, hàm này sẽ kiểm tra và xử lý hành động tương ứng.

Sau khi xử lý sẽ gọi phương thức repaint() để cập nhật lại màn hình thiết bị theo
hành động mà người dùng vừa thực hiện.

Đồ án tốt nghiệp Ứng dụng Java cho điện thoại di động


27
2.3 Đánh giá ưu khuyết điểm của việc sử dụng đối tượng
đồ hoạ cấp thấp
Ưu điểm:
- Khai thác tối đa thế mạnh về đồ hoạ mà các loại điện thoại di động ngày nay
cung cấp như màu sắc, hình ảnh, hoạt hình.
- Cho phép can thiệp trực tiếp vào màn hình hiển thị của thiết bị, giúp dễ dàng
xây dựng các ứng dụng hoạt hình.
- Cho phép kiểm soát phím nhấn dễ dàng thông qua lớp Canvas.
- Cho phép ứng dụng thực hiện với tốc độ nhanh vì thao tác trực tiếp trên màn
hình thiết bị mà không qua đối tượng trung gian nào.
Khuyết điểm:
- Khó khăn cho việc xây dựng ứng dụng vì phải sử dụng đối tượng đồ hoạ cấp
thấp.
- Do tất cả các thao tác vẽ đều được lớp Canvas xử lý nên phải có giải pháp
nhằm giúp cho lớp này thực hiện thao tác vẽ nhanh và hiệu quả nhất.
2.4 Một số giải pháp khi xử lý đồ họa
- Cải tiến tốc độ vẽ hình ảnh trên màn hình thiết bị: Do việc nạp ảnh từ file
thường tốn nhiều thời gian nên ta không thể vừa thực hiện vẽ hình ảnh lên màn hình
vừa đọc hình ảnh từ file, việc này sẽ làm hoạt hình bị giật. Do đó chúng ta cần phải
load hình vào bộ nhớ máy trước khi thực hiện thao tác vẽ như sau:
 Load tất cả các hình ảnh cần thiết vào bộ nhớ máy trong phương thức
constructor của đối tượng sử dụng hình ảnh một lần.


Trong phương thức paint(), ta luân phiên vẽ các hình ảnh này theo khoảng
thời gian xác định.

Điều này sẽ giúp cho hoạt hình không bị giật, do hình ảnh đã được nạp vào
trong bộ nhớ ngay từ đầu nhưng sẽ gây ra một khó khăn là tài nguyên hệ thống bị
chiếm giữ.
Đồ án tốt nghiệp Ứng dụng Java cho điện thoại di động


28
- Vẽ những phần hình ảnh có thay đổi, không vẽ hết màn hình: Khi thực hiện
các thao tác hoạt hình ta nên vẽ những phần hình ảnh bị thay đổi không nên vẽ lại
toàn bộ màn hình.
- Thu dọn tài nguyên hệ thống sau khi dùng: Khi tạo ra các đối tượng đồ hoạ như
Image, hệ thống sẽ không tự động thu dọn tài nguyên mà các đối tượng này chiếm
giữ cho đến khi kết thúc ứng dụng. Điều này sẽ làm tốn tài nguyên của hệ thống.
J2ME cho phép chúng ta thu dọn tài nguyên hệ thống bằng tay bằng cách gọi
System.gc().
Nhưng trước khi gọi phương thức này các đối tượng bạn muốn thu
hồi tài nguyên phải được gán bằng null.
Có một chú ý là ta nên giải phóng hết tài nguyên trước khi chuyển sang thực
hiện thao tác kế tiếp.
void freeMemory() {
img1 = null;
img2 = null;
img3 = null;
System.gc(); //Call Garbage Collector
}



Không nên thực hiện theo cách sau:
void loadData() {
try {
img1 = null;
img1 = Image.createImage("img1.png");
img2 = null;
img2 = Image.createImage("img2.png");
img3 = null;
img3 = Image.createImage("img3.png");
} catch (...) {}
}

×