> LZ-Says:有时候真的不需要让自己在意太多,在意的太多,反而有些累,计较太多,反而让自己患得患失,随心随性就好,愿各位伙计能开心撸码~

> LZ-Says:有时候真的不需要让自己在意太多,在意的太多,反而有些累,计较太多,反而让自己患得患失,随心随性就好,愿各位伙计能开心撸码~

前言

今天我们来学习下有关Toast以及SnackBar用法,通过细节,让我们的app更加人性化~

本文目标

阅读完本文,你会get如下技能:自定义Toast,了解有关Toast那些不为人知的秘密;

SnackBar,通过一个个简短小例子,让你彻底玩转SnackBar。

下面开始我们第一小节,了解Toast那些不为人知的秘密

一、Toast篇章

Toast,这个小伙伴由于使用方便,适用场景多而被我们广泛应用,那么首先我们来回顾下Toast是如何易(shi)用的呢?Toast.makeText(this, "弹弹弹", Toast.LENGTH_SHORT).show();

我们只需要如上一句话,即可实现Toast弹出,很easy~那么不知道大家有没有关注过它的内部实现,换句话说是,它是怎么show的呢?我们能不能对它进行模仿改造,也就是文章开头所述自定义Toast?

LZ这里没有解答,我们只能通过看源码去了解,那么,Let's go~!

1.1 逐步深入Toast

我们先来了解makeText()方法里面干了什么?public static Toast makeText(Context context, CharSequence text, @Duration int duration) {        return makeText(context, null, text, duration);

}    public static Toast makeText(@NonNull Context context, @Nullable Looper looper,

@NonNull CharSequence text, @Duration int duration) {        // 实例化Toast

Toast result = new Toast(context, looper);        // 获取LayoutInflater

LayoutInflater inflate = (LayoutInflater)

context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);        // 渲染布局

View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);        // 实例化相应子控件

TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);        // 设置子控件内容

tv.setText(text);        // 设置view

result.mNextView = v;        // 设置显示时间

result.mDuration = duration;        // 将当前设置完成的Toast返回

return result;

}

同样也是很easy,而有关show()方法,其实目前感觉不需要关注太多,如下,简单的描述了下:public void show() {        if (mNextView == null) { // 校验view有效性

throw new RuntimeException("setView must have been called");

}        // 获取Service管理实例

INotificationManager service = getService();

String pkg = mContext.getOpPackageName();

TN tn = mTN;

tn.mNextView = mNextView;        try {

service.enqueueToast(pkg, tn, mDuration); // 请求队列中Toast

} catch (RemoteException e) {            // Empty

}

}

简单分析如上,下面就开始我们真正的实现,高仿之路~!

1.2 Toast高仿路启程

我们在源码中可以看到,实例化Toast之后需要渲染一个布局,那么我们首先需要定义一个布局,一切从简,如下:

定义好布局之后,为了让其显示的效果更好,这里我们定义一个圆角shape,如下:

接下来重点来了,高仿Toast内部实现来构造我们的Toast:public void showCustomToast(View view) {        // 初始化控件

Toast result = new Toast(this);        // 获取LayoutInflater实例

LayoutInflater inflate = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);        // 渲染布局

View v = inflate.inflate(R.layout.item_custom_toast, null);        // 随心设置内容

TextView tv = (TextView) v.findViewById(R.id.id_text);

tv.setText("Hello,我是自定义Toast内容");        // 设置填充内容

result.setView(v);        // 设置时间

result.setDuration(Toast.LENGTH_SHORT);        // 设置居中

result.setGravity(0, 0, 0);

result.show();

}

嗯哼,是不是很赞呢?

二、SnackBar篇章

这里没有接触的小伙伴可能会疑惑了,SnackBar又是什么鬼?

这里稍稍普及一下,SnackBar是在Android 5.0推出的,类属于Material Design系列。

它介于Toast和Dialog之间,为什么这么说呢?下面请看几组对比。Toast使用场景较多,但是缺乏用户交互;

Dialog可以和用户进行交互,但是会中断用户操作,试想,你只是想提醒下用户而已,没必要去中断用户操作,那么此时,dialog有点low了;

而为什么说是SnackBar介于俩者之间呢,举个小例子,当我弹出SnackBar时,用户可以交互,也可以不管,但是无论如何,都不会中断用户操作,你也可以简单理解为这俩个是独立存在的,一方不会影响另一方。

简述之后,我们一起开启SnackBar Study之路~

装逼之前,我们需要先干一件事儿,那就是引入依赖,如下:compile 'com.android.support:design:23.0.0'

2.1 指定一个小目标:先弹出一个SnackBarpublic void showSnackBar(View view) {

Snackbar snackbar = Snackbar.make(view, "SnackStudy", Snackbar.LENGTH_SHORT);

snackbar.show();

}

2.2 设置交互

有的小伙伴就说了,交互呢?被你糟了?

瞧着~

交互,无非不就是事件嘛,设置一个不久好了嘛。snackbar.setAction("确定", new View.OnClickListener() {            @Override

public void onClick(View v) {

showToast(null);

}

});

2.3 设置按钮颜色

这时候,有人会说了,你那确定的颜色真恶心,换一个~

只需一行代码搞定,你信不信?// 设置颜色

snackbar.setActionTextColor(Color.RED);

2.4 设置内容颜色

有基友说了,设置按钮人家给你提供了,那我要设置内容颜色呢?

哈哈,能难住老夫嘛?// 设置内容颜色

TextView tvContent=snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);

tvContent.setTextColor(Color.YELLOW);

别问我为什么知道id,自己看源码去~

2.5 设置背景色

小伙子又问了,我想设置背景怎么办?

很easy,如下:// 设置背景色

snackbar.getView().setBackgroundColor(Color.BLUE);

2.6 设置drawLeft、Top、Right以及Bottom

小伙子弱弱的问,那如果我想设置左上右下图标呢?// 设置内容图标Drawable drawable = ContextCompat.getDrawable(this, R.mipmap.ic_launcher_round);

drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());

tvContent.setCompoundDrawables(drawable, drawable, drawable, drawable);   // 给TextView左边添加图标

tvContent.setGravity(Gravity.CENTER_VERTICAL);  // 让文字居中

tvContent.setCompoundDrawablePadding(130); // 设置padding

2.7 设置侧滑取消

小伙子又说了,不是说还可以侧滑划出的吗?

肿么搞?

表急,只需修改布局即可实现:

将根布局修改如下:android.support.design.widget.CoordinatorLayout

这时候,小伙子又问了。。。丫的,就这了。。。准备收尾`

android 自定义 snackbar,Android Study Material Design 五 之:自定义Toast以及玩转SnackBar...相关推荐

  1. android 自定义 snackbar,自定义Toast以及玩转SnackBar

    原标题:自定义Toast以及玩转SnackBar 有时候真的不需要让自己在意太多,在意的太多,反而有些累,计较太多,反而让自己患得患失,随心随性就好,愿各位伙计能开心撸码~ 前言 今天我们来学习下有关 ...

  2. Android Study Material Design 十 再探沉浸式

    LZ-Says: 这些年,身边的"兄弟"越来越多, 真正的兄弟越来越少... 前言 今天,我们不讲美女,不讲三国,那么我们一起来聊聊有关Android中沉浸式实现. 关于写这篇文章 ...

  3. android md 颜色,安卓MD(Material Design)规范

    Md规范是一种设计风格,并不特指规范.是一种模拟纸张的手法. 一.核心思想 把物理世界的体验带进屏幕.去掉现实中的杂质和随机性,保留其最原始纯净的形态.空间关系.变化与过度,配合虚拟世界的灵活特性,还 ...

  4. Android开源 -- 开源的基于 Material Design设计的豆瓣的Android客户端“豆芽”

    豆芽APP 另一个 Material Design 的豆瓣客户端. 豆芽 CI 构建 豆芽 API Key 设置向导 部分特性 Material Design 首页友邻广播 启动速度优化 界面动画 支 ...

  5. Android开发的UI设计——Material Design

    前言 Material Design 是用于指导用户在各种平台和设备上进行视觉.动作和互动设计的全面指南.如需在您的 Android 应用中使用 Material Design,请遵循 Materia ...

  6. android 新版的设计规范(Material Design)

    I still believe that the stars will speak, through the summer and winter snow fence after, you will ...

  7. Android开发笔记(一百二十五)自定义视频播放器

    视频播放方式 在Android中播放视频的方式有两种: 1.使用MediaPlayer结合SurfaceView进行播放.其中通过SurfaceView显示视频的画面,通过MediaPlayer来设置 ...

  8. android抽屉风格,Android开发实战之拥有Material Design风格的抽屉式布局

    在实现开发要求中,有需要会使用抽屉式布局,类似于QQ5.0的侧滑菜单,实现的方式有很多种,可以自定义控件,也可以使用第三方开源库. 同样的谷歌也推出了自己的侧滑组件--DrawLayout,使用方式也 ...

  9. Study - Material Design 浅析

    Material Design??? 考虑事物本质的设计,将电子屏幕里的UI元素看成是一种不存在于现实世界的新的材质,并赋予它物理特性 不是去拟物化的设计 纸的形态模拟 纸 电子屏幕 3D的空间关系 ...

最新文章

  1. 零基础自学用Python 3开发网络爬虫(一)
  2. 原来带有python又装了一个anaconda有影响吗_anaconda python环境与原有python环境的坑...
  3. DCMTK:以HTML格式呈现DICOM结构化报告文件的内容
  4. Django上传文件及分页
  5. nginx编译安装_Nginx编译安装nginx-upsync-module模块以实现动态负载
  6. 微信小程序消息推送自有服务器无法接收到信息,消息推送服务器配置次数用完的解决方式。
  7. 光驱怎么挂载第二个光驱_电脑光驱怎么安装?台式机安装光驱的方法
  8. 开源软件运动为什么流行起来?
  9. 基于深度残差网络的番茄叶片病害识别方法
  10. element-ui 解决 table 里包含表单验证的问题!
  11. Verilog 语法点使用————(持续更新)
  12. python多任务_python之多任务
  13. 结构型模式之组合模式
  14. \t\t[生活小妙招]脚气 脚臭 损人不利己之疾病
  15. 为antd tree组件 在onSelect时获取额外数据
  16. 高德AR驾车导航解决方案
  17. Python+Selenium程序执行完,浏览器自动关闭问题
  18. 全球及中国军用海岸雷达行业研究及十四五规划分析报告
  19. python常用单词读法-Python常用单词
  20. 在php中利用gd2库的函数创建水印

热门文章

  1. C#引用interop.taskscheduler.dll
  2. 如何修改SVN的地址
  3. 英语学习打卡day1
  4. UE4:Build Configuration和Config的解释
  5. 桌面ICON的红图标
  6. 风影总结NHibernate2 配置文件
  7. Java是什么?Java的特点有哪些?
  8. part1:推荐一些适合练手、课程设计、毕业设计的python小项目源码,无任何下载门槛
  9. python 围棋按照坐标查找棋子_python 实现围棋游戏(纯tkinter gui)
  10. Java中变量声明使用,内存分析,数据类型常见码表详解