热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AndroidApplication级别自定义Toast

这篇文章主要为大家详细介绍了AndroidApplication级别自定义Toast,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在Android开发过程中,有时会需要一些消息提示,大多数情况可以用dialog来做,但有些消息不需要用户去点击取消并且不能对用户体验产生影响的提示,就需要toast来做了。但可惜的是,toast是系统级的,凡是涉及到系统的又会涉及到其他APP,有些定制系统可以对App的消息通知进行设置,一旦禁止了APP的通知toast则不会显示。而且在Android 7以后toast还需要申请权限麻烦死了有木有,劳资就想安安静静的提示一下有这么麻烦吗!所以,本人特地研究了下能在Application级别不受限制提示的toast。

先看效果:

效果很简单,就是一个头部即现即隐的提示,外加过渡动画。其实自定义系统级的toast也能实现这种效果,但之前已经说了系统级的toast有限制。

话不多说,现在介绍下这是如何实现的吧!

首先申明这是基于WindowManager产生的view,本人看了系统级toast的源码好像也是基于WindowManager的。WindowManager是个神奇的东西,在这就不多做介绍了,我们只需要知道activity.getWindowManager().addView(layout, params)可以给整个Activity界面添加一个view层,这一层可以不影响activity的操作。竟然有这个功能瞬间涨姿势了有不有!细心人的应该察觉到了这和FrameLayout挺像,其实Activity的root就是一个FrameLayout。

好了,既然Activity有这个功能,那tosat做起来就有头绪了。

先实现java类代码(个人爱好,喜欢先主后次):

/**
 * App级toast
 */
public class AppToast
{
  private Activity activity;
 
  private ViewGroup layout;
  private ViewGroup content;
  private TextView textView;
 
  private Animation startAnimation;
  private Animation centerAnimation;
  private Animation endAnimation;
 
  private DelayTask task;
  private boolean isShow;
 
  private LayoutParams params;
 
  /**
   * APP级别Toast
   */
  public AppToast(Activity activity)
  {
    this.activity = activity;
 
    layout = (ViewGroup) LayoutInflater.from(activity).inflate(R.layout.toast, null);
    cOntent= (ViewGroup) layout.getChildAt(0);
    textView = (TextView) content.getChildAt(0);
    params = new LayoutParams();
    params.height = LayoutParams.WRAP_CONTENT;
    params.width = LayoutParams.MATCH_PARENT;
    params.gravity = Gravity.TOP;
    params.type = LayoutParams.TYPE_APPLICATION;
    params.format = PixelFormat.TRANSLUCENT;
    params.flags = LayoutParams.FLAG_KEEP_SCREEN_ON | LayoutParams.FLAG_NOT_FOCUSABLE |
        LayoutParams.FLAG_NOT_TOUCHABLE;
    activity.getWindowManager().addView(layout, params);
    layout.setVisibility(View.GONE);
 
    // 开始动画
    startAnimation = new AlphaAnimation(0, 1);
    startAnimation.setDuration(500);
 
    // 中间动画
    centerAnimation = new AlphaAnimation(0.92f, 1);
    centerAnimation.setDuration(500);
 
    // 结束动画
    endAnimation = new AlphaAnimation(1, 0);
    endAnimation.setDuration(500);
    endAnimation.setInterpolator(new AccelerateInterpolator());
 
    // 结束动画监听
    endAnimation.setAnimationListener(new Animation.AnimationListener()
    {
      @Override
      public void onAnimationStart(Animation animation)
      {
      }
 
      @Override
      public void onAnimationEnd(Animation animation)
      {
        layout.setVisibility(View.GONE);
      }
 
      @Override
      public void onAnimationRepeat(Animation animation)
      {
      }
    });
  }
 
  /**
   * 显示Toast
   */
  public void show(String s)
  {
    show(s, 1500);
  }
 
  /**
   * 显示Toast
   */
  public void show(String s, int delay)
  {
    textView.setText(s);
    start();
    if (task != null)
    {
      task.stop();
    }
    task = new DelayTask(delay)
    {
      @Override
      public void logic()
      {
        end();
      }
    };
    task.start();
  }
 
  /**
   * 开始
   */
  private void start()
  {
    if (!isShow)
    {
      layout.setVisibility(View.VISIBLE);
      content.startAnimation(startAnimation);
      isShow = true;
    } else
    {
      content.startAnimation(centerAnimation);
    }
  }
 
  /**
   * 结束
   */
  private void end()
  {
    content.startAnimation(endAnimation);
    isShow = false;
  }
}

先在构造方法AppToast(Activity activity)中加载自定义toast的布局以及初始化params参数。然后添加各个过程所需的动画。这其中有个重点,就是params.type = LayoutParams.TYPE_APPLICATION,记住一定要是TYPE_APPLICATION,而不是TYPE_TOAST,TYPE_TOAST会在Android 7上被莫名其妙的限制。
有些人可能会注意到除了开始动画和结束动画,为什么还有个中间动画?其实这是为了多重toast提示做的一个辨别机制,我们在用系统级toast的时候有些人应该能感受到toast并不是重叠显示,但也不是直接替换内容,而是在替换内容的时候微微的闪一下表示内容变更了,所以在这里就用了一个中间动画来执行那“闪一下”的效果。

关于其中用到的一个延时器类DelayTask,这是本人为了方便自行设计的一个工具类,其效果就是延时执行一段UI逻辑,其代码如下:

/**
 * 延时器类
 *
 * @author zls
 *
 * @version 1.0
 *
 * @time 2015-12-27下午7:52:10
 */
public abstract class DelayTask
{
 protected Thread thread;
 private boolean isRun;
 
 /**
 * 延时器
 */
 public DelayTask(final long delay)
 {
 thread = new Thread()
 {
  @Override
  public void run()
  {
  try
  {
   sleep(delay);
   if(isRun)
   {
   mHandler.sendEmptyMessage(0);
   }
  } catch (Exception e)
  {
  }
  }
 };
 }
 
 protected Handler mHandler = new Handler()
 {
 @Override
 public void handleMessage(Message msg)
 {
  logic();
 }
 };
 
 /** 开始执行 */
 public void start()
 {
 isRun = true;
 thread.start();
 }
 
 /** 停止执行 */
 public void stop()
 {
 isRun = false;
 }
 
 /** 执行逻辑 */
 public abstract void logic();
}

有兴趣的朋友可以借鉴下,觉得这么设计不太好的也可以用你们自己设计的延时器来用。

现在上toast的布局代码:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 
  
 
    
  
 

测试Activity的代码:

public class MainActivity extends AppCompatActivity
{
  private AppToast toast;
 
  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
 
    toast = new AppToast(this);
  }
 
  public void ok(View v)
  {
    toast.show("这是Toast测试!" + Math.random());
  }
}

Demo下载

就此结束,希望能帮到需要此功能的朋友。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • 原理:dismiss再弹出,把dialog设为全局对象。if(dialog!null&&dialog.isShowing()&&!(Activity.)isFinishing()) ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
author-avatar
Turkey小白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有