Splash Screen and Custom Button

ဒီနေ့တော့ application တစ်ခုစစတက်ချင်းမှာ application ရဲ့ logo လေးနဲ့ Splash screen လေးတက်လာတာရယ် ကိုယ့်စိတ်ကြိုက် custom button လေးတွေလုပ်တက်အောင် application သေးသေးတစ်ခုလုပ်ကြည့်ကြရအောင်။

Application စစတက်ချင်းမှာ Myanmar Tutorials ဆိုတဲ့ logo လေး splash screen နဲ့ အရင်တက်လာမယ် ပြီးရင် Main Screen ကြီးမှာတော့ heart ပုံစံ Custom button လေးထည့်ထားပါတယ်။ play button ကို click ရင် သီချင်းသံလေး ကြားရပြီး stop button ကို click ရင်တော့ သီချင်းသံလေးရပ်သွားမယ့် application လောက်လေးရေးကြည့်ကြပါမယ်။

ဒီတော့ခါတိုင်းလိုဘဲ New Project ဆိုပြီး Splash နာမည်နဲ့ project တစ်ခုဆောက်လိုက်ပါမယ်။ Activity မှာတော့ SplashScreenActivity နာမည်နဲ့ Activity တစ်ခုစရေးပါမယ်။ splash screen မှာတော့ Myanmar Tutorial logo ပါတဲ့ screen လေးရအောင် xml နဲ့ Interface တစ်ခုပြုလုပ်ဖို့အတွက် layout folder မှာ right click > new > Other > Android > Android XML File ကိုရွေးပါ။

File name မှာ Splash.xml ဆိုပြီး LinearLayout ဘဲထားပြီး Finish လုပ်ပါ။ Splash.xml ဆိုတဲ့ Screen ထဲမှာတော့ Myanmar Tutorial logo လေးနဲ့ Image View လေးတစ်ခုဘဲထည့်ပါ။ Screen ရဲ့ background ကိုတော့ အဖြူရောင်ဘဲထားထားပါတယ်။


အဲ့ဒီနောကမှာတော့ SplashScreenActivity.java မှာအခုလိုရေးထားပါတယ်။ (၁) onCreate() method ထမှာ setContentView() ထဲမှာခုဏက ပြုလုပ်ထားတဲ့ Interface Screen ဖြစ်တဲ့ splash.xml ကိုသတ်မှတ်လိုက်ပါတယ်။ အမှန်တကယ် splash screen ဆိုတာ Screen Activity တစ်ခုကနေတစ်ခုကိုမကူးခင်မှာ အချိန် millisecond အနည်းငယ်အချိန်ဆွဲထားလိုက်တာပါဘဲ။ (၂ နဲ့ ၃) Thread တစ်ခုဖန်တီးပြီး Thread ရဲ့ run ထဲမွာ ကို splash screen ကိုဘယ်လောက်ကြာကြာပြချင်လဲ အဲ့ဒီအချိန်ရောက်ရင်တော့ thread ကို sleep လုပ်လိုက်ပါတယ်။ (၄) အချိန်စောင့်ပြီးလို့ thread က sleep ဖြစ်သွားရင်တော့ ကိုယ်ပြချင်တဲ့ main screen ကို Intent ကနေတဆင့်ကူးပါတယ်။ (၅) Thread ကိုစပြီး start လုပ်ပါတယ်။

နောက်ထပ် MainScreen အတွက် Activity တစ်ခုထပ်ပြီး create လုပ်ပါမယ်။ package မှာ right click > new > class
Class name မှာ MainScreenActivity လို့ပေးပြီး Superclass မှာတော့ Activty ကို extends လုပ်ချင်တာကြောင့် Browse ကနေ android.app.Activity ရွေးပြီး Finish လုပ်ပါ။ အခုအခြေအနေမှာ Activity ကိုအမွေဆက်ခံထားတဲ့ class တစ်ခုရပါပြီ။ parent က method တွေကိုအမွေဆက်ခံဖို့အတွက် MainScreenActivity.java > right Click > Source > Override/Implement Method ကိုရွေးပါ။ onCreate method ကိုအမှန်ခြစ်ရွေးပါ။

MainScreenActivity.java အတွက်အခုလို method လေးထည့်ပေးထားတာတွေ့ရမှာပါ။

အခုဆက်လက်ပြီး MainScreenActiviy အတွက် User Interface ဖြစ်တဲ့ main.xml ကိုဆက်လက်ရှင်းပါမယ်။ main.xml မှာတော့ Button ၂ ခုထည့်ထားပါတယ်။ Screen ရဲ့ background ကိုတော့ drawable resourse ထဲက ပုံကိုထည့်ထားပါတယ်။ ဒီမှာ ပြောချင်တာက Button ပါ။ ပုံမှာပြထားတဲ့ Button တွေက heart ပုံလေးတွေနဲ့ Custom Button ပါ။ Custom Button အတွက် drawable folder အောက်မွာ xml ဖိုင်တစ်ခုရေးရပါမယ်။ ပြီးမှ အဲ့ဒီ xml ဖိုင်ကို background ကနေတဆင့်ပြန်ပြီး reference လုပ်ပေးရပါမယ်။

Custom Button ပြုလုပ်ဖို့အတွက် drawable folder > right click > new > other > Android > Android XML File > Next
File name မှာ custombutton.xml လို့ပေးပါတယ်။ xml အခွံလေးရလာရင် အခုလို selector tag တွေနဲ့ button လေးမှာfocused ဖြစ်ရင်ပြချင်တဲ့ပုံကတစ်မျိုး pressed ဖြစ်ရင်ပြချင်တဲ့ပုံကတစ်မျိုး ရေးသားပါတယ်။


MainScreenActivity.java မှာတော့ button တွေမှာ listener တွေထည့်ထားပြီးသက်ဆိုင်ရာ button ကို click ရင် MediaPlayer object ကနေတဆင့် raw folder အောက်မှာက sleep.mp3 ကို play လုပ်ထားပါတယ်။

Sample Project download ယူရန်

Part1
Part2

Be happy: D
aemon

Facebook comments:

5 Responses

  1. 4tee says:

    Very nice tutorial on custom button and thread. it gives me a new idea on running some processes on thread. thank you.

  2. Super Star says:

    Android program ရေးတာလေးလဲ ကြိုက်တယ် … Splash Screen တင် မကဘူး … လူလေးပါ မြင်ချင်လိုက်တာ …. ဟိ ….

  3. Thi Ha says:

    Thank you! :-)

  4. TH says:

    Hi!

    I would like to ask about a problem with my app.
    I created 2 nos of Android 2.2 virtual devices and 2 nos of 2.3 devices for testing the crypto app.
    After running, results of all 2.2 and result of 2.3 devices are different.
    Please check image: http://postimage.org/image/i11ekk5u7/
    Please let me know how to solve this problem, to get same result for all android versions.

    Below is the code for en/decrypt.
    package com.thiha.CryptBox;
    import java.security.SecureRandom;
    import javax.crypto.Cipher;
    import javax.crypto.KeyGenerator;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    import android.util.Base64;

    public class CryptTools
    {
    private static final String CIPHER_ALGORITHM = “AES”;
    private static final String RANDOM_GENERATOR_ALGORITHM = “SHA1PRNG”;
    private static final int RANDOM_KEY_SIZE = 128;

    public static String encrypt( String password, String data ) throws Exception
    {
    byte[] secretKey = generateKey( password.getBytes(“UTF-8″) );
    byte[] clear = data.getBytes(“UTF-8″);

    SecretKeySpec secretKeySpec = new SecretKeySpec( secretKey, CIPHER_ALGORITHM );
    Cipher cipher = Cipher.getInstance( CIPHER_ALGORITHM );
    cipher.init( Cipher.ENCRYPT_MODE, secretKeySpec );

    byte[] encrypted = cipher.doFinal( clear );
    String encryptedString = Base64.encodeToString( encrypted, Base64.DEFAULT );

    return encryptedString;
    }
    public static String decrypt( String password, String encryptedData ) throws Exception
    {
    byte[] secretKey = generateKey( password.getBytes(“UTF-8″) );

    SecretKeySpec secretKeySpec = new SecretKeySpec( secretKey, CIPHER_ALGORITHM );
    Cipher cipher = Cipher.getInstance( CIPHER_ALGORITHM );
    cipher.init( Cipher.DECRYPT_MODE, secretKeySpec );

    byte[] encrypted = Base64.decode( encryptedData, Base64.DEFAULT );
    byte[] decrypted = cipher.doFinal( encrypted );

    return new String( decrypted );
    }
    public static byte[] generateKey( byte[] seed ) throws Exception
    {
    KeyGenerator keyGenerator = KeyGenerator.getInstance( CIPHER_ALGORITHM );
    SecureRandom secureRandom = SecureRandom.getInstance( RANDOM_GENERATOR_ALGORITHM );
    secureRandom.setSeed( seed );
    keyGenerator.init( RANDOM_KEY_SIZE, secureRandom );
    SecretKey secretKey = keyGenerator.generateKey();
    return secretKey.getEncoded();
    }
    }

    Note – change .getBytes(“UTF-8″) to .getBytes() also can’t solve above problem.
    Thanks in advance.

  5. 4tee says:

    I am wondering if you use the thread with .start(), it might violate single-threaded model for UI. In another word, the example above is not thread-safe.

    If you are just delaying UI before next action, you may consider “Handler” instead.

Leave a comment


*