Snackbar使用详解及其相关框架TSnackbar

简述:

    Snackbar 是 Android design support library 中的一个组件,它的作用和Toast类似,显示吐司,但Snackbar的特别之处在于Snackbar显示的提示信息可以和用户交互,更好地获取用户反馈信息。同时,它显示的吐司带有动画效果,从屏幕下方慢慢展开显示。
    Goggle官方这样介绍:“SnackBars提供了一个轻量级的反馈操作。他们在屏幕的底部显示一条简短的信息,如果是较大的设备就显示在左下角。SnackBar出现在屏幕中所有其他元素的上方,同一时间仅仅只有一条SnackBar”。总之,SnackBar的特点大致下面几条:

        ①与Toast一样可以进行吐司信息;

        ②可以与用户交互操作;

        ③一个时刻只能有唯一一个 Snackbar 显示。

    我们先来感受一下它的强大吧,请看效果图:

                                            Snackbar使用详解及其相关框架TSnackbar

基本使用方法

1、简单使用

                                             Snackbar使用详解及其相关框架TSnackbar

    上面的效果图代码实现:


    
  1. import android.support.design.widget.Snackbar;
  2. import android.support.v7.app.AppCompatActivity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.Button;
  7. public class MainActivity extends AppCompatActivity {
  8. private Button btn_show;
  9. private ViewGroup frameLayout;
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. initViews();
  15. }
  16. private void initViews() {
  17. frameLayout = (ViewGroup) findViewById(android.R.id.content);
  18. btn_show = (Button) findViewById(R.id.btn_show);
  19. btn_show.setOnClickListener(new View.OnClickListener() {
  20. @Override
  21. public void onClick(View view) {
  22. Snackbar.make(view,"Hello SnackBar!",Snackbar.LENGTH_SHORT).show();
  23. }
  24. });
  25. }
  26. }
    其实使用的核心代码就一句:

Snackbar.make(view,"Hello SnackBar!",Snackbar.LENGTH_SHORT).show();
    
    使用起来类似于Toast,但也有与Toast的不同之处,Toast的使用:

Toast.makeText(MainActivity.this, "真的能够交互", Toast.LENGTH_SHORT).show();
    
    他们的第一个参数不同,Toast第一个参数是Context,而Snackbar第一个参数为View,这个View就是Toast的父布局。与Toast不同的是Snackbar显示时长有三种:

      ①Snackbar.LENGTH_SHORT:与Toast.LENGHT_SHORT(大约1.x秒)一样显示较短时长后自动消失。

      ②Snackbar.LENGTH_LONG:与Toast.LENGHT_LONG(大约3秒)一样显示相对较长时间后自动消失。

      ③Snackbar.LENGTH_INDEFINITE:永不消失除非手动调用dismiss()方法去除Snackbar。

2、可交互的Snackbar

      刚才已经说过Snackbar比Toast强大,其中有一点就是Snackbar可以用来与用户交互,我们看一下效果:

                                                       Snackbar使用详解及其相关框架TSnackbar

    核心代码:


    
  1. final Snackbar snackbar = Snackbar.make(frameLayout, "Hello SnackBar!", Snackbar.LENGTH_INDEFINITE);
  2. snackbar.setAction("OK?", new View.OnClickListener() {
  3. @Override
  4. public void onClick(View view) {
  5. // snackbar.dismiss();
  6. //doSomething
  7. }
  8. });
  9. snackbar.show();
    setAction(CharSequence text, View.OnClickListener listener)方法为用户交互的点击事件,第一个参数是点击事件的信息,第二个就是一个View.OnClickListener点击监听器。

3、可反馈的Snackbar

     Snackbar可以反馈指的是它可以监听Snackbar的显示与退出(也包括各种退出的类型的监听),来张效果图:

                                                        Snackbar使用详解及其相关框架TSnackbar

    核心代码:


    
  1. final Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "反馈监听的Snackbar", Snackbar.LENGTH_LONG);
  2. snackbar.setAction("能交互吗", new View.OnClickListener() {
  3. @Override
  4. public void onClick(View view) {
  5. Toast.makeText(MainActivity.this, "真的能够交互", Toast.LENGTH_SHORT).show();
  6. }
  7. });
  8. snackbar.setCallback(new Snackbar.Callback() {
  9. @Override
  10. public void onDismissed(Snackbar snackbar, int event) {
  11. super.onDismissed(snackbar, event);
  12. switch (event) {
  13. case Snackbar.Callback.DISMISS_EVENT_ACTION:
  14. Toast.makeText(MainActivity.this, "Snackbar通过Action的点击事件退出", Toast.LENGTH_SHORT).show();
  15. break;
  16. case Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE:
  17. Toast.makeText(MainActivity.this, "Snackbar由于新的Snackbar显示而退出", Toast.LENGTH_SHORT).show();
  18. break;
  19. case Snackbar.Callback.DISMISS_EVENT_MANUAL:
  20. Toast.makeText(MainActivity.this, "Snackbar通过调用dismiss()方法退出", Toast.LENGTH_SHORT).show();
  21. break;
  22. case Snackbar.Callback.DISMISS_EVENT_SWIPE:
  23. Toast.makeText(MainActivity.this, "Snackbar右划退出", Toast.LENGTH_SHORT).show();
  24. break;
  25. case Snackbar.Callback.DISMISS_EVENT_TIMEOUT:
  26. Toast.makeText(MainActivity.this, "Snackbar自然退出", Toast.LENGTH_SHORT).show();
  27. break;
  28. }
  29. }
  30. @Override
  31. public void onShown(Snackbar snackbar) {
  32. super.onShown(snackbar);
  33. Toast.makeText(MainActivity.this, "Snackbar显示", Toast.LENGTH_SHORT).show();
  34. }
  35. });
  36. snackbar.show();

监听的实现是通过CallBack接口实现的,setCallback(Snackbar.Callback callback):Snackbar的显示与隐藏的回调接口,在该接口中可以重写两个方法:一个是onShow()在Snackbar显示时回调,另一个是onDismissed()在Snackbar隐藏时回调。另外一点就是在onDismissed()方法中可以监听到Snackbar退出的五种原因类型:

        ①Snackbar.Callback.DISMISS_EVENT_SWIPE=0:Indicates that the Snackbar was dismissed via a swipe。

            该事件下Snackbar退出的原因是;意思是“Snackbar右划退出事件”,注意这个右划事件只有在父布局为CoordinatorLayout才会被触发,其他布局如LinearLayout、RelativeLayout等是不会出发的。

        ②Snackbar.Callback.DISMISS_EVENT_ACTION = 1:Indicates that the Snackbar was dismissed via an action click。

            该事件下Snackbar退出的原因是:Snackbar通过Action点击事件触发退出。

        ③Snackbar.Callback.DISMISS_EVENT_TIMEOUT = 2:Indicates that the Snackbar was dismissed via a timeout。

            该事件下Snackbar退出的原因是:Snackbar超出通过setDuration()方法所设置的规定时间后退出,这也是正常的自然退出。

        ④Snackbar.Callback.DISMISS_EVENT_MANUAL = 3:Indicates that the Snackbar was dismissed via a call to dismiss()。

            该事件下Snackbar提出的原因是:通过手动调用了dismiss()方法。

        ⑤Snackbar.Callback.DISMISS_EVENT_CONSECUTIVE = 4:Indicates that the Snackbar was dismissed from a new Snackbar being shown。

            该事件下Snackbar提出的原因:由于新的Snackbar的显示而退出。

4、自定义Snackbar

    在自定义Snackbar之前需要弄清Snackbar的内部构造,打开Snackbar源码可以看到其有一个内部类Snackbar.SnackbarLayout,该内部类就是Snackbar布局,然后找到Snackbar.SnackbarLayout的布局资源文件design_layout_snackbar_include.xml,打开该文件看到一个TextView(吐司左边的信息)和一个Button(显示SnackBar右侧与用户交互的按钮)。


    
  1. <merge xmlns:android="http://schemas.android.com/apk/res/android">
  2. <TextView
  3. android:id= "@+id/snackbar_text"
  4. android:layout_width= "wrap_content"
  5. android:layout_height= "wrap_content"
  6. android:layout_weight= "1"
  7. android:paddingTop= "@dimen/design_snackbar_padding_vertical"
  8. android:paddingBottom= "@dimen/design_snackbar_padding_vertical"
  9. android:paddingLeft= "@dimen/design_snackbar_padding_horizontal"
  10. android:paddingRight= "@dimen/design_snackbar_padding_horizontal"
  11. android:textAppearance= "@style/TextAppearance.Design.Snackbar.Message"
  12. android:maxLines= "@integer/design_snackbar_text_max_lines"
  13. android:layout_gravity= "center_vertical|left|start"
  14. android:ellipsize= "end"
  15. android:textAlignment= "viewStart"/>
  16. <Button
  17. android:id= "@+id/snackbar_action"
  18. android:layout_width= "wrap_content"
  19. android:layout_height= "wrap_content"
  20. android:layout_marginLeft= "@dimen/design_snackbar_extra_spacing_horizontal"
  21. android:layout_marginStart= "@dimen/design_snackbar_extra_spacing_horizontal"
  22. android:layout_gravity= "center_vertical|right|end"
  23. android:paddingTop= "@dimen/design_snackbar_padding_vertical"
  24. android:paddingBottom= "@dimen/design_snackbar_padding_vertical"
  25. android:paddingLeft= "@dimen/design_snackbar_padding_horizontal"
  26. android:paddingRight= "@dimen/design_snackbar_padding_horizontal"
  27. android:visibility= "gone"
  28. android:textColor= "?attr/colorAccent"
  29. style= "?attr/borderlessButtonStyle"/>
  30. </merge>
    如果我们能够获取到该View岂不是就能随意的更改一些Snackbar的背景样式、吐司信息、吐司文字的颜色及大小、交互按钮Button的颜色与文字大小等信息了吗?不错,Snackbar提供了一个getView()方法,这个方法就可以获取到Snackbar.SnackbarLayout的实例。那么下面就来尝试一下。

                                                    Snackbar使用详解及其相关框架TSnackbar

    核心代码:


    
  1. final Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "自定义Snackbar", Snackbar.LENGTH_LONG);
  2. snackbar.setAction("是否OK", new View.OnClickListener() {
  3. @Override
  4. public void onClick(View view) {
  5. Toast.makeText(MainActivity.this, "真的能够交互", Toast.LENGTH_SHORT).show();
  6. }
  7. });
  8. final Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) snackbar.getView();
  9. if (snackbarView != null){
  10. //设置SnackBar背景与透明度
  11. snackbarView.setBackgroundResource(R.drawable.background);
  12. snackbarView.setAlpha((float) 0.4);
  13. //设置Action的字体颜色与大小
  14. final Button snackbar_action = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action);
  15. snackbar_action.setTextColor(Color.RED);
  16. snackbar_action.setTextSize(convertSpToPixel(snackbarView.getContext(),10));
  17. //这是Text的文字颜色与大小
  18. final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
  19. snackbar_text.setTextColor(Color.RED);
  20. snackbar_text.setTextSize(convertSpToPixel(snackbarView.getContext(),10));
  21. //设置左侧icon
  22. Drawable drawable = ContextCompat.getDrawable(MainActivity.this, R.mipmap.ic_core);
  23. if (drawable != null) {
  24. drawable = fitDrawable(getResources(), drawable, (int) convertDpToPixel(24, MainActivity.this));
  25. } else {
  26. throw new IllegalArgumentException("resource_id is not a valid drawable!");
  27. }
  28. final Drawable[] compoundDrawables = snackbar_text.getCompoundDrawables();
  29. snackbar_text.setCompoundDrawables(drawable, compoundDrawables[1], compoundDrawables[2], compoundDrawables[3]);
  30. }
  31. snackbar.show();
   对于自定义我们首先得获取Snackbar的布局:

final Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) snackbar.getView();
    

    拿到布局以后我们可以对Snackbar的背景和透明度进行设置:


    
  1. snackbarView.setBackgroundResource(R.drawable.background);
  2. snackbarView.setAlpha((float) 0.4);
    还记得刚才我们看的Snackbar的布局文件吗?里面就是一个TextView和一个Button,如果我们想要对他们进行自定义我们可以先拿到他们的布局view,首先我们看一下Button:

final Button snackbar_action = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action);
    
    我们拿到Button实例之后就可以对其进行自定义了:


    
  1. snackbar_action.setTextColor(Color.RED);
  2. snackbar_action.setTextSize(convertSpToPixel(snackbarView.getContext(),10));
    我们在对Snackbar里的TextView进行自定义:

final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
    
    对其设置字体大小和字体颜色:


    
  1. snackbar_text.setTextColor(Color.RED);
  2. snackbar_text.setTextSize(convertSpToPixel(snackbarView.getContext(),10));
    对于TextView本身来说还有一个方法就是可以通过setCompoundDrawables(left,top,right,bottom)设置图标Icon,现在我们对Snackbar里的TextView进行左侧图标Icon的设置:


    
  1. //设置左侧icon
  2. Drawable drawable = ContextCompat.getDrawable(MainActivity.this, R.mipmap.ic_core);
  3. if (drawable != null) {
  4. drawable = fitDrawable(getResources(), drawable, (int) convertDpToPixel(24, MainActivity.this));
  5. } else {
  6. throw new IllegalArgumentException("resource_id is not a valid drawable!");
  7. }
  8. final Drawable[] compoundDrawables = snackbar_text.getCompoundDrawables();
  9. snackbar_text.setCompoundDrawables(drawable, compoundDrawables[1], compoundDrawables[2], compoundDrawables[3]);
    这里的代码还用到的方法如下:


    
  1. /**
  2. * 方法描述:将drawable压缩为指定宽高的drawable
  3. *
  4. * @param resources
  5. * @param drawable 原始drawable
  6. * @param sizePx 指定的drawable压缩宽高
  7. * @return
  8. */
  9. private static Drawable fitDrawable(Resources resources, Drawable drawable, int sizePx) {
  10. if (drawable.getIntrinsicWidth() != sizePx || drawable.getIntrinsicHeight() != sizePx) {
  11. if (drawable instanceof BitmapDrawable) {
  12. drawable = new BitmapDrawable(resources, Bitmap.createScaledBitmap(getBitmap(drawable), sizePx, sizePx, true));
  13. }
  14. }
  15. drawable.setBounds(0, 0, sizePx, sizePx);
  16. return drawable;
  17. }
  18. /**
  19. * 方法描述:将Drawable转化为Bitmap
  20. *
  21. * @param drawable
  22. * @return
  23. */
  24. private static Bitmap getBitmap(Drawable drawable) {
  25. if (drawable instanceof BitmapDrawable) {
  26. return ((BitmapDrawable) drawable).getBitmap();
  27. } else if (drawable instanceof VectorDrawable) {
  28. return getBitmap((VectorDrawable) drawable);
  29. } else {
  30. throw new IllegalArgumentException("unsupported drawable type");
  31. }
  32. }
  33. /**
  34. * 方法描述:将VectorDrawable转化为Bitmap
  35. *
  36. * @param vectorDrawable
  37. * @return
  38. */
  39. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  40. private static Bitmap getBitmap(VectorDrawable vectorDrawable) {
  41. Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(),
  42. vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
  43. Canvas canvas = new Canvas(bitmap);
  44. vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
  45. vectorDrawable.draw(canvas);
  46. return bitmap;
  47. }
     好了,Snackbar的基本用法已经差不多了,现在封装一个Snackbar的工具类吧!!!

5、封装工具类


    
  1. import android.annotation.TargetApi;
  2. import android.content.Context;
  3. import android.content.res.Resources;
  4. import android.graphics.Bitmap;
  5. import android.graphics.Canvas;
  6. import android.graphics.drawable.BitmapDrawable;
  7. import android.graphics.drawable.Drawable;
  8. import android.graphics.drawable.VectorDrawable;
  9. import android.os.Build;
  10. import android.support.annotation.Nullable;
  11. import android.support.design.widget.Snackbar;
  12. import android.support.v4.content.ContextCompat;
  13. import android.util.TypedValue;
  14. import android.view.View;
  15. import android.widget.Button;
  16. import android.widget.TextView;
  17. /**
  18. * 类描述:Snackbar工具类
  19. * Created by lizhenya on 16/7/14.
  20. */
  21. public class SnackbarUtil {
  22. private static Snackbar.SnackbarLayout getSnackbarLayout(Snackbar snackbar) {
  23. final Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) snackbar.getView();
  24. return snackbarView;
  25. }
  26. public static Snackbar shortMake(View view, CharSequence message) {
  27. final Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_SHORT);
  28. return snackbar;
  29. }
  30. public static Snackbar shortMake(View view, int messageId) {
  31. final Snackbar snackbar = Snackbar.make(view, messageId, Snackbar.LENGTH_LONG);
  32. return snackbar;
  33. }
  34. public static Snackbar longMake(View view, CharSequence message) {
  35. final Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_SHORT);
  36. return snackbar;
  37. }
  38. public static Snackbar longMake(View view, int messageId) {
  39. final Snackbar snackbar = Snackbar.make(view, messageId, Snackbar.LENGTH_LONG);
  40. return snackbar;
  41. }
  42. public static Snackbar indefiniteMake(View view, CharSequence message) {
  43. final Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE);
  44. return snackbar;
  45. }
  46. public static Snackbar indefiniteMake(View view, int messageId) {
  47. final Snackbar snackbar = Snackbar.make(view, messageId, Snackbar.LENGTH_INDEFINITE);
  48. return snackbar;
  49. }
  50. /**
  51. * 方法描述:设置Snackbar的透明度
  52. *
  53. * @param snackbar
  54. * @param alpha
  55. */
  56. public static void setSnackbarAlpha(Snackbar snackbar, float alpha) {
  57. final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar);
  58. if (snackbarView == null) return;
  59. snackbarView.setAlpha(alpha);
  60. }
  61. /**
  62. * 方法描述:设置Snackbar的背景颜色
  63. *
  64. * @param snackbar
  65. * @param color
  66. */
  67. public static void setSnackbarBackgroundColor(Snackbar snackbar, int color) {
  68. final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar);
  69. if (snackbarView == null) return;
  70. snackbarView.setBackgroundColor(color);
  71. }
  72. /**
  73. * 方法描述:设置Snackbar的背景图片资源
  74. *
  75. * @param snackbar
  76. * @param resId
  77. */
  78. public static void setSnackbarBackgroudResource(Snackbar snackbar, int resId) {
  79. final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar);
  80. if (snackbarView == null) return;
  81. snackbarView.setBackgroundResource(resId);
  82. }
  83. /**
  84. * 方法描述:设置Snackbar中Action的字体颜色
  85. *
  86. * @param snackbar
  87. * @param color
  88. */
  89. public static void setActionTextColor(Snackbar snackbar, int color) {
  90. //snackbar.setActionTextColor(color);
  91. final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar);
  92. if (snackbarView == null) return;
  93. final Button snackbar_action = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action);
  94. snackbar_action.setTextColor(color);
  95. }
  96. /**
  97. * 方法描述:设置Snackbar中Action的字体大小
  98. *
  99. * @param snackbar
  100. * @param size Action的字体大小(单位为sp)
  101. */
  102. public static void setActionTextSize(Snackbar snackbar, float size) {
  103. final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar);
  104. if (snackbarView == null) return;
  105. final Button snackbar_action = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action);
  106. snackbar_action.setTextSize(sp2px(snackbarView.getContext(), size));
  107. }
  108. /**
  109. * 方法描述:设置SnackBar左侧TextView控件的文字颜色和大小
  110. *
  111. * @param snackbar
  112. * @param color TextView控件的文字颜色
  113. * @param size TextView控件的文字大小
  114. */
  115. public static void setTextColorAndSize(Snackbar snackbar, @Nullable int color, @Nullable float size) {
  116. final Snackbar.SnackbarLayout snackbarView = getSnackbarLayout(snackbar);
  117. if (snackbarView == null) return;
  118. final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
  119. if (color != 0) {
  120. snackbar_text.setTextColor(color);
  121. }
  122. if (size != 0) {
  123. snackbar_text.setTextSize(size);
  124. }
  125. }
  126. /**
  127. * 方法描述:在Snackbar左侧添加icon
  128. *
  129. * @param snackbar Snackbar实例
  130. * @param drawableResId 添加的icon资源ID
  131. * @param sizeDp icon的宽度与高度值
  132. */
  133. public static void setIconLeft(Snackbar snackbar, int drawableResId, float sizeDp) {
  134. final Snackbar.SnackbarLayout snackbarView = (Snackbar.SnackbarLayout) getSnackbarLayout(snackbar);
  135. if (snackbarView == null) return;
  136. //snackbar不同于Toast,snackbar依赖于Activity而存在
  137. final Context mContext = snackbarView.getContext();
  138. if (mContext == null) {
  139. return;
  140. }
  141. final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
  142. Drawable drawable = ContextCompat.getDrawable(mContext, drawableResId);
  143. if (drawable != null) {
  144. drawable = fitDrawable(mContext.getResources(), drawable, (int) convertDpToPixel(sizeDp, mContext));
  145. } else {
  146. throw new IllegalArgumentException("resource_id is not a valid drawable!");
  147. }
  148. final Drawable[] compoundDrawables = snackbar_text.getCompoundDrawables();
  149. snackbar_text.setCompoundDrawables(drawable, compoundDrawables[1], compoundDrawables[2], compoundDrawables[3]);
  150. }
  151. /**
  152. * 方法描述:将drawable压缩为指定宽高的drawable
  153. *
  154. * @param resources
  155. * @param drawable 原始drawable
  156. * @param sizePx 指定的drawable压缩宽高
  157. * @return
  158. */
  159. private static Drawable fitDrawable(Resources resources, Drawable drawable, int sizePx) {
  160. if (drawable.getIntrinsicWidth() != sizePx || drawable.getIntrinsicHeight() != sizePx) {
  161. if (drawable instanceof BitmapDrawable) {
  162. drawable = new BitmapDrawable(resources, Bitmap.createScaledBitmap(getBitmap(drawable), sizePx, sizePx, true));
  163. }
  164. }
  165. drawable.setBounds(0, 0, sizePx, sizePx);
  166. return drawable;
  167. }
  168. /**
  169. * 方法描述:将Drawable转化为Bitmap
  170. *
  171. * @param drawable
  172. * @return
  173. */
  174. private static Bitmap getBitmap(Drawable drawable) {
  175. if (drawable instanceof BitmapDrawable) {
  176. return ((BitmapDrawable) drawable).getBitmap();
  177. } else if (drawable instanceof VectorDrawable) {
  178. return getBitmap((VectorDrawable) drawable);
  179. } else {
  180. throw new IllegalArgumentException("unsupported drawable type");
  181. }
  182. }
  183. /**
  184. * 方法描述:将VectorDrawable转化为Bitmap
  185. *
  186. * @param vectorDrawable
  187. * @return
  188. */
  189. @TargetApi(Build.VERSION_CODES.LOLLIPOP)
  190. private static Bitmap getBitmap(VectorDrawable vectorDrawable) {
  191. Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(),
  192. vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
  193. Canvas canvas = new Canvas(bitmap);
  194. vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
  195. vectorDrawable.draw(canvas);
  196. return bitmap;
  197. }
  198. /**
  199. * 方法描述:dp转化为px
  200. *
  201. * @param dpValue
  202. * @param context
  203. * @return
  204. */
  205. private static float convertDpToPixel(float dpValue, Context context) {
  206. return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
  207. dpValue, context.getResources().getDisplayMetrics());
  208. }
  209. /**
  210. * sp转px
  211. *
  212. * @param context
  213. * @param spVal
  214. * @return
  215. */
  216. public static int convertSpToPixel(Context context, float spVal) {
  217. return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
  218. spVal, context.getResources().getDisplayMetrics());
  219. }
  220. public static int sp2px(Context context, float spValue) {
  221. final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
  222. return (int) (spValue * fontScale + 0.5f);
  223. }
  224. }

顶部展示的SnackBar

     文章最后介绍一个第三方框架。系统默认的Snackbar是从屏幕底部弹出的,如果想要改变其弹出位置可以将其父控件置于想要弹出的屏幕位置,但是即使这样做也不能改变动画,现在介绍一个从顶部弹出的Snackbar框架TSnackbar,github链接:https://github.com/AndreiD/TSnackBar

                                                         Snackbar使用详解及其相关框架TSnackbar



Snackbar使用源码下载:http://download.csdn.net/detail/u012810020/9594379

上一篇:Java-Eclipse RCP:文件关联(–launcher.openFile)


下一篇:java-为什么Eclipsepedia的TreeViewer需要此代码?