# Android特效專輯(三)——自定義不一樣的Toast
~~~
大家都知道,Android的控件有時候很難滿足我們的需求,所以我們需要自定義View。自定義的方式很多,有繼承原生控件也有直接自定義View的,今天寫的是自定義的Toast,當然,這個不是復寫Toast,是換一種表達形式,哈哈,后續會增加自定義View的方方面面
~~~
> 這里啰嗦幾句,我看到網上很多教程寫的很不詳細,就像是直接CV過來的一樣,所以有時間我就會把我需要的東西寫起來,然后盡可能的描述的清楚一點,以后我工作用到了就可以直接拿來用了,同時也可以把有用的星系分享給大家,這就是我寫博客 的初衷了,經常去墻外面找的好例子,我也是摸透了才放在我博客上,如果以后有疑問或者不懂的,可以加我QQ溝通
~~~
先來看看效果圖吧
~~~

~~~
是不是挺好看的,如果你看過Toast的源碼就會知道,他主要是用了WindowManager,我們也直接來寫一個
~~~
### TabToast
~~~
package com.lgl.toast;
import android.content.Context;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class TabToast {
/**
* Toast字體大小
*/
private static final float DEFAULT_TEXT_SIZE = 14;
/**
* Toast字體顏色
*/
private static final int DEFAULT_TEXT_COLOR = 0xffffffff;
/**
* Toast背景顏色
*/
private static final int DEFAULT_BG_COLOR = 0xE6f5695a;
/**
* Toast的高度(單位dp)
*/
private static final float DEFAULT_TOAST_HEIGHT = 50.0f;
private static Context mContext;
private volatile static TabToast mInstance;
private static Toast mToast;
private View layout;
private TextView tv;
public TabToast(Context context) {
mContext = context;
}
/**
* 單例模式
*
* @param context
* 傳入的上下文
* @return TabToast實例
*/
private static TabToast getInstance(Context context) {
if (mInstance == null) {
synchronized (TabToast.class) {
if (mInstance == null) {
mInstance = new TabToast(context.getApplicationContext());
}
}
}
return mInstance;
}
private static void getToast(int duration) {
//設置位置int gravity, int xOffset, int yOffset
if (mToast == null) {
mToast = new Toast(mContext);
mToast.setGravity(Gravity.BOTTOM, 0, 0);
//設置顯示時間
mToast.setDuration(duration == Toast.LENGTH_LONG ? Toast.LENGTH_LONG
: Toast.LENGTH_SHORT);
}
}
public static void makeText(Context context, String text) {
makeText(context, text, Toast.LENGTH_SHORT);
}
public static void makeText(Context context, String text, int duration) {
getInstance(context);
getToast(duration);
if (mInstance.layout == null || mInstance.tv == null) {
LinearLayout container = new LinearLayout(mContext);
LinearLayout.LayoutParams rootParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
container.setLayoutParams(rootParams);
container.setBackgroundColor(DEFAULT_BG_COLOR);
container.setGravity(Gravity.CENTER);
mInstance.tv = new TextView(mContext);
LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(
getScreenWidth(mContext), dp2px(DEFAULT_TOAST_HEIGHT));
mInstance.tv.setLayoutParams(tvParams);
mInstance.tv.setPadding(dp2px(5), dp2px(2), dp2px(5), dp2px(2));
mInstance.tv.setGravity(Gravity.CENTER);
mInstance.tv.setTextColor(DEFAULT_TEXT_COLOR);
mInstance.tv.setMaxLines(2);
mInstance.tv.setEllipsize(TextUtils.TruncateAt.END);
mInstance.tv.setBackgroundColor(DEFAULT_BG_COLOR);
mInstance.tv.setTextSize(DEFAULT_TEXT_SIZE);
container.addView(mInstance.tv);
mInstance.layout = container;
mToast.setView(mInstance.layout);
}
mInstance.tv.setText(text);
mToast.show();
}
/**
* dp轉px
*
* @param value
* dp
* @return px
*/
public static int dp2px(float value) {
float scale = mContext.getResources().getDisplayMetrics().density;
return (int) (value * scale + 0.5f);
}
/**
* 獲得屏幕寬度
*
* @param context
* Context
* @return px
*/
public static int getScreenWidth(Context context) {
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
float density = outMetrics.density;
return (int) (outMetrics.widthPixels * density);
}
}
~~~
~~~
然后直接調用就可以了
~~~
~~~
TabToast.makeText(MainActivity.this, "自定義Toast");
~~~
### Demo下載地址:[http://download.csdn.net/detail/qq_26787115/9391760](http://download.csdn.net/detail/qq_26787115/9391760)
- 前言
- (一)——水波紋過渡特效(首頁)
- (二)——ViewPager渲染背景顏色漸變(引導頁)
- (三)——自定義不一樣的Toast
- (四)——APP主頁框架TabHost綁定ViewPager的替換者TabLayout
- (五)——自定義圓形頭像和仿MIUI卸載動畫—粒子爆炸
- (六)——仿QQ聊天撒花特效,無形裝逼,最為致命
- (七)——飛機升空特效,一鍵清理緩存,靈活運用動畫會有不一樣的感受
- (八)——實現心型起泡飛舞的特效,讓你的APP瞬間暖心
- (九)——仿微信雷達搜索好友特效,邏輯清晰實現簡單
- (十)——點擊水波紋效果實現,邏輯清晰實現簡單
- (十一)——仿水波紋流量球進度條控制器,實現高端大氣的主流特效
- (十二)——仿支付寶咻一咻功能實現波紋擴散特效,精細小巧的View