您好,登錄后才能下訂單哦!
Android中怎么利用Application級別自定義Toast?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
首先申明這是基于WindowManager產生的view,本人看了系統級toast的源碼好像也是基于WindowManager的。WindowManager是個神奇的東西,在這就不多做介紹了,我們只需要知道activity.getWindowManager().addView(layout, params)可以給整個Activity界面添加一個view層,這一層可以不影響activity的操作。竟然有這個功能瞬間漲姿勢了有不有!細心人的應該察覺到了這和FrameLayout挺像,其實Activity的root就是一個FrameLayout。
好了,既然Activity有這個功能,那tosat做起來就有頭緒了。
先實現java類代碼(個人愛好,喜歡先主后次):
/** * App級toast */ public class AppToast { private Activity activity; private ViewGroup layout; private ViewGroup content; private TextView textView; private Animation startAnimation; private Animation centerAnimation; private Animation endAnimation; private DelayTask task; private boolean isShow; private LayoutParams params; /** * APP級別Toast */ public AppToast(Activity activity) { this.activity = activity; layout = (ViewGroup) LayoutInflater.from(activity).inflate(R.layout.toast, null); content = (ViewGroup) layout.getChildAt(0); textView = (TextView) content.getChildAt(0); params = new LayoutParams(); params.height = LayoutParams.WRAP_CONTENT; params.width = LayoutParams.MATCH_PARENT; params.gravity = Gravity.TOP; params.type = LayoutParams.TYPE_APPLICATION; params.format = PixelFormat.TRANSLUCENT; params.flags = LayoutParams.FLAG_KEEP_SCREEN_ON | LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE; activity.getWindowManager().addView(layout, params); layout.setVisibility(View.GONE); // 開始動畫 startAnimation = new AlphaAnimation(0, 1); startAnimation.setDuration(500); // 中間動畫 centerAnimation = new AlphaAnimation(0.92f, 1); centerAnimation.setDuration(500); // 結束動畫 endAnimation = new AlphaAnimation(1, 0); endAnimation.setDuration(500); endAnimation.setInterpolator(new AccelerateInterpolator()); // 結束動畫監聽 endAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { layout.setVisibility(View.GONE); } @Override public void onAnimationRepeat(Animation animation) { } }); } /** * 顯示Toast */ public void show(String s) { show(s, 1500); } /** * 顯示Toast */ public void show(String s, int delay) { textView.setText(s); start(); if (task != null) { task.stop(); } task = new DelayTask(delay) { @Override public void logic() { end(); } }; task.start(); } /** * 開始 */ private void start() { if (!isShow) { layout.setVisibility(View.VISIBLE); content.startAnimation(startAnimation); isShow = true; } else { content.startAnimation(centerAnimation); } } /** * 結束 */ private void end() { content.startAnimation(endAnimation); isShow = false; } }
先在構造方法AppToast(Activity activity)中加載自定義toast的布局以及初始化params參數。然后添加各個過程所需的動畫。這其中有個重點,就是params.type = LayoutParams.TYPE_APPLICATION,記住一定要是TYPE_APPLICATION,而不是TYPE_TOAST,TYPE_TOAST會在Android 7上被莫名其妙的限制。
有些人可能會注意到除了開始動畫和結束動畫,為什么還有個中間動畫?其實這是為了多重toast提示做的一個辨別機制,我們在用系統級toast的時候有些人應該能感受到toast并不是重疊顯示,但也不是直接替換內容,而是在替換內容的時候微微的閃一下表示內容變更了,所以在這里就用了一個中間動畫來執行那“閃一下”的效果。
關于其中用到的一個延時器類DelayTask,這是本人為了方便自行設計的一個工具類,其效果就是延時執行一段UI邏輯,其代碼如下:
/** * 延時器類 * * @author zls * * @version 1.0 * * @time 2015-12-27下午7:52:10 */ public abstract class DelayTask { protected Thread thread; private boolean isRun; /** * 延時器 */ public DelayTask(final long delay) { thread = new Thread() { @Override public void run() { try { sleep(delay); if(isRun) { mHandler.sendEmptyMessage(0); } } catch (Exception e) { } } }; } protected Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { logic(); } }; /** 開始執行 */ public void start() { isRun = true; thread.start(); } /** 停止執行 */ public void stop() { isRun = false; } /** 執行邏輯 */ public abstract void logic(); }
有興趣的朋友可以借鑒下,覺得這么設計不太好的也可以用你們自己設計的延時器來用。
現在上toast的布局代碼:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingTop="5dp" android:paddingLeft="15dp" android:paddingRight="15dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/toast_shape" android:fitsSystemWindows="true" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="20dp" android:gravity="center" android:text="默認提示" android:textColor="#fff" android:textSize="15sp"/> </LinearLayout> </LinearLayout>
測試Activity的代碼:
public class MainActivity extends AppCompatActivity { private AppToast toast; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); toast = new AppToast(this); } public void ok(View v) { toast.show("這是Toast測試!" + Math.random()); } }
看完上述內容,你們掌握Android中怎么利用Application級別自定義Toast的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。