1.简单使用
Snackbar.make(MainActivity.this,view,"snack bar",Snackbar.LENGTH_SHORT).show();
第一个参数是Context 、第二个参数是要显示的view 、第三个参数是显示的字符串、第四个参数是显示时长,时长有下面三种
①Snackbar.LENGTH_SHORT:与Toast.LENGHT_SHORT(大约1.x秒)一样显示较短时长后自动消失。
②Snackbar.LENGTH_LONG:与Toast.LENGHT_LONG(大约3秒)一样显示相对较长时间后自动消失。
③Snackbar.LENGTH_INDEFINITE:永不消失除非手动调用dismiss()方法去除Snackbar。
2.交互使用
Snackbar snack_bar = Snackbar.make(MainActivity.this, v, "确定要删除文件吗", Snackbar.LENGTH_SHORT);
snack_bar.setAction("确认", new View.OnClickListener() {
@Override
public void onClick(View v) {
//删除文件
}
});
snack_bar.show();
在SnackBar上 指定按钮进行交互。
3.监听SnackBar 的显示状态
// 对snackbar状态的监听
snack_bar.setCallback(new Snackbar.Callback(){
// 在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的显示而退出。
@Override
public void onDismissed(Snackbar transientBottomBar, int event) {
super.onDismissed(transientBottomBar, event);
}
// 在Snackbar显示时回调
@Override
public void onShown(Snackbar sb) {
super.onShown(sb);
}
});
4.自定义SnackBar
Snackbar提供了一个getView()方法,这个方法就可以获取到Snackbar.SnackbarLayout的实例,用于进行自定义
对于自定义我们首先得获取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实例之后就可以对其进行自定义了:
snackbar_action.setTextColor(Color.RED);
snackbar_action.setTextSize(convertSpToPixel(snackbarView.getContext(),10));
我们在对Snackbar里的TextView进行自定义:
final TextView snackbar_text = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
对其设置字体大小和字体颜色:
snackbar_text.setTextColor(Color.RED);
snackbar_text.setTextSize(convertSpToPixel(snackbarView.getContext(),10));
对于TextView本身来说还有一个方法就是可以通过setCompoundDrawables(left,top,right,bottom)设置图标Icon,现在我们对Snackbar里的TextView进行左侧图标Icon的设置:
//设置左侧icon
Drawable drawable = ContextCompat.getDrawable(MainActivity.this, R.mipmap.ic_core);
if (drawable != null) {
drawable = fitDrawable(getResources(), drawable, (int) convertDpToPixel(24, MainActivity.this));
} else {
throw new IllegalArgumentException("resource_id is not a valid drawable!");
}
final Drawable[] compoundDrawables = snackbar_text.getCompoundDrawables();
snackbar_text.setCompoundDrawables(drawable, compoundDrawables[1], compoundDrawables[2], compoundDrawables[3]);
这里的代码还用到的方法如下:
/**
* 方法描述:将drawable压缩为指定宽高的drawable
*
* @param resources
* @param drawable 原始drawable
* @param sizePx 指定的drawable压缩宽高
* @return
*/
private static Drawable fitDrawable(Resources resources, Drawable drawable, int sizePx) {
if (drawable.getIntrinsicWidth() != sizePx || drawable.getIntrinsicHeight() != sizePx) {
if (drawable instanceof BitmapDrawable) {
drawable = new BitmapDrawable(resources, Bitmap.createScaledBitmap(getBitmap(drawable), sizePx, sizePx, true));
}
}
drawable.setBounds(0, 0, sizePx, sizePx);
return drawable;
}
/**
* 方法描述:将Drawable转化为Bitmap
*
* @param drawable
* @return
*/
private static Bitmap getBitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
} else if (drawable instanceof VectorDrawable) {
return getBitmap((VectorDrawable) drawable);
} else {
throw new IllegalArgumentException("unsupported drawable type");
}
}
/**
* 方法描述:将VectorDrawable转化为Bitmap
*
* @param vectorDrawable
* @return
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static Bitmap getBitmap(VectorDrawable vectorDrawable) {
Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(),
vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
vectorDrawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
vectorDrawable.draw(canvas);
return bitmap;
}