转于:http://blog.csdn.net/zhangweiwtmdbf/article/details/30031015
-------------------------------------------------------------------------------------------
一、引言
在开发的过程中你会发现Android自身的Toast提示有许多限制,比如我想自定义Toast的动画、自定义一个美观的View显示在Toast中、更多的是让Toast显示指定的时长等等。
首先一下效果如何:
二、原理
自定义的原理也很简单,就是给WindowManager添加View和删除View,不过需要设置WindowManager.LayoutParams和View的样式,使其看起来和Android系统的Toast看起来很相像。
具体代码如下:
- /**
- * Custom Toast
- *
- * @author Lucky
- *
- */
- public class ToastHelper {
- public static final int LENGTH_LONG = 3500;
- public static final int LENGTH_SHORT = 2000;
- private WindowManager mWindowManager;
- private WindowManager.LayoutParams mWindowParams;
- private View toastView;
- private Context mContext;
- private Handler mHandler;
- private String mToastContent = "";
- private int duration = 0;
- private int animStyleId = android.R.style.Animation_Toast;
- private final Runnable timerRunnable = new Runnable() {
- @Override
- public void run() {
- removeView();
- }
- };
- private ToastHelper(Context context) {
- // Notice: we should get application context
- // otherwise we will get error
- // "Activity has leaked window that was originally added"
- Context ctx = context.getApplicationContext();
- if (ctx == null) {
- ctx = context;
- }
- this.mContext = ctx;
- mWindowManager = (WindowManager) mContext
- .getSystemService(Context.WINDOW_SERVICE);
- init();
- }
- private void init() {
- mWindowParams = new WindowManager.LayoutParams();
- mWindowParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
- | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
- mWindowParams.alpha = 1.0f;
- mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
- mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
- mWindowParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
- mWindowParams.format = PixelFormat.TRANSLUCENT;
- mWindowParams.type = WindowManager.LayoutParams.TYPE_TOAST;
- mWindowParams.setTitle("ToastHelper");
- mWindowParams.packageName = mContext.getPackageName();
- mWindowParams.windowAnimations = animStyleId;// TODO
- mWindowParams.y = mContext.getResources().getDisplayMetrics().widthPixels / 5;
- }
- @SuppressWarnings("deprecation")
- @SuppressLint("NewApi")
- private View getDefaultToastView() {
- TextView view = new TextView(mContext);
- view.setText(mToastContent);
- view.setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
- view.setFocusable(false);
- view.setClickable(false);
- view.setFocusableInTouchMode(false);
- view.setTextColor(android.graphics.Color.WHITE);
- Drawable drawable = mContext.getResources().getDrawable(
- android.R.drawable.toast_frame);
- if (Build.VERSION.SDK_INT < 16) {
- view.setBackgroundDrawable(drawable);
- } else {
- view.setBackground(drawable);
- }
- return view;
- }
- public void show() {
- removeView();
- if (toastView == null) {
- toastView = getDefaultToastView();
- }
- mWindowParams.gravity = android.support.v4.view.GravityCompat
- .getAbsoluteGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM,
- android.support.v4.view.ViewCompat
- .getLayoutDirection(toastView));
- removeView();
- mWindowManager.addView(toastView, mWindowParams);
- if (mHandler == null) {
- mHandler = new Handler();
- }
- mHandler.postDelayed(timerRunnable, duration);
- }
- public void removeView() {
- if (toastView != null && toastView.getParent() != null) {
- mWindowManager.removeView(toastView);
- mHandler.removeCallbacks(timerRunnable);
- }
- }
- /**
- * @param context
- * @param content
- * @param duration
- * @return
- */
- public static ToastHelper makeText(Context context, String content,
- int duration) {
- ToastHelper helper = new ToastHelper(context);
- helper.setDuration(duration);
- helper.setContent(content);
- return helper;
- }
- /**
- * @param context
- * @param strId
- * @param duration
- * @return
- */
- public static ToastHelper makeText(Context context, int strId, int duration) {
- ToastHelper helper = new ToastHelper(context);
- helper.setDuration(duration);
- helper.setContent(context.getString(strId));
- return helper;
- }
- public ToastHelper setContent(String content) {
- this.mToastContent = content;
- return this;
- }
- public ToastHelper setDuration(int duration) {
- this.duration = duration;
- return this;
- }
- public ToastHelper setAnimation(int animStyleId) {
- this.animStyleId = animStyleId;
- mWindowParams.windowAnimations = this.animStyleId;
- return this;
- }
- /**
- * custom view
- *
- * @param view
- */
- public ToastHelper setView(View view) {
- this.toastView = view;
- return this;
- }
- }
另外分享一个自定义的Anim:
1.显示Toast的动画:
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="300"
- android:fillAfter="true" >
- <alpha
- android:fromAlpha="0.0"
- android:toAlpha="1.0" />
- <translate
- android:fromYDelta="20%"
- android:toYDelta="0%" />
- <scale
- android:fromXScale="0.5"
- android:fromYScale="0.5"
- android:pivotX="50%"
- android:pivotY="50%"
- android:toXScale="1.0"
- android:toYScale="1.0" />
- </set>
2.退出Toast的动画:
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="300"
- android:fillAfter="true" >
- <alpha
- android:fromAlpha="1.0"
- android:toAlpha="0.0" />
- <translate
- android:fromYDelta="0%"
- android:toYDelta="20%" />
- </set>
给WIndowManager中的View添加动画需要定义一个style,如下:
- <style name="PopToast">
- <item name="@android:windowEnterAnimation">@anim/anim_toast_enter</item>
- <item name="@android:windowExitAnimation">@anim/anim_toast_exit</item>
- </style>
最后可以按照如下的方式去使用:
- ToastHelper
- .makeText(this, "hello world 你好,哈拉雷速度发说得对",
- ToastHelper.LENGTH_SHORT)
- .setAnimation(R.style.PopToast).show();
三、参考资料:
SuperToast: https://github.com/JohnPersano/SuperToasts
相关推荐
实验室设备管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
PPT高效插件神器推荐-最新发布.zip
数据中心机房是现代信息技术的核心设施,它承载着企业的重要数据和服务,因此,其基础设计与规划至关重要。在制定这样的方案时,需要考虑的因素繁多,包括但不限于以下几点: 1. **容量规划**:必须根据业务需求预测未来几年的数据处理和存储需求,合理规划机房的规模和设备容量。这涉及到服务器的数量、存储设备的容量以及网络带宽的需求等。 2. **电力供应**:数据中心是能源消耗大户,因此电力供应设计是关键。要考虑不间断电源(UPS)、备用发电机的容量,以及高效节能的电力分配系统,确保电力的稳定供应并降低能耗。 3. **冷却系统**:由于设备密集运行,散热问题不容忽视。合理的空调布局和冷却系统设计可以有效控制机房温度,避免设备过热引发故障。 4. **物理安全**:包括防火、防盗、防震、防潮等措施。需要设计防火分区、安装烟雾探测和自动灭火系统,设置访问控制系统,确保只有授权人员能进入。 5. **网络架构**:规划高速、稳定、冗余的网络架构,考虑使用光纤、以太网等技术,构建层次化网络,保证数据传输的高效性和安全性。 6. **运维管理**:设计易于管理和维护的IT基础设施,例如模块化设计便于扩展,集中监控系统可以实时查看设备状态,及时发现并解决问题。 7. **绿色数据中心**:随着环保意识的提升,绿色数据中心成为趋势。采用节能设备,利用自然冷源,以及优化能源管理策略,实现低能耗和低碳排放。 8. **灾难恢复**:考虑备份和恢复策略,建立异地灾备中心,确保在主数据中心发生故障时,业务能够快速恢复。 9. **法规遵从**:需遵循国家和地区的相关法律法规,如信息安全、数据保护和环境保护等,确保数据中心的合法运营。 10. **扩展性**:设计时应考虑到未来的业务发展和技术进步,保证机房有充足的扩展空间和升级能力。 技术创新在数据中心机房基础设计及规划方案中扮演了重要角色。例如,采用虚拟化技术可以提高硬件资源利用率,软件定义网络(SDN)提供更灵活的网络管理,人工智能和机器学习则有助于优化能源管理和故障预测。 总结来说,一个完整且高效的数据中心机房设计及规划方案,不仅需要满足当前的技术需求和业务目标,还需要具备前瞻性和可持续性,以适应快速变化的IT环境和未来可能的技术革新。同时,也要注重经济效益,平衡投资成本与长期运营成本,实现数据中心的高效、安全和绿色运行。
Visio软件全套资源及教程-最新发布.zip
2000-2022年中国地级市生态韧性数据集(含原始数据、计算代码及结果,最新).zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源内容地址:https://blog.csdn.net/abc6838/article/details/143778060 2、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题 3、适用对象:大学生,本科生,研究生小白可用,容易上手!!! 4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理
Jupyter-Notebook
1949-2021年中国民政统计年鉴-最新数据发布.zip
Jupyter-Notebook
Gartner推荐全球4家专注于通过自动化和人工智能支持SOC的优秀供应商.pdf
Jupyter-Notebook
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
53朱清清 劳动教育总结报告.doc
Jupyter-Notebook
Spss26统计软件最新版-最新发布.zip
【作品名称】:基于springboot mybatis+Mysql 实现的图书管理系统 【web课程设计 】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 主要功能 登录、注销、修改密码 管理员对图书信息的增删改查、查看读者、查看借阅记录 读者对图书信息的查看查询、修改个人信息、查看借阅记录 使用技术 数据库:mysql5.7 后端框架: SpringBoot HTML模板: ThymeLeaf 持久层: Mybatis UI: Bootstrap 登录验证和用户权限: SpringSecurity 使用说明 本项目使用maven进行管理,详细安装教程自行百度 需下载mysql图形化管理工具(例如Navicat),新建数据库library,右键数据库运行项目中的library.sql脚本 用IDE打开项目(建议使用i 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
内容概要:本文详细介绍了用Python的Tkinter库创建动态心脏图形的过程。程序主要由几个部分组成:首先定义了一系列数学函数用于计算心形图的心脏坐标以及散射、收缩效果;然后构建了一个‘BeatingHeart’类来生成不同帧的心跳动画点集;最后,在主函数里调用了这个类的方法绘制出连续的心跳图像,展示了心脏的搏动过程。 适合人群:熟悉Python语言并且对Tkinter库有一定了解的开发者,特别是那些希望利用Python创建图形化应用或者动画模拟的人群。 使用场景及目标:适用于希望快速理解和实现基于Tkinter的基本二维图形与动画制作的学习者或开发者;同时也可以作为图形算法和物理模拟(如粒子系统)的教学案例。 阅读建议:本文涉及到多个函数之间的复杂调用关系,读者需要仔细跟踪每一步操作的具体意义及其参数含义。对于初学者而言,可以先尝试运行示例代码查看实际效果,然后再逐步理解每个部分的功能实现机制。
宏观面板数据整合(省市区三级)-最新数据.zip
空间计量软件及学习资料-最新更新.zip