Android特效专辑(三)——自定义不一样的Toast

  1. 大家都知道,Android的控件有时候很难满足我们的需求,所以我们需要自定义View。自定义的方式很多,有继承原生控件也有直接自定义View的,今天写的是自定义的Toast,当然,这个不是复写Toast,是换一种表达形式,哈哈,后续会增加自定义View的方方面面

这里啰嗦几句,我看到网上很多教程写的很不详细,就像是直接CV过来的一样,所以有时间我就会把我需要的东西写起来,然后尽可能的描述的清楚一点,以后我工作用到了就可以直接拿来用了,同时也可以把有用的星系分享给大家,这就是我写博客 的初衷了,经常去墙外面找的好例子,我也是摸透了才放在我博客上,如果以后有疑问或者不懂的,可以加我QQ沟通

  1. 先来看看效果图吧
  1. 是不是挺好看的,如果你看过Toast的源码就会知道,他主要是用了WindowManager,我们也直接来写一个

TabToast

  1. package com.lgl.toast;
  2. import android.content.Context;
  3. import android.text.TextUtils;
  4. import android.util.DisplayMetrics;
  5. import android.view.Gravity;
  6. import android.view.View;
  7. import android.view.ViewGroup;
  8. import android.view.WindowManager;
  9. import android.widget.LinearLayout;
  10. import android.widget.TextView;
  11. import android.widget.Toast;
  12. public class TabToast {
  13. /**
  14. * Toast字体大小
  15. */
  16. private static final float DEFAULT_TEXT_SIZE = 14;
  17. /**
  18. * Toast字体颜色
  19. */
  20. private static final int DEFAULT_TEXT_COLOR = 0xffffffff;
  21. /**
  22. * Toast背景颜色
  23. */
  24. private static final int DEFAULT_BG_COLOR = 0xE6f5695a;
  25. /**
  26. * Toast的高度(单位dp)
  27. */
  28. private static final float DEFAULT_TOAST_HEIGHT = 50.0f;
  29. private static Context mContext;
  30. private volatile static TabToast mInstance;
  31. private static Toast mToast;
  32. private View layout;
  33. private TextView tv;
  34. public TabToast(Context context) {
  35. mContext = context;
  36. }
  37. /**
  38. * 单例模式
  39. *
  40. * @param context
  41. * 传入的上下文
  42. * @return TabToast实例
  43. */
  44. private static TabToast getInstance(Context context) {
  45. if (mInstance == null) {
  46. synchronized (TabToast.class) {
  47. if (mInstance == null) {
  48. mInstance = new TabToast(context.getApplicationContext());
  49. }
  50. }
  51. }
  52. return mInstance;
  53. }
  54. private static void getToast(int duration) {
  55. //设置位置int gravity, int xOffset, int yOffset
  56. if (mToast == null) {
  57. mToast = new Toast(mContext);
  58. mToast.setGravity(Gravity.BOTTOM, 0, 0);
  59. //设置显示时间
  60. mToast.setDuration(duration == Toast.LENGTH_LONG ? Toast.LENGTH_LONG
  61. : Toast.LENGTH_SHORT);
  62. }
  63. }
  64. public static void makeText(Context context, String text) {
  65. makeText(context, text, Toast.LENGTH_SHORT);
  66. }
  67. public static void makeText(Context context, String text, int duration) {
  68. getInstance(context);
  69. getToast(duration);
  70. if (mInstance.layout == null || mInstance.tv == null) {
  71. LinearLayout container = new LinearLayout(mContext);
  72. LinearLayout.LayoutParams rootParams = new LinearLayout.LayoutParams(
  73. LinearLayout.LayoutParams.MATCH_PARENT,
  74. ViewGroup.LayoutParams.WRAP_CONTENT);
  75. container.setLayoutParams(rootParams);
  76. container.setBackgroundColor(DEFAULT_BG_COLOR);
  77. container.setGravity(Gravity.CENTER);
  78. mInstance.tv = new TextView(mContext);
  79. LinearLayout.LayoutParams tvParams = new LinearLayout.LayoutParams(
  80. getScreenWidth(mContext), dp2px(DEFAULT_TOAST_HEIGHT));
  81. mInstance.tv.setLayoutParams(tvParams);
  82. mInstance.tv.setPadding(dp2px(5), dp2px(2), dp2px(5), dp2px(2));
  83. mInstance.tv.setGravity(Gravity.CENTER);
  84. mInstance.tv.setTextColor(DEFAULT_TEXT_COLOR);
  85. mInstance.tv.setMaxLines(2);
  86. mInstance.tv.setEllipsize(TextUtils.TruncateAt.END);
  87. mInstance.tv.setBackgroundColor(DEFAULT_BG_COLOR);
  88. mInstance.tv.setTextSize(DEFAULT_TEXT_SIZE);
  89. container.addView(mInstance.tv);
  90. mInstance.layout = container;
  91. mToast.setView(mInstance.layout);
  92. }
  93. mInstance.tv.setText(text);
  94. mToast.show();
  95. }
  96. /**
  97. * dp转px
  98. *
  99. * @param value
  100. * dp
  101. * @return px
  102. */
  103. public static int dp2px(float value) {
  104. float scale = mContext.getResources().getDisplayMetrics().density;
  105. return (int) (value * scale + 0.5f);
  106. }
  107. /**
  108. * 获得屏幕宽度
  109. *
  110. * @param context
  111. * Context
  112. * @return px
  113. */
  114. public static int getScreenWidth(Context context) {
  115. WindowManager wm = (WindowManager) context
  116. .getSystemService(Context.WINDOW_SERVICE);
  117. DisplayMetrics outMetrics = new DisplayMetrics();
  118. wm.getDefaultDisplay().getMetrics(outMetrics);
  119. float density = outMetrics.density;
  120. return (int) (outMetrics.widthPixels * density);
  121. }
  122. }
  1. 然后直接调用就可以了
  1. TabToast.makeText(MainActivity.this, "自定义Toast");

Demo下载地址:http://download.csdn.net/detail/qq_26787115/9391760