Wednesday, October 4, 2017

Làm đèn nhấp nháy trong Android

Bạn muốn ứng dụng có dãy đèn nhấp nháy để trang trí, nhìn cho vui mắt, ta sẽ làm thế nào ?
Hãy chuẩn bị các ảnh màu hình tròn giống hệt nhau, chỉ khác nhau màu sắc ở giữa.
Tạo một LinearLayout với các ảnh nằm ngang một dãy như sau.

  <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="5dp" >
    <ImageView
        android:id="@+id/img1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_gravity="center_horizontal"
        android:contentDescription="@null"
        />
     <ImageView
        android:id="@+id/img2"
        android:layout_width="50dp"
         android:layout_height="50dp"
        android:layout_gravity="center_horizontal"
        android:contentDescription="@null"
       />
      <ImageView
        android:id="@+id/img3"
        android:layout_width="50dp"
         android:layout_height="50dp"
        android:layout_gravity="center_horizontal"
        android:contentDescription="@null"
       />
       <ImageView
        android:id="@+id/img4"
        android:layout_width="50dp"
         android:layout_height="50dp"
        android:layout_gravity="center_horizontal"
        android:contentDescription="@null"
        />
        <ImageView
        android:id="@+id/img5"
        android:layout_width="50dp"
         android:layout_height="50dp"
        android:layout_gravity="center_horizontal"
        android:contentDescription="@null"
        />
 </LinearLayout>
Các ảnh có kích thước y như nhau, chỉ khác màu, khi ta thay đổi chúng sẽ tạo ra hiệu ứng giống như đang nhấp nháy. Chú ý là ta không set sẵn ảnh vào layout, các đoạn code xml không có dòng android:src="@drawable/tên ảnh"
Hãy khai báo một biến đếm ngược CountDownTimer w; lên trên dòng Override để nó là biến toàn cục.
Nhập thư viện cần dùng vào.
Copy đoạn code sau vào dưới các dòng findViewByid.
w=new CountDownTimer(3000000, 1000) {           
     public void onTick(long mil) {                 
      if(mil%3==0){
    im.setBackgroundResource(R.drawable.l1);
     im2.setBackgroundResource(R.drawable.l2);
     im3.setBackgroundResource(R.drawable.l3);
     im4.setBackgroundResource(R.drawable.l1);
     im5.setBackgroundResource(R.drawable.l2);  
      }
      else if(mil%3==1){
      im.setBackgroundResource(R.drawable.l2);
     im2.setBackgroundResource(R.drawable.l3);
     im3.setBackgroundResource(R.drawable.l1);
     im4.setBackgroundResource(R.drawable.l2);
     im5.setBackgroundResource(R.drawable.l3);
          }
          else {
     im.setBackgroundResource(R.drawable.l3);
     im2.setBackgroundResource(R.drawable.l1);
     im3.setBackgroundResource(R.drawable.l2);
     im4.setBackgroundResource(R.drawable.l3);
     im5.setBackgroundResource(R.drawable.l1);
}
   }
public void onFinish() {             
         
      }
}.start();      
ở đây ta dùng biến đếm ngược, cho số thời gian thật lớn CountDownTimer(3000000, 1000)
Số 1000 tức là thời gian đếm ngược tính theo 1 giây.
Bên dưới ta thay đổi ảnh theo thời gian, có ba pha ảnh, cứ 1, 2, 3 giây lại có ảnh thay đổi, ta chia thời gian cho 3 lấy số dư để xác định.
Giả sử có 5 ảnh, ta sẽ chia cho 5, lấy thành 5 pha vào lệnh if.
Trong public void onFinish() ta không làm gì vì ta chỉ để nó nhấp nháy thế thôi, đặt thời gian lớn cho thành hàng giờ, đủ để người dùng đã xong ứng dụng.
Nếu là đếm ngược thời gian trong game, thì khi hết giờ ta set ra thông báo game over, lệnh đó sẽ ở trong onFinish().
Ở đây ta chỉ lợi dụng sự thay đổi thời gian để thay đổi ảnh, tạo ra hiệu ứng trang trí.
Để khi người dùng ấn nút Back thì hủy đi tất cả, ta thêm các dòng sau vào trên ngoặc đóng cuối cùng.
public void onBackPressed()
{        
w.cancel();
finish();

}    

No comments:

Post a Comment