Chức năng phục hồi

Một phần của tài liệu ứng dụng tô màu cho bé (Trang 58 - 64)

CHƯƠNG III : NỘI DUNG KẾT QUẢ NGHIÊN CỨU

3.1.6Chức năng phục hồi

3.1 PHÁT TRIỂN ỨNG DỤNG

3.1.6Chức năng phục hồi

Đôi khi trong lúc người dùng tô hoặc vẽ có thể xảy ra sai sót và muốn khôi phục lại trạng thái trước đó, chức năng này sẽ giúp người dùng thực hiện điều đó . Chức năng này thực hiện theo nguyên tắc sau : trước khi người dùng tô, hoặc vẽ lên màn hình, trạng thái trước đó sẽ lưu trữ lại, đề phục hồi lại trạng thái trước đó thì ta chỉ cần vẽ lại trạng thái đã được lưu trữ lên màn hình. Trong ứng dụng ta vẽ lên đối tượng thuộc lớp Bitmap vì thế trước khi vẽ ta sẽ lưu trữ bitmap này lại, các bitmap sẽ được lưu trữ vào một danh sách theo thứ tự từ trước đến sau, các bitmap được lưu trữ sau sẽ được lưu vào cuối danh sách . Khi muốn phục hồi lại ta lấy bitmap cuối danh sách và vẽ lại lên màn hình. Một hành động vẽ bắt đầu khi ta chạm tay vào màn hình, vì thế việc lưu trữ các bitmap sẽ được thực hiện ngay khi ta chạm tay vào màn hình để lưu trữ lại trạng thái trước đó:

Khai báo danh sách lưu lại các bitmap :

List<Bitmap> undoBit = new ArrayList<Bitmap>(); Lưu lại các bitmap khi chạm tay vào màn hình :

private void touch_start(float x, float y) {

if(undoBit.size()==5)//chi undo duoc 5 lan truoc do { undoBit.remove(0); } undoBit.add(undoBit.size(), bitcp); }

Vì bộ nhớ thiết bị có hạn nên không thể lưu trữ lại nhiều bitmap được, nếu có có quá nhiều bitmap được lưu lại sẽ gây cạn kiệt bộ nhớ và gây ra lỗi chương trình .Chính vì thế, ở đây ta giới hạn lại số lần phục hồi trước đó chỉ là 5. Để thực hiện được điều này thì trước khi thêm bitmap vào danh sách, ta kiểm tra xem số phần tử trong danh sách có bằng 5 chưa, nếu bằng thì ta sẽ xóa bitmap được lưu trữ trước nhất ra khỏi danh sách . Sau đó ta mới thêm bitmap vào cuối danh sách.Khi thực hiện việc khôi phục lại trạng thái trước đó, ta kiểm tra xem trong danh sách các bitmap được lưu trữ có rỗng không, nếu không thì ta lấy phần tử cuối cùng trong danh sách ra vẽ lại lên màn hình và xóa nó ra khỏi danh sách. Ngược lại, không có danh bitmap nào được lưu trữ thì ta không thể phục hồi lại được và hiển thị một toast lên màn hình thông báo cho người dùng biết không thể phục hồi.

public void unDo() {

if(undoBit.size()>0) {

bitmap =

Bitmap.createScaledBitmap(undoBit.remove(undoBit.size()- 1),bitmap.getWidth(),bitmap.getHeight(),true);

mcanvas = new Canvas(bitmap); invalidate();

} else {

Toast.makeText(getContext(), "Khong the phuc hoi...",

Toast.LENGTH_SHORT).show(); }

}

Để gọi lại phương thức này trong lớp BabyPaintActivity ta xây dựng thêm phương thức Undo(View view)

public void Undo(View v) {

mview.unDo(); }

Trong tập tin XML, nút tương ứng với chức năng này ta khai báo thêm thuộc tính android:onClick= “Undo”

<ImageButton android:id="@+id/bt_undo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_undo" android:onClick="Undo" />

3.1.7 Chức năng chọn hình kèm theo ứng dụng, phát âm tiếng anh ứng với nội dung hình đã chọn.

Chọn hình kèm theo ứng dụng

Đây là chức năng giúp người dùng tải lên những hình ảnh để tô vẽ trên đó, các hình này được đặt trong thư mục Drawable của project. Khi bấm vào nút tương ứng với chức năng này trên giao diện một gallery sẽ hiện ra để người dùng lựa chọn các hình ảnh . Gallery này đã được khai báo trong tập tin XML xây dựng giao diện chính của ứng dụng. Khi ứng dụng được mở lên, gallery này bị che khuất bởi đối tượng framelayout. Vì thế khi bấm vào nút chức năng này, đối tượng framelayout sẽ được ẩn đi và gallery sẽ hiện lên màn hình. Khi một hình ảnh được chọn gallery này sẽ được ẩn đi, hình ảnh được chọn sẽ được lưu vào một đối tượng bitmap, kích thước bitmap này có thể chưa phù hợp với framelayout để hiển thị vì thế ta khai báo thêm một đối tượng bitmap khác để lưu trữ hình ảnh theo đúng tỷ lệ của famelayout. Khi đó đối tượng mview thuộc lớp MyView sẽ được khởi tạo lại mới với tham số truyền vào là bitmap đã được chỉnh sửa kích thước, sau đó được thêm vào đối tượng display (display là đối tượng thuộc lớp FrameLayout được khai báo trong giao diện) và hiển thị lên màn hình. Các công việc trên sẽ được thực hiện trong sự kiện nhấn vào các item của gallery .

gallery.setOnItemClickListener(new OnItemClickListener() { @Override

public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

// TODO Auto-generated method stub //display là đối tượng thuộc lớp

FrameLayout, nơi để hiện thị đối tượng mview lên màn hình float dw = display.getWidth();

float dh = display.getHeight(); bmp =

BitmapFactory.decodeResource(getResources(),images[position]); alteredBitmap =

Bitmap.createScaledBitmap(bmp, (int)dw, (int)dh, true); mview = new MyView(con ,alteredBitmap); display.removeAllViews();

display.addView(mview); (adsbygoogle = window.adsbygoogle || []).push({});

gallery.setVisibility(View.GONE); display.setVisibility(View.VISIBLE); }

});

Khi thực hiện chức năng này màn hình hiển thị như sau :

Hình 15: Gallery chọn hình kèm theo ứng dụng  Phát âm tiếng anh tương ứng với nội dung hình đã chọn:

Khi chọn một hình bắt kỳ trên gallery, ứng dụng sẽ phát âm tiếng anh một hoặc nhiều từ có nghĩa tương ứng với nội dung hình đó và hiển thị nghĩa cơ bản trên toast. Để nghe lại cách phát âm này, ta có thể nhấn vào nút đầu tiên trên dòng thứ 2(kể từ trái qua) để nghe lại cách phát âm. Với mong muốn giúp bé vừa chơi, vừa học, 24 hình đầu tiên ứng với 24 chữ cái và các hình ảnh ứng với các chữ cái đó. Đối với 24 hình này, khi nhấn vào nút tương ứng với chức năng phát âm, ứng dụng sẽ lần lượt phát âm chữ cái ứng với hình, rồi phát âm từ có nghĩa ứng với nội dung của hình.

Tuy nhiên đối với chữ A, việc phát âm âm “a” không được chính xác lắm, nên đối với hình này chỉ phát âm “apple” tương ứng với nội dung của hình này. Đối với các hình còn lại chỉ phát âm từ có nghĩa ứng với nội dung của hình.

Chức năng phát âm trên chỉ thực hiện khi ta tải hình kèm theo ứng dụng lên màn hình để tô, vẽ. Nếu ta vẽ trên hình chọn từ thẻ nhớ của máy hoặc tạo mới bức vẽ khi nhấn vào chức năng trên màn hình sẽ hiển thị một dialog cho phép nhập vào một từ và phát âm từ đó bằng cách nhấn vào nút “Speak” trên hộp thoại.

Để thực hiện chức năng trên ta cần khai báo một đối tượng thuộc lớp TextToSpeech. Thông qua đối tượng này ta gọi phương thức speak(“text”,TextToSpeech.QUEUE_FLUSH,null). Phương thức này sẽ phát âm các từ trong tham số “text”.Đối với lớp BabyPaintActivity ta cần implements OnInitListener và ghi đè lại phương thức onInit (int status), trong phương thức này ta có thể để trống.

@Override

public void onInit(int status) {

}

Tham số text được truyền vào trong phương thức speak trên được lưu trữ trong một mảng, số phần tử của mảng này bằng với số phần của mảng lưu trữ hình ảnh để hiển thị lên gallery.Ứng với mỗi ảnh ta sẽ lưu trữ một chuỗi ký tự tương ứng. Chuỗi này có định dạng “chữ cái-từ tiếng anh ứng với nội dung hình-nghĩa của từ”. Khi một hình được chọn từ gallery ta sẽ biết được vị trí của hình trong mảng (chỉ số mảng) khi có chỉ số này ta có thể xác định được chuỗi ký tự tương ứng. Chuỗi kí từ trên gồm 3 phần được phân cách với nhau bởi “-“ vì thế ta cần tách chuỗi này thành 3 chuỗi nhỏ, chuỗi thứ nhất để phát âm chữ cái, chuỗi thứ hai để phát âm từ tiếng anh, chuỗi thứ 3 để hiển thị nghĩa của từ tiếng anh.Các công việc này sẽ được thực hiện khi ta chọn một hình nên được đặt trong phương thức sau :

gallery.setOnItemClickListener(new OnItemClickListener() { @Override

public void onItemClick(AdapterView<?> parent, View v, int position, long id) {

String s1[];

//speak là mảng chứa chuỗi ký tự ứng với mỗi hình

s1 = speak[position].split("-");// cắt chuỗi speaktext2=s1[0];//chứ ký tự chữ cái

speaktext=s1[1]; // chứa từ tiếng anh mean=s1[2];// chứa nghĩa

// thực hiện chức năng đọc

tts.speak(s1[1], TextToSpeech.QUEUE_FLUSH,

null); }

});

Với các công việc như trên, ứng dụng chỉ phát âm khi ta chọn hình. Vì thế ta cần xây dựng thêm phương thức để thực hiện chức năng này khi ta nhấn vào nút chức năng tương ứng:

public void Speak(View v) {

// kiểm tra đang ở chế độ nào: true khi tải hình kèm theo ứng dụng, false trong các trường hợp còn lại

if(isspeak == false){ da_speak.showDialog(); }else {// phát âm chữ cái if(change == 1 ) { tts.speak(speaktext2, TextToSpeech.QUEUE_FLUSH, null);

change=2;

}

//phát âm từ tiếng anh else

{ (adsbygoogle = window.adsbygoogle || []).push({});

tts.speak(speaktext, TextToSpeech.QUEUE_FLUSH, null);

change=1;

Toast.makeText(BabyPaintMainActivity.this,mean , Toast.LENGTH_SHORT).show();

} } }

Gọi lại phương thức trên đối với nút chức năng tương ứng : <ImageButton

android:id="@+id/bt_speak"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:onClick="Speak"/>

/>

Đối với dialog phát âm, cách thức xây dựng cũng tương tự như chắc năng chọn màu, chọn nét vẽ… .Chỉ khác về giao diện. Việc phát âm thực hiện tương tự như các bước trên

Một phần của tài liệu ứng dụng tô màu cho bé (Trang 58 - 64)