android 提示

1、Toast:

Toast toast=new Toast(context);  

        Toast.makeText(context, text, duration);//返回值为Toast  

        toast.setDuration(duration);//设置持续时间  

        toast.setGravity(gravity, xOffset, yOffset);//设置Toast的位置  

        toast.setText(s);//设置提示内容  

        toast.show();//显示  

2、(转)Snackbars(版权声明:欢迎转载,转载请注明出处 https://blog.csdn.net/u012810020/article/details/52108818)

简述:

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

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

        ②可以与用户交互操作;

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

 

                                         

基本使用方法

1、简单使用

 

 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

    核心代码:

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

    核心代码:

 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       
 3         <TextView  
 4                 android:id="@+id/snackbar_text"  
 5                 android:layout_width="wrap_content"  
 6                 android:layout_height="wrap_content"  
 7                 android:layout_weight="1"  
 8                 android:paddingTop="@dimen/design_snackbar_padding_vertical"  
 9                 android:paddingBottom="@dimen/design_snackbar_padding_vertical"  
10                 android:paddingLeft="@dimen/design_snackbar_padding_horizontal"  
11                 android:paddingRight="@dimen/design_snackbar_padding_horizontal"  
12                 android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"  
13                 android:maxLines="@integer/design_snackbar_text_max_lines"  
14                 android:layout_gravity="center_vertical|left|start"  
15                 android:ellipsize="end"  
16                 android:textAlignment="viewStart"/>  
17       
18         <Button  
19                 android:id="@+id/snackbar_action"  
20                 android:layout_width="wrap_content"  
21                 android:layout_height="wrap_content"  
22                 android:layout_marginLeft="@dimen/design_snackbar_extra_spacing_horizontal"  
23                 android:layout_marginStart="@dimen/design_snackbar_extra_spacing_horizontal"  
24                 android:layout_gravity="center_vertical|right|end"  
25                 android:paddingTop="@dimen/design_snackbar_padding_vertical"  
26                 android:paddingBottom="@dimen/design_snackbar_padding_vertical"  
27                 android:paddingLeft="@dimen/design_snackbar_padding_horizontal"  
28                 android:paddingRight="@dimen/design_snackbar_padding_horizontal"  
29                 android:visibility="gone"  
30                 android:textColor="?attr/colorAccent"  
31                 style="?attr/borderlessButtonStyle"/>  
32       
33     </merge>  

    如果我们能够获取到该View岂不是就能随意的更改一些Snackbar的背景样式、吐司信息、吐司文字的颜色及大小、交互按钮Button的颜色与文字大小等信息了吗?不错,Snackbar提供了一个getView()方法,这个方法就可以获取到Snackbar.SnackbarLayout的实例。那么下面就来尝试一下。

                                                

    核心代码:

 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       
14                //设置Action的字体颜色与大小  
15                final Button snackbar_action = (Button) snackbarView.findViewById(android.support.design.R.id.snackbar_action);  
16                snackbar_action.setTextColor(Color.RED);  
17                snackbar_action.setTextSize(convertSpToPixel(snackbarView.getContext(),10));  
18       
19                //这是Text的文字颜色与大小  
20                final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);  
21                snackbar_text.setTextColor(Color.RED);  
22                snackbar_text.setTextSize(convertSpToPixel(snackbarView.getContext(),10));  
23                //设置左侧icon  
24                Drawable drawable = ContextCompat.getDrawable(MainActivity.this, R.mipmap.ic_core);  
25                if (drawable != null) {  
26                    drawable = fitDrawable(getResources(), drawable, (int) convertDpToPixel(24, MainActivity.this));  
27                } else {  
28                    throw new IllegalArgumentException("resource_id is not a valid drawable!");  
29                }  
30       
31                final Drawable[] compoundDrawables = snackbar_text.getCompoundDrawables();  
32                snackbar_text.setCompoundDrawables(drawable, compoundDrawables[1], compoundDrawables[2], compoundDrawables[3]);  
33            }  
34            snackbar.show();  

   对于自定义我们首先得获取Snackbar的布局:

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

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

    snackbarView.setBackgroundResource(R.drawable.background);  
    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进行自定义:

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

顶部展示的SnackBar

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

                                                         

 

 

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

3、AlertDialog 

 1    new AlertDialog.Builder(this)
 2         .setTitle("标题")  //  ;
 3         .setMessage("message")
 4         .setIcon(R.drawable.ic_launcher_background)  //  图标
 5         .setNegativeButton("取消",new DialogInterface.OnClickListener(){
 6             @Override
 7             public void onClick(DialogInterface dialog, int which) {
 8                 //  do  something
 9             }
10         })
11         .setPositiveButton("确定", new DialogInterface.OnClickListener() {
12             @Override
13             public void onClick(DialogInterface dialog, int which) {
14                 //  do   something
15             }
16         })
17          .setView(new EditText(this)) // 还可以 加入额外view来实现额外功能
18          .create()
19          .show();




还可以使用,LayoutInflater布局文件转化为 view对象 放进 Alert

1  LayoutInflater layoutInflater =  LayoutInflater.from(MainActivity.this); //context
2 LinearLayout layout = (LinearLayout) layoutInflater.inflate(R.layout.acvitity_alert,null);//自定义的layout
3 Dialog dialog = new AlertDialog.Builder(this).create();
4 dialog.show();
5  dialog.getWindow().setContentView(layout);


 

4、 AlertView

  

原文地址:https://www.cnblogs.com/the-wang/p/8942298.html