編輯:關於Android編程
Android系統裡面有個東西很好用,也很常用,那就是Toast,但是長期使用也會發現,Toast有他的不足之處:形式單一,只有文字,風格不變等等,那麼要如何自定義一個Toast呢,我們可以先從分析Android定義Toast的代碼著手:
Toast的makeText方法:
這裡實際上Android所做的工作是將Toast顯示的文本和持續時間設置了一下,然後返回了Toast對象,用以執行show()方法。這裡核心的地方是要弄明白
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+1eLSu77kQW5kcm9pZNf2wcvSu9CpyrLDtLmk1/ejrM/Cw+bO0sPHvMzQ+L+0o7o8L3A+CjxwPjxicj4KPC9wPgo8cD48aW1nIHNyYz0="/uploadfile/Collfiles/20140921/20140921094339157.png" alt="\">
這裡實際上是new 了一個TN()對象,然後對TN對象設置了一些關於位置和偏移的參數。那麼那個TN是何方神聖呢?我們可以繼續往下看:
我們可以發現,TN的構造函數裡面執行了一個handleShow的方法
我們可以發現handleshow這個方法執行了一大堆的語句,但是實際上我們需要重點關注的只有一句,也就是上面選中的一句:mWM.addView(mView,mParams);
實際上這個mWM是一個WindowManager,mView是要顯示的組件的view,而mParams應該是參數的設置一類,但是具體是何方神聖呢?我們可以在Toast類中找到一個成員變量:
我們發現mParams實際上是WindowManager的一個布局參數。但是如果單從handleShow方法來看mParams的設置感覺還是太亂,我們可以在Toast中找到下面這一段:
在這裡我們可以比較清楚看到mParams的一部分主要參數設置,其中包含了長寬都是wrap_content,然後是半透明的(TransLucent),然後還設置了一個動畫效果(Animation_Toast),和一個標題(setTitle("Toast"))最後設置了Toast一些標識比如讓屏幕亮起,不可觸摸,不可獲取焦點等。
到這裡,我們基本上清楚了Toast是如何顯示出來的,核心的在於使用一個WindowManager的addView方法,將要顯示的view和參數mParams傳進來,但是在此之前還需要設置mParams的一些參數;
那麼這裡是顯示,Toast是如何讓顯示消失的呢?我們可以在handleShow方法下面找到一個handHide的方法:
同樣核心語句也是選中的一句,mWM.removeView(mView),這樣就讓Toast消失掉了
那麼有了上面的一些分析,我們不難寫出我們自己的Toast類,裡面提供一些靜態方法,讓我們來自己定義Toast的顯示風格和顯示內容,也可以控制Toast的顯示開始和結束的時機。
下面的自定義Toast類,提供了幾種形式的show方法,可以像傳統Toast一樣,傳入文本來顯示一個testview,也可以完全自己定義傳入view對象和mParams參數,這樣可以定義出了一個完全自己定義的Toast
package com.alexchen.mobilesafeexercise.ui; import android.content.Context; import android.graphics.PixelFormat; import android.view.View; import android.view.WindowManager; import android.widget.TextView; import android.widget.Toast; /** * 自定義吐司 * * @author Alex * */ public class MyToast { /** * 窗體管理者 */ private static WindowManager wm; private static WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); private static View mView; private static TextView tv; /** * 顯示自定義吐司 * * @param info * @param context */ public static void show(String message, Context context) { wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); tv = new TextView(context); tv.setText(message); tv.setTextSize(20); // 原來TN所做的工作 WindowManager.LayoutParams params = mParams; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; params.format = PixelFormat.TRANSLUCENT; params.type = WindowManager.LayoutParams.TYPE_TOAST; params.setTitle("Toast"); params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; wm.addView(tv, params); } /** * 自定義文本吐司的顯示方法,這個方法提供了更多自定義的內容,比如textview可以應用一個傳入的style的id * * @param message * @param context * @param textViewResid * @param params */ public static void show(String message, Context context, int textViewResid, WindowManager.LayoutParams params) { wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); tv = new TextView(context); // 多加了一個風格 tv.setTextAppearance(context, textViewResid); // 原來TN所做的工作 // WindowManager.LayoutParams params = mParams; // params.height = WindowManager.LayoutParams.WRAP_CONTENT; // params.width = WindowManager.LayoutParams.WRAP_CONTENT; // params.format = PixelFormat.TRANSLUCENT; // params.type = WindowManager.LayoutParams.TYPE_TOAST; // params.setTitle("Toast"); // params.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON // | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE // | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; wm.addView(tv, params); } /** * 更多自定義的形式,可以直接傳入任一個自己定義好的view,自己設置wm的參數 * * @param view * @param context * @param params * WindowManager.LayoutParams類型的參數, WindowManager.LayoutParams * mParams = new WindowManager.LayoutParams(); params.height = * WindowManager.LayoutParams.WRAP_CONTENT; params.width = * WindowManager.LayoutParams.WRAP_CONTENT; params.format = * PixelFormat.TRANSLUCENT; params.type = * WindowManager.LayoutParams.TYPE_TOAST; * params.setTitle("Toast"); params.flags = * WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | * WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | * WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; */ public static void show(View view, Context context, WindowManager.LayoutParams params) { wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); MyToast.mView = view; wm.addView(mView, params); } /** * 隱藏自定義吐司 這裡一定要記得判空一下,因為平時沒有打電話時,這兩個量應該都是空的 */ public static void hide() { if (wm != null) { if (tv != null) { wm.removeView(tv); tv = null; } if (mView != null) { wm.removeView(mView); mView = null; } if (tv == null && mView == null) { wm = null; } } } }
一、概述本文之前,先提一下關於上篇博文的100多萬訪問量請無視,博文被刷,我也很郁悶,本來想把那個文章放到草稿箱,結果放不進去,還把日期弄更新了,實屬無奈。
目錄Opencv的開發環境搭建過程...一、下載並安裝jdk環境...二、下載並安裝Android Studio.三、下載Android SDK.四、下載ndk.五、下載
先看下效果 1.首頁package com.yskj.jh.demopopupwindow;import android.content.Context;import a
一、開發背景:我目前在做的是一個3年左右的老項目,項目開始的時候okhttp還不像現在這麼火,基本上使用HttpURLConnection類來實現所有的HTTP請求,當時