• Thứ Năm, 20/10/2005 14:28 (GMT+7)

    J2ME MIDP 2.0 - Những điểm mới trong thư viện lập trình giao diện người dùng cấp thấp

    Khi lập trình cho máy tính, thường chúng ta chỉ sử dụng các thành phần giao diện có sẵn để tạo ra giao diện người dùng. Tuy nhiên, khi lập trình cho điện thoại di động sử dụng MIDP, thành phần giao diện có sẵn khá nghèo nàn. MIDP chỉ cung cấp các thành phần giao diện thông dụng nhất. Đối với máy tính, nếu một thành phần giao diện chúng ta cần không sẵn có trong bộ công cụ phát triển (SDK), chúng ta có thể dễ dàng sử dụng thư viện của một nhà cung cấp thứ ba. Điều này rất khó cho các ứng dụng trên ĐTDĐ luôn yêu cầu dung lượng nhỏ. Chúng ta không thể tích hợp cả một thư viện vào ứng dụng để sử dụng một hoặc một vài thành phần giao diện. Để giải quyết vấn đề này, chúng ta cần phải sử dụng thư viện lập trình giao diện người dùng cấp thấp (Low-Level User Interface Libraries) để tạo các thành phần giao diện mong muốn.

    Trong J2ME Mobile Information Device Profile version 2.0 (MIDP 2.0), SUN đã thêm nhiều tính năng mới giúp chúng ta dễ dàng hơn khi tạo các thành phần giao diện của riêng mình. Bài viết này sẽ giới thiệu với các bạn những tính năng mới đó.

    CÁC TÍNH NĂNG MỚI TRONG LỚP CANVAS

    1. Hai phương thức setTicker và setTitle có thể sử dụng ở Canvas

    Trong phiên bản MIDP 1.0, hai phương thức setTicker và setTitle được thiết kế ở lớp Screen. Bạn không thể setTicker và setTitle ở Canvas. Trong phiên bản 2.0, setTicker và setTitle đã được chuyển đến lớp Displayable. Lớp Canvas được kế thừa từ lớp Displayable, do vậy setTicker và setTitle đã sẵn dùng trong Canvas.

    2. Phương thức setFullScreenMode được thêm vào Canvas

    Kích thước của màn hình ĐTDĐ luôn là vấn đề khi chúng ta cần hiển thị một biểu đồ hay một hình ảnh trong ứng dụng. Khi cần sử dụng kích thước tối đa có thể được của màn hình, chúng ta có thể dùng phương thức setFullScreenMode.

    Khi bạn dùng phương thức setFullScreenMode, vùng màn hình dùng để hiển thị Ticker và title sẽ bị ẩn đi. Vì vậy, cho dù trong mã chương trình bạn có sử dụng hai phương thức setTicker và setTitle, thì Ticker và title vẫn sẽ không được hiển thị. So sánh điều này trong MIDP 1.0 và MIDP 2.0 thì hơi khập khiễng vì trong MIDP 1.0 không thể dùng setTicker và setTitle trong Canvas. Tuy nhiên bạn có thể so sánh Canvas với một Screen, chẳng hạn như Form. Phương thức thiết lập (constructor) của Form luôn có một title.

    Khi bạn dùng phương thức setFullScreenMode, vùng màn hình dùng để hiển thị Command cũng sẽ bị ẩn đi, cho dù bạn đã thêm Command vào ứng dụng.

    Hãy xem ví dụ minh hoạ sau đây:

    1 public class FullScreenCanvas extends MIDlet {

    2 /*

    3 * @see javax.microedition.midlet.MIDlet#startApp()

    4 */

    5 protected void startApp() throws MIDletStateChangeException {

    6 Canvas canvas = new Canvas (){

    7 protected void paint(Graphics g) {

    8 g.setColor(0xFF0000);

    9 g.fillRect(0, 0, getWidth(), getHeight());

    10 }

    11 };

    12 canvas.setTitle(“My title”);

    13 canvas.setTicker(new Ticker(“My ticker”));

    14 canvas.addCommand(new Command(“OK”, Command.OK, 1));

    15 canvas.setFullScreenMode(true);

    16 Display.getDisplay(this).setCurrent(canvas);

    }

    //...

    }

    * Chú ý: Khi bạn gọi phương thức setFullScreenMode, phương thức sizeChanged có thể được gọi. Ngoài ra trên một số thiết bị, vùng thông tin trạng thái hệ thống cũng được ẩn đi để hiển thị chế độ FullScreen.

    CÁC TÍNH NĂNG MỚI TRONG LỚP GRAPHICS

    1. Phương thức drawRegion

    Phương thức drawRegion cho phép bạn vẽ ảnh lên một đối tượng Graphics. Ảnh được vẽ có thể xoay hoặc phản chiếu so với ảnh gốc. Bạn cũng có thể vẽ một phần hình chữ nhật của ảnh gốc.

    drawRegion(Image img, int x_src, int y_src, int width, int height, int transform, int x, int y, int anchor)

    Bạn hãy xem Javadoc để biết chi tiết các tham số của phương thức này. Tham số có ý nghĩa nhất là transform, nó chỉ định tỉ lệ xoay hoặc phản chiếu của ảnh. Ví dụ sau đây sẽ trình bày cách sử dụng phương thức này:

    Phương thức paint của một Canvas:

    /*

    *

    * @see javax.microedition.lcdui.Canvas#paint(javax.microedition.lcdui.Graphics)

    */

    protected void paint(Graphics g) {

    Image image = null;

    try {

    //Nap hinh

    image = Image.createImage(this.getClass().getResourceAsStream(

    “java.png”));

    } catch (IOException e) {

    System.out.println(“Khong the nap hinh.”);

    return;

    }

    int w = image.getWidth();

    int h = image.getHeight();

    //Ve hinh goc
    g.drawRegion(image, 0, 0, w, h, Sprite.TRANS_NONE, 0, 0, Graphics.LEFT
    | Graphics.TOP);

    //Ve hinh phan xa
    g.drawRegion(image, 0, 0, w, h, Sprite.TRANS_MIRROR, w, 0,
    Graphics.LEFT | Graphics.TOP);

    //Ve mot nua hinh xoay 180 do.
    g.drawRegion(image, 0, 0, w, h / 2, Sprite.TRANS_ROT180, w * 2, h / 2,
    Graphics.LEFT | Graphics.TOP);
    }

    Kết quả thực hiện như hình 3.

    2. Phương thức copyArea

    Phương thức này cho phép sao chép nội dung của một phần ảnh hình chữ nhật từ vùng này sang vùng khác trong một ảnh.

    void copyArea (int x_src, int y_src, int width, int height,
    int x_dest, int y_dest, int anchor)

    copyArea không cho phép thực hiện trên đối tượng Graphics của màn hình đang hiển thị.

    3. Phương thức fillTriangle

    fillTriangle tô lên đối tượng Graphics một hình tam giác theo màu hiện hành.

    fillTriangle(int x1, int y1, int x2, int y2, int x3, int y3)

    Tam giác cần tô được xác định qua ba điểm (x1, y1), (x2, y2) và (x3, y3).

    4. Phương thức drawRGB

    Phương thức này cho phép bạn vẽ một hình chữ nhật với một dãy màu cho trước.

    drawRGB(int[] rgb, int offset, int scanlength, int x, int y,

    int width, int height, boolean processAlpha)

    Việc minh hoạ màu sắc của mỗi pixel trên ứng dụng sẽ rất khó nhận biết, vì vậy chúng tôi sử dụng hình ảnh trong sách “Programming Wireless Devices with the J2ME”, nhà xuất bản Addison Wesley để các bạn dễ hình dung.

    Ví dụ:

    int[] rgb = {

    0x848484, 0x4A4A4A, 0xBDBDBD, 0xFFFFFF, 0x4A4A4A, 0xDEDEDE,

    0xBDBDBD, 0x848484, 0x848484, 0x4A4A4A, 0xFFFFFF, 0x4A4A4A,

    0xBDBDBD, 0x848484, 0xFFFFFF, 0x848484, 0xDEDEDE, 0xBDBDBD,

    0xDEDEDE, 0xFFFFFF, 0xBDBDBD};

    g.drawRGB(rgb, 2, 7, 4, 2, 5, 3, false);

    Kết quả thực hiện của phương thức như hình 4.

    5. Phương thức getDisplayColor

    Mỗi loại điện thoại khác nhau hỗ trợ số lượng màu khác nhau. Để tránh tình trạng bạn sử dụng một màu không được thiết bị hỗ trợ, MIDP 2.0 cung cấp phương thức:
    int getDisplayColor(intcolor)

    Phương thức này trả về màu gần nhất với màu được thiết bị hỗ trợ.

    CÁC TÍNH NĂNG MỚI TRONG LỚP IMAGE

    1. Tạo một ảnh con từ một ảnh có sẵn với độ xoay hoặc độ phản chiếu được chỉ định

    Từ một ảnh có sẵn, bạn có thể tạo ra một ảnh mới từ một phần hoặc toàn bộ ảnh đó. Ảnh mới thu được có thể xoay hoặc phản chiếu so với ảnh gốc. Nó được hỗ trợ trong phương thức sau:

    static Image createImage(Image image, int x, int y, int width, int height, int transform)

    transform là tham số dùng để xoay hoặc phản chiếu ảnh cần tạo.

    2. Tạo ảnh từ InputStream

    Lớp Image trong MIDP 2.0 giờ đây đã hỗ trợ việc tạo ảnh từ InputStream:
    static Image createImage(InputStream stream)

    Điều này rất thuận lợi khi bạn dùng với phương thức getResourceAsStream của lớp Class:
    Image.createImage(this.getClass().getResourceAsStream(“java.png”));

    3. Tạo ảnh từ một dãy giá trị RGB

    Phương thức:

    static Image createRGBImage(int[] rgb,int width, int height, boolean processAlpha)

    cho phép tạo ảnh từ một dãy giá trị ARGB. Dữ liệu ARGB trong dãy rgb được sắp xếp theo phương ngang từ trái sang phải cho mỗi hàng, và từ trên xuống dưới.

    4. Lấy một dãy RGB của một vùng hình chữ nhật của ảnh cho trước

    void getRGB(int[]rgbData, intoffset, intscanlength, intx, inty, intwidth, intheight)

    Ý nghĩa của các tham số tương tự như trong phương thức drawRGB, ngoại trừ rgbData là dãy giá trị chứa kết quả trả về, đó là dãy giá trị ARGB đạt được từ vùng ảnh hình chữ nhật x, y, width, height.

    Trên đây là toàn bộ các tính năng mới của thư viện đồ hoạ cấp thấp trong MIDP 2.0. Do khuôn khổ giới hạn của một bài báo, chúng tôi không thể giới thiệu chi tiết toàn bộ các ứng dụng của mỗi tính năng. Sau khi nắm rõ các tính năng, bạn sẽ dễ dàng nhận biết khi nào nên sử dụng chúng trong ứng dụng của mình. Chúc bạn thành công!

    Ngô Văn Khoa
    ngovankhoa@yahoo.com

    ID: A0508_126