Android custom toast and androidtoast
After a long time, I suddenly wanted to write a blog post .. Haha ......
Okay, let's talk about things...
When developing Android applications, we usually use toast to pop up the prompt message, which is simple and efficient. However, the positions and styles displayed by toast on different mobile phones may be different, and the built-in toast style of the system may be ugly (I personally think ...), so how to customize a customized toast prompt box... Today, I will share my own custom toast. For more information about the shortcomings, see. (Later)
1. Because of toast features, we define toast as the singleton mode.
Private static ZToast instance; // private View mToastView of a single instance; // custom toast view private TextView mTextView; private Boolean mIsShow; // whether the record status is private Timer mTimer; // timer public synchronized static ZToast getInstance (Context context) {if (instance = null) instance = new ZToast (context); return instance;} private ZToast (Context context) {mIsShow = false; // record whether the current Toast content is displayed. // initialize toast view mToastView = LayoutInflater here. from (context ). inflate (R. layout. common_toast, null); // The text mTextView = (TextView) mToastView to be prompted. findViewById (R. id. toast_text); // initialize the counter mTimer = new Timer (); // set the layout parameter setParams ();}
2. Set the layout style:
Private LayoutParams mParams; private void setParams () {mParams = new WindowManager. layoutParams (); // initialize mParams. height = WindowManager. layoutParams. WRAP_CONTENT; // high mParams. width = WindowManager. layoutParams. WRAP_CONTENT; // wide mParams. format = PixelFormat. TRANSLUCENT; mParams. windowAnimations = R. style. custom_animation_toast; // set to exit the animation mParams. type = WindowManager. layoutParams. TYPE_TOAST; mParams. flags = WindowManager. layoutParams. FLAG_KEEP_SCREEN_ON | WindowManager. layoutParams. FLAG_NOT_FOCUSABLE | WindowManager. layoutParams. FLAG_NOT_TOUCHABLE; mParams. gravity = Gravity. BOTTOM; // The method mParams. y = 45; // bottom spacing}
3. Customize the effect of the toast Pop-up style animation. Toast_styles.xml
<?xml version="1.0" encoding="utf-8"?><resources> <style name="custom.animation.toast" parent="@android:style/Animation.Toast"> <item name="android:windowEnterAnimation">@anim/toast_enter</item> <item name="android:windowExitAnimation">@anim/toast_exit</item> </style></resources>
toast_enter.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="1" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="0" android:toYDelta="85" /> <translate android:duration="350" android:fillAfter="true" android:fromXDelta="0" android:fromYDelta="0" android:interpolator="@interpolator/accelerate_quad" android:toXDelta="0" android:toYDelta="-105" /> <alpha android:duration="100" android:fromAlpha="0" android:toAlpha="1" /> <translate android:duration="80" android:fillAfter="true" android:fromXDelta="0" android:fromYDelta="0" android:startOffset="350" android:toXDelta="0" android:toYDelta="20" /></set>
toast_exit.xml
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" > <translate android:duration="500" android:fromYDelta="0" android:interpolator="@interpolator/accelerate_quad" android:toYDelta="50%p" /> <alpha android:duration="500" android:fromAlpha="1.0" android:toAlpha="0.0" /></set>
4. common_toast.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/bg_common_toast" android:orientation="horizontal" > <TextView android:id="@+id/toast_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="left|center" android:textColor="@android:color/black" android:textSize="@dimen/toast_font_size" /></LinearLayout>
In this way, a custom view container with animation effect is obtained. Then, how can we call it? Don't worry. We need to write another method ..
Public void show (String text, int mShowTime) {if (mIsShow) {// if Toast is already displayed, hide if (ManageApp. mWdm! = Null & mToastView! = Null) ManageApp. mWdm. removeView (mToastView); // cancel the timer if (mTimer! = Null) {mTimer. cancel (); mTimer = new Timer () ;}// you can specify mTextView. setText (text); // set the display status mIsShow = true; // load it to ManageApp on windowManager. mWdm. addView (mToastView, mParams); // sets the timer mTimer. schedule (new TimerTask () {@ Override public void run () {ManageApp. mWdm. removeView (mToastView); mIsShow = false ;}}, (long) (mShowTime = Toast. LENGTH_LONG? (2200: 1200 ));}
Will you ask if mWdm is a magic horse? In fact, it is WindowManager (public static WindowManager mWdm;). You still need to use it to display the view on the screen. We define it in the Application class of the program, and initialize mWdm = (WindowManager) getSystemService (Context. WINDOW_SERVICE); in this way, we can ensure that his life cycle is longer than our activity, so that no exception is reported when the timer is executed. (If there are other better methods, please let us know .)
If you want to upload a gif image, you will find that the gif animation effect will not be done .... Forget it ..