SnackBar 的使用

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;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaowang_lj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值