編輯:關於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;
}
}
}
}
Android TagFlowLayout完全解析 一款針對Tag的布局
一、概述本文之前,先提一下關於上篇博文的100多萬訪問量請無視,博文被刷,我也很郁悶,本來想把那個文章放到草稿箱,結果放不進去,還把日期弄更新了,實屬無奈。
Android Studio中Opencv的開發環境搭建過程
目錄Opencv的開發環境搭建過程...一、下載並安裝jdk環境...二、下載並安裝Android Studio.三、下載Android SDK.四、下載ndk.五、下載
Android popupwindow簡單使用方法介紹
先看下效果 1.首頁package com.yskj.jh.demopopupwindow;import android.content.Context;import a
Android Okhttp3+Retrofit2網絡加載效率優化
一、開發背景:我目前在做的是一個3年左右的老項目,項目開始的時候okhttp還不像現在這麼火,基本上使用HttpURLConnection類來實現所有的HTTP請求,當時