» Nội dung :• Cấu trúc mở rộng một class Canvas như sau:
Trong class trên, chỉ có hàm
paintlà bắt buộc phải có còn các hàm khác như hàm tạo lập, hàm keyPressed… có hay không cũng không có sao.
Do đó, ta có thể viết gọn một class Canvas như sau, đơn giản thôi nhưng ta sẽ phát triển nhiều hơn từ nó.
Đầu tiên là viết lớp canvas trước:
Tiếp theo là viết MIDlet như mọi khi:
Hoặc viết như sau:
Đó có đơn giản hay không.Tuy nhiên ta có thể làm nhiều chuyện trong class cv này và ta cũng không cần để ý tới class Midlet nữa.
Tất cả đều liên quan đến hàm paint trong Canvas, trong đó tham số Graphics cũng là bắt buộc. ta sẽ làm quen với một số thao tác vẽ trên Graphics này.bây giờ Ta học vài thao tác đơn giản sau:
getWidth() : lấy giá trị chiều rộng màn hình
getHeight() : lấy giá trị chiều cao màn hình
g.setColor(int x) : đặt màu cho các lệnh vẽ, x trong này có thể là số nguyên hoặc là dạng màu mã hex, vd: 0xff00ff. chắc các bạn cũng quen rồi.
g.drawString("chuỗi cần vẽ",x,y,layout);
//vẽ chuỗi lên Graphics, với điểm mốc(x,y) và layout được chỉ định như sau:
w-layout : Graphics.LEFT, Graphics.RIGHT, Graphics.HCENTER
h-layout : Graphics.TOP, Graphics.BOTTOM, Graphics.BASELINE
tham số layout được viết kết hợp giữa h-layout và w-layout như sau:
w-layout|h-layout
vd:
g.drawString("ho oh",10,30,Graphics.LEFT|Graphics.BOTTOM);
g.drawRect(x,y,w,h) : vẽ hình chữ nhật từ điểm (x,y) với chiều rộng w, chiều cao h
g.fillRect(x,y,w,h) : cũng tương tự như trên nhưng vẽ hình chữ nhật đặc
g.drawImage(Image im,x,y,layout) : vẽ hình ảnh lên Graphics từ điểm (x,y) với layout chỉ định như trên. Có điều Graphics.BASELINE thay bằng Graphics.VCENTER
g.setClip(x,y,w,h) : chỉ địnhkhoảng mà các lệnh vẽ có hiệu lực, đây là một khoảng chữ nhật từ điểm (x,y) với chiều rộng w, chiều cao h. các lệnh vẽ trong khoảng này thì hiện ra, ngoài khoảng này thì không có hiệu lực.
* trong Graphics còn có biến Font, các bạn có thể tìm hiểu them cách cài đặt kiểu font để vẽ chuỗi cho đẹp.
repaint() : lệnh dùng để gọi lại hàm paint(Graphics g) mỗi khi có sự thay đổi tọa độ vẽ, thay hình ảnh, chuỗi mới…
Vd: bây giờ thì ta biến đổi class cv ở trên một chút:
import javax.microedition.lcdui.*;
class cv extends Canvas{
public void paint(Graphics g){
int w=getWidth();
int h=getHeight();
g.setColor(0);
g.fillRect(0,0,w,h);
g.setColor(0xffee77);
g.drawRect((w-60)/2,(h-40)/2,60,40);
g.drawString("ho oh",w/2,h/2,Graphics.HCENTER|Graphics.BASELINE);
}
}
Tiếp đến là phần nhận biết phím bấm, ta nói tới hàm
keyPressed(int k);hàm này được thực hiện mỗi khi bấm phím điện thoại, tức nhiên là khi lớp canvas được hiển thị. Mỗi khi nhấn phím thì k nhận một giá trị tương ứng với giá trị phím như sau:
Đối với hàm
keyReleased(int k);và
keyRepeated(int k);cũng tương tự nhưng thay vì là nhận biết nhấn phím thì nhận biết nhả phím và giữ phím.
Ta tiếp tục với ví dụ nhé:
import javax.microedition.lcdui.*;
class cv extends Canvas{
int m=0;
public void paint(Graphics g){
int w=getWidth();
int h=getHeight();
g.setColor(0);
g.fillRect(0,0,w,h);
g.setColor(0xffee77);
g.drawRect((w-60)/2,(h-40)/2,60,40);;
g.drawString("ho oh",w/2,h/2,Graphics.HCENTER|Graphics.BASELINE);
}
public void keyPressed(int k){
if(k==-3||k==KEY_NUM4){m=m-10;}
if(k==-4||k==KEY_NUM6){m=m 10;}
repaint();
}
}
Đối với Graphics còn có nhiều lệnh vẽ lắm nhưng mà chỉ biết vẽ hình chữ nhật với vẽ chuỗi và image là đủ rồi. lớp GameCanvas cũng tương tự nhưng có nhiều phức tạp hơn một chút.