Wednesday, October 4, 2017

Giả tiếng ngáy

Để đọc file nhạc mp3, ta sẽ làm một ứng dụng nhỏ vui vui. Đó là ứng dụng giả tiếng ngáy, trẻ em rất thích ứng dụng kiểu này.
Tạo một project có tên bất kỳ, copy  hai dòng sau thêm vào khai báo class Main trong AndroidManifest.xml.
android:screenOrientation="portrait"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

Ta để màn hình full kín, để chiều màn hình là dọc.
Tạo thư mục drawable dưới res, copy các icon vào đó. Tạo thêm một thư mục tên raw, để 3 file âm thanh mp3 là một đoạn tiếng ngáy. Bạn có thể vào trang http://www.freesound.org/ để tải đủ thứ tiếng động miễn phí về.

Trong file activity_main tạo một Scroll layout cuộn được, gồm có một ảnh trang trí, một ảnh chữ tiêu đề và ba hàng nút bấm.
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:gravity="center_horizontal"
        android:orientation="vertical" >

        <ImageView
            android:id="@+id/imgPicture2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@null"
            android:src="@drawable/nn" />

        <ImageView
            android:id="@+id/imgPicturem"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@null"
            android:src="@drawable/cb" />

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dp" >

            <TextView
                android:id="@+id/t0"
                android:layout_width="100dp"
                android:layout_height="50dp"
                android:background="@drawable/bb"
                android:clickable="true"
                android:gravity="center"
                android:onClick="onClick"
                android:text="SNORE"
                android:textColor="#0000cd"
                android:textSize="26sp" />

            <TextView
                android:id="@+id/t"
                android:layout_width="100dp"
                android:layout_height="50dp"
                android:layout_marginLeft="50dp"
                android:background="@drawable/bc"
                android:clickable="true"
                android:gravity="center"
                android:onClick="onClick2"
                android:text="PAUSE"
                android:textColor="#c90016"
                android:textSize="26sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dp" >

            <TextView
                android:layout_width="100dp"
                android:layout_height="50dp"
                android:background="@drawable/bb"
                android:clickable="true"
                android:gravity="center"
                android:onClick="onClick3"
                android:text="SNORE"
                android:textColor="#0000cd"
                android:textSize="26sp" />

            <TextView
                android:layout_width="100dp"
                android:layout_height="50dp"
                android:layout_marginLeft="50dp"
                android:background="@drawable/bc"
                android:clickable="true"
                android:gravity="center"
                android:onClick="onClick4"
                android:text="PAUSE"
                android:textColor="#c90016"
                android:textSize="26sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="10dp" >

            <TextView
                android:layout_width="100dp"
                android:layout_height="50dp"
                android:background="@drawable/bb"
                android:clickable="true"
                android:gravity="center"
                android:onClick="onClick5"
                android:text="SNORE"
                android:textColor="#0000cd"
                android:textSize="26sp" />

            <TextView
                android:layout_width="100dp"
                android:layout_height="50dp"
                android:layout_marginLeft="50dp"
                android:background="@drawable/bc"
                android:clickable="true"
                android:gravity="center"
                android:onClick="onClick6"
                android:text="PAUSE"
                android:textColor="#c90016"
                android:textSize="26sp" />
        </LinearLayout>     
    </LinearLayout>
</ScrollView>

Đảm bảo các icon của bạn đúng tên, chạy thử sẽ ra màn hình như sau.
Bây giờ quay vào class Main, ta không dùng nút bấm mà dùng textView rồi set nó click được, rồi dùng hàm onClick để điều khiển.
Dùng kiểu này có lợi là không cần khai báo textView trong code nữa, chỉ có mỗi hàm click thôi.
Khai báo ba biến đếm cho nút Snore và 3 biến dùng để điều khiển nút Pause, cùng 3 biến để play nhạc.
int dem=0;
int dem2=0;
int dem3=0;
int po=0;
int po2=0;
int po3=0;
MediaPlayer mp = new MediaPlayer();
MediaPlayer mp2 = new MediaPlayer();
MediaPlayer mp3 = new MediaPlayer();
Nhập các thư viện cần dùng vào.
Ở đây chú ý là ta có thể khởi tạo các biến dưới dòng setContentView. Tuy nhiên khi đang phát lại stop hay pause thì lúc bật lại nó hay bị tịt, không chơi lại được nữa.
Giải pháp là ta khởi tạo trong nút Snore để đảm bảo nó sẽ play lại sau khi stop.
Hàm điều khiển nút Snore đầu tiên, copy lên trên ngoặc đóng cuối cùng.
public void onClick(View v) {
          dem=1;
          mp = MediaPlayer.create(this, R.raw.ab);
          mp.setLooping(true);
          mp.start();       
          po=0;
          if(mp2 != null||mp3 != null) {       
          mp2.pause();
          mp3.pause();                     
        }
      } 
Ta tạo biến đếm để biết là đang play, sẽ dùng nó bên nút Pause, bật nhạc và set để po=0 tức không phải đang chờ. Ta để các file lặp lại luôn tức chỉ cần file nhạc 5-7 giây nhưng ta lặp lại là thành tiếng ngáy dài.
Đồng thời để cùng lúc không có hơn 1 file nhạc phát thì ta stop hoặc pause tất cả các file khác.
Bây giờ sang nút Pause đầu tiên.
public void onClick2(View v) {
po=po+1;
if(dem==1){
if(po%2==0){
mp.start();
}
else{             
mp.pause();            
}
}
Ta cộng po lên rồi chia chẵn lẻ để nếu người dùng ấn một lần thì dừng, hai lần lại bật, cứ như vậy.
Dùng biến đếm bên nút Snore =1 tức là nếu đang phát thì mới Pause.
Các nút sau tương tự.
public void onClick3(View v) {
          dem2=1;
          mp2 = MediaPlayer.create(this, R.raw.ac);
          mp2.setLooping(true);
          mp2.start();      
          po2=0;
          if(mp != null||mp3 != null) {        
          mp.pause();
          mp3.pause();           
        }
      } 
     public void onClick4(View v) {
          po2=po2+1;
          if(dem2==1){
          if(po2%2==0){
              mp2.start();
          }
          else{             
              mp2.pause();           
          }
      } 
     }
     public void onClick5(View v) {
          dem3=1;
          mp3 = MediaPlayer.create(this, R.raw.a);
          mp3.setLooping(true);
          mp3.start();      
          po3=0;
          if(mp != null||mp2 != null) {       
          mp.pause();
          mp2.pause();                     
        }
      } 
     public void onClick6(View v) {
          po3=po3+1;
          if(dem3==1){
          if(po3%2==0){
              mp3.start();
          }
          else{             
              mp3.pause();           
          }
      } 
     }
Copy các dòng sau xuống trên ngoặc đóng cuối cùng.
@Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();      
        if(mp != null||mp2 != null||mp3 != null) {
          mp.stop();
          mp2.stop();
          mp3.stop();       
          finish();
        }
    }
Các dòng này để khi đang chạy mà người dùng thoát app thì âm thanh cũng dừng lại.

Chạy thử để thấy ứng dụng đã hoạt động, ấn các nút để kiểm tra, đang chạy nút này lại ấn nút kia xem có phát bình thường không.


No comments:

Post a Comment