5.UI架构 弹窗管理器

GUI编程(图形用户界面编程) GUI编程(图形用户界面编程!) 观看【狂神说Java】GUI编程入门到游戏实战视频学习笔记 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象,应用的是计算机图形学的技术。 图形用户界面 阅读详情

仿照移动端的弹窗机制写的UI架构:所有的UI窗口 在加载后都注入到弹窗管理器中进行管理开关和赋值显示。

代码架构: 1 弹窗父类Activity   2. 具体弹窗类 xxActivtiy .3.弹窗管理器AcitivtiyManger.4,传递数据类 bundle.5 加载注入类 LoadInUI.6.数据信息接受控制类xxUIController.

具体代码:

 1 弹窗父类Activity :

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Activity : MonoBehaviour
{
    //UI弹窗管理器
    public ActivityManager manager;

    //UI弹窗入口
    public virtual void OnCreate(Bundle _bundle = null) { }
    //暂停
    public virtual void OnPause() { }

    //重置
    public virtual void OnResume(Bundle _bundle = null) { }
    //退出
    public virtual void OnActivityDestory() { }
}


2. 具体弹窗类 xxActivtiy继承Activity:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public enum CurrentPanel
{
    Image_Buy,
    Image_Seal,
    Image_Make
}
//商店弹窗
public class MarketActivity : Activity
{
    [Header("关闭按钮")]
    public Image bg;
    public Button close;
    public Toggle Buy;
    public Toggle Seal;
    public Toggle Make;
    public GameObject imageBg;

    //商店等级
    public Text Lv;
    public Text adress;
    /// <summary>
    /// 价格波动 刷新时间
    /// </summary>
    public Text time;
    /// <summary>
    /// 补货       刷新时间
    /// </summary>
    public Text time_1;
    /// <summary>
    /// 今日最大出售金额
    /// </summary>
    public Text seal_Max;

    //记录当前是 购买 、 卖出 还是 制作 面板
    [HideInInspector]
    public CurrentPanel current = CurrentPanel.Image_Buy;

    [Header("Buy, Seal , Make 父物体")]
    public GameObject[] BSM;
   
    //商店主界面进入
    public override void OnCreate(Bundle _bundle = null)
    {
        #region // 商店主界面的相关设置绑定刷新赋值以及网络信息的监听操作

        //关菊花
        GameManager.Instance.activity.Flush();
        //关闭3d主场景输入控制系统
        GameManager.Instance.inputSystem.SetActiveState(false);
        this.gameObject.SetActive(true);
        //添加购买成功监听
        GameManager.Instance.gameEventDispatcher.AddEventListener(GameEventType.MarketBuySuccess, BuySuccess);
        close.onClick.AddListener(CloseMarketOnClick);
        Buy.onValueChanged.AddListener(delegate (bool isOn) { ValueChange(isOn, Buy); });

        //刷新界面
        RefreshPanel();
        SetValues();
        //关闭主界面输入控制系统
        GameManager.Instance.inputSystem.SetActiveState(false);
        #endregion

    }
    
    //商店主界面重置
    public override void OnResume(Bundle _bundle = null)
    {
        base.OnResume(_bundle);
        Debug.Log("OnResume调用了");
        SetValues();
    }

    //退出商店总界面
    public override void OnActivityDestory()
    {
        #region//退出主界面的一系列关闭 清空 解除绑定操作。

        Debug.Log("退出敞口");
        base.OnActivityDestory();
        GameManager.Instance.gameEventDispatcher.RemoveEventListener(GameEventType.MarketBuySuccess, BuySuccess);
        close.onClick.RemoveAllListeners();
        gameObject.SetActive(false);
        GameManager.Instance.inputSystem.SetActiveState(true);
        #endregion

    }

    //返回按钮
    void CloseMarketOnClick()
    {
        
        manager.PopWindow();
    }

    //商店内几个界面的切换
    void ValueChange(bool isOn, Toggle _toggle)
    {
      if (!isOn || _toggle.name == current.ToString())
        {
            return;
        }
        else
        {
            //买商品的界面
            if (_toggle.name == "Image_Buy")
            {
                current = CurrentPanel.Image_Buy;
                Buy.isOn = true;
                Seal.isOn = false;
                Make.isOn = false;
                if (GameManager.Instance.locLimit == LocationLimit.Open)
                    Session.SendQueryMarketMessage(int.Parse(AndroidSDK.GetAddress()[2]));
                else
                    Session.SendQueryMarketMessage(GameInstance.heroDate.areaCode);
                ActivieObject(BSM[0].name);
                BSM[0].transform.GetChild(2).GetComponentInChildren<MarketLayoutGroup>().ShowElement(4);

            }
            //卖商品的界面
            else if (_toggle.name == "Image_Seal")
            {

                current = CurrentPanel.Image_Seal;
                Buy.isOn = false;
                Seal.isOn = true;
                Make.isOn = false;
                #region 7.3 该资源商店 销售界面刷新问题

                if (GameManager.Instance.locLimit == LocationLimit.Open)
                    Session.SendQuerySealListMessage(int.Parse(AndroidSDK.GetAddress()[2]));
                else
                    Session.SendQuerySealListMessage(GameInstance.heroDate.areaCode);
                #endregion
                if (MainPanelContrller.Instance.openStyle == OpenMarketStyle.Skill)
                {
                    // ActivieObject(yuanwai_BSM[1].name);
                    yuanwai_BSM[1].transform.GetChild(2).GetComponentInChildren<MarketLayoutGroup>().changePanel = false;
                    // Debug.Log("changePanel" + yuanwai_BSM[1].transform.GetChild(2).GetComponentInChildren<MarketLayoutGroup>().changePanel);

                    //yuanwai_BSM[1].transform.GetChild(2).GetComponentInChildren<MarketLayoutGroup>().ShowElement(4);
                }
                else
                {
                    ActivieObject(BSM[1].name);
                    BSM[1].transform.GetChild(2).GetComponentInChildren<MarketLayoutGroup>().ShowElement(4);
                }
            }
            //制作商品的解密
            else if (_toggle.name == "Image_Make")
            {
                current = CurrentPanel.Image_Make;
                Buy.isOn = false;
                Seal.isOn = false;
                Make.isOn = true;
                ActivieObject(BSM[2].name);
                //查制作列表
                if (GameManager.Instance.locLimit == LocationLimit.Open)
                    Session.SendQueryMakeListMessage(int.Parse(AndroidSDK.GetAddress()[2]));
                else
                    Session.SendQueryMakeListMessage(GameInstance.heroDate.areaCode);
                //制造界面相同
                BSM[2].transform.GetChild(2).GetComponentInChildren<MarketLayoutGroup>().changePanel = false;
                BSM[2].transform.GetChild(2).GetComponentInChildren<MarketLayoutGroup>().ShowElement(4);
            }
        }

    }

    void ActivieObject(string go)
    {
        for (int i = 0; i < BSM.Length; i++)
        {
            if (BSM[i].name == go)
                BSM[i].SetActive(true);
            else
                BSM[i].SetActive(false);
        }
    }

    //开启界面赋值
    void SetValues()
    {
        //获取本地数据
        GameManager.Instance.allXmlData.GetXmlData<LocalizeData>(config, 12001, ref xml_data);
        UpdateSealMax(GameInstance.marketMaxSeal);
        //Debug.Log ("current" + current);
        Debug.Log("SetValues() 此方法执行了");
        if (current == CurrentPanel.Image_Buy)
        {
            BSM[0].transform.GetChild(1).GetComponentInChildren<MarketLayoutGroup>().SetAmount(GameInstance.marketGoods.Count);
        }
        else if (current == CurrentPanel.Image_Seal)
        {
            ActivieObject(yuanwai_BSM[1].name);
            BSM[1].transform.GetChild(1).GetComponentInChildren<MarketLayoutGroup>().SetAmount(GameInstance.marketSeals.Count);

        }
    }

    /// <summary>
    /// 刷新界面
    /// </summary>
    void RefreshPanel()
    {
        if (current == CurrentPanel.Image_Buy)
        {
            ActivieObject(BSM[0].name);
            BSM[0].transform.GetChild(2).GetComponentInChildren<MarketLayoutGroup>().ShowElement(4);
        }
        if (current == CurrentPanel.Image_Seal)
        {
            ActivieObject(BSM[1].name);
            BSM[1].transform.GetChild(2).GetComponentInChildren<MarketLayoutGroup>().ShowElement(4);
        }
    }
}

3.弹窗管理器AcitivtiyManger:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class ActivityManager : BaseSingleton<ActivityManager>
{
    //activity实例到储存器
    Dictionary<Type, Activity> cache;

    Stack<Activity> windows;

    public ActivityManager()
    {
        cache = new Dictionary<Type, Activity>();
        windows = new Stack<Activity>();
    }

    //注入activity实例到储存器
    public void AddActivity(Activity act)
    {
        Type t = act.GetType();

        if (!cache.ContainsKey(t))
        {
            cache.Add(t, act);
            act.manager = this;
        }
        else
        {
            Debug.LogError("Can NOT add same key");
        }
    }

    //获取对应的activity实例,并且传入Boundle类型参数调用其入口函数
    public void PushWindow(Type t, Bundle _bundle = null)
    {
        Activity temp = cache[t];


        if (windows.Count != 0)
        {
            Type topType = windows.Peek().GetType();

            //如果栈顶是当前需要获取的activity实例,则调用activity实例
            if (t == topType)
            {
                temp.OnCreate(_bundle);
                return;
            }
            else
            {
                //让当前窗口不可操作,等待需求窗口压如后弹窗
                Activity old = windows.Peek();
                old.OnPause();
            }
        }

        //activity实例压入栈
        windows.Push(temp);
        //用activity实例,传入bundle类型的参数
        temp.OnCreate(_bundle);

    }
    /// <summary>
    /// 顶部弹框是否是此类型弹框
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    public bool IsPushWindow(Type t)
    {
        bool temp = false;
        if (windows.Count != 0 && cache.ContainsKey(t))
        {
            Activity top = windows.Peek();
            Activity need = cache[t];
            if (top == need)
                temp = true;
        }
        return temp;
    }
    /// <summary>
    /// 关闭指定类型
    /// </summary>
    /// <param name="t"></param>
    /// <param name="_bundle"></param>
    public void PopWindow(Type t, Bundle _bundle = null)
    {
        JumpToActivity(t, _bundle);
        PopWindow();
        //AudioManager.Instance.PlayFX ("fx_closewindow",true);
    }
    public void PopWindow(Bundle i = null)
    {
        if (windows.Count == 0)
        {
            Debug.LogError("Pop Failed, No enough Window");
            return;
        }

        //出栈
        Activity current = windows.Pop();

        current.OnActivityDestory();
        //AudioManager.Instance.PlayFX ("fx_closewindow",true);
        if (windows.Count > 0)
        {
            Activity next = windows.Peek();
            next.OnResume(i);
        }
    }

    /// <summary>
    /// 销毁所有的窗口
    /// </summary>
    public void Flush()
    {
        //关闭窗口的声音
        if (windows.Count != 0)
        {
            AudioManager.Instance.PlayFX("fx_closewindow", true);
        }
        //销毁全部窗口实例
        while (windows.Count != 0)
        {
            Activity ac = windows.Pop();
            ac.OnActivityDestory();
        }
    }

    /// <summary>
    /// 跳到指定窗口
    /// </summary>
    /// <param name="target">Target.</param>
    public void JumpToActivity(Type target, Bundle bundle = null)
    {
        if (cache.ContainsKey(target))
        {
            Activity ac = cache[target];
            //判断是否在堆栈里
            if (windows.Contains(ac))
            {
               //新建一个队列 用于占时储存重栈中移除的非目标Activity,然后在装进栈,这样目标acitivity就在栈,直接调用关闭。
                Queue<Activity> temp = new Queue<Activity>();
                Activity current = windows.Pop();
                current.OnPause();
                while (current != ac)
                {
                    temp.Enqueue(current);
                    current = windows.Pop();
                }
                while (temp.Count > 0)
                {
                    Activity a = temp.Dequeue();
                    windows.Push(a);
                }
                windows.Push(current);
                ac.OnResume(bundle);
            }
            else
            {
                //没有入栈
                PushWindow(target, bundle);
            }
        }
        else
        {
            Debug.LogError("Type is NOT Load");
        }
    }

    /// <summary>
    /// 得到栈顶的窗口
    /// </summary>
    /// <returns>The current top activity.</returns>
    public Activity GetCurrentTopActivity()
    {
        return windows.Peek();
    }

    private void MakeRenderOrderRight(Activity a)
    {
        a.transform.SetAsLastSibling();
    }

}

4 .参赛类型Boudle:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bundle
{

	Dictionary<string , object> obj_container;
	Dictionary<string , bool> bool_container;
	Dictionary<string , string> string_container;
	Dictionary<string , int> int_containder;

	public void PutObject(string key , object o)
	{
		if(obj_container == null)
		{
			obj_container = new Dictionary<string, object> ();
		}
		if(obj_container.ContainsKey(key))
		{
			Debug.LogError ("Key have been USED");
			return;
		}
		obj_container.Add (key,o);
	}

	public object GetObject(string key)
	{
		if (obj_container.ContainsKey (key))
			return obj_container [key];
		else 
		{
			Debug.LogError ("Key is illegal");
			return null;
		}
	}

	/// <summary>
	/// 给数据放入布尔值
	/// </summary>
	/// <param name="key">Key.</param>
	/// <param name="_value">If set to <c>true</c> value.</param>
	public void PutBoolean(string key , bool _value)
	{
		if(bool_container == null)
		{
			bool_container = new Dictionary<string, bool> ();
		}
		if(bool_container.ContainsKey(key))
		{
			Debug.LogError ("Key have been USED");
			return;
		}
		bool_container.Add (key,_value);
	}

	public bool GetBoolean(string _key)
	{
		if (bool_container.ContainsKey (_key)) {
			return bool_container [_key];
		} else 
		{
			Debug.LogError ("Key is illegal");
			return false;
		}
	}

	/// <summary>
	/// 给Bundle放入字符串
	/// </summary>
	/// <param name="_key">Key.</param>
	/// <param name="_value">Value.</param>
	public void PutString(string _key , string _value)
	{
		if(string_container == null)
		{
			string_container = new Dictionary<string, string> ();
		}
		if(string_container.ContainsKey(_key))
		{
			Debug.LogError ("Key have been USED");
			return;
		}
		string_container.Add (_key,_value);
	}

	public string GetString(string _key)
	{
		if(string_container.ContainsKey(_key))
		{
			return string_container[_key];
		}
		else
		{
			Debug.LogError ("Key is illegal");
			return string.Empty;
		}
	}

	public void PutInt(string _key , int _value)
	{
		if(int_containder == null)
		{
			int_containder = new Dictionary<string, int> ();
		}
		if(int_containder.ContainsKey(_key))
		{
			Debug.LogError ("Key have been USED");
			return;
		}
		int_containder.Add (_key,_value);
	}

	public int GetInt(string _key)
	{
		if (int_containder.ContainsKey (_key)) {
			return int_containder [_key];
		} else 
		{
			Debug.LogError ("Key is illegal");
			return -1;
		}
	}
}

5.加载弹窗实例xxActivity并且注入到管理器ActivityManger中:

public class LoadINUI
{
    ActivityManger acitivityManger;
    GameObject acivityObj;

    public GameObject LoadActivityObject(string name)
    {
        acivityObj = Resources.Load<GameObject>(name);
        acivityObj.AddComponent<MarketActivity>();
        //注入
        acitivityManger.PushWindow(typeof(MarketActivity));
        return acivityObj;
    }

}

6..数据信息接受控制类xxUIController.就是在接受到信息后调用LoadInUI加载和注入Acitivity实例后调用其入口函数,依据获得的信息显示在界面上。

 

OK 这种类似移动端弹窗的架构就介绍到这来了,希望对大家有所启发和借鉴意义。哈哈。

4.unity UI ScrollRect 无限滚动条(最详细) 在游戏开发中 经常遇到滚动显示的数据 特别是商店商品 排行榜 .......等 数据很多,每一条数据去加载一个UI来显示显然对内存浪费很大,这种情况处理一般就是用几个显示条可滚动循环显示无限数据条。本篇介绍实现过程和大体思路以及可重用的滑动脚本InfinityGridLayoutGroup和MarketLayoutGroup数据管理刷新脚本。MarketElement类要看具体项目中具体数据结构... 阅读详情

相关推荐

一个非常不错的UI弹出框架

一个比较不错的提示框各种都有留存以后有需要时不用再去导出找和下载

UI层——软件统一弹窗控件

设计一个弹窗类,可实现软件的各种弹窗。

weixin_42887343的博客 223

WIN10 UI + layer弹窗 + 自适应布局

WIN10 UI + layer弹窗 + 自适应布局 自写样式和布局,借鉴了win10Ui官网的图片。 希望大家会喜欢

UI自动化测试(弹出框,多窗口)

目录一、弹出框实战二、Sina实战三、QQ邮箱错误信息的验证四、新浪邮箱错误信息的验证五、忘记密码的验证 多窗口1、在UI自动化测试中经常会遇到Alert弹出框的场景。Alert类是对话框的处理,主要是对alert警告框。confirm确认框,promp消息对话框。  text():获取alert的文本  dismiss ():点击取消  accept():接受  send-keys():输入 1、账户密码都为空 2、密码为空 3、账户为空

m0_68405758的博客 3022

基于SpringBoot+Vue的公司考勤管理系统

为什么选择我博主是优快云毕设辅导博客第一人兼开派祖师爷、博主本身从事开发软件开发、有丰富的编程能力和水平。专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流和合作。

m0_71849512的博客 1162

STM32F4的sct文件理解

原文地址http://blog.sina.com.cn/s/blog_898f36590100ya2l.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~...

weixin_34008805的博客 995

五、UI弹窗提示

协程调用方法;制作弹窗文本

akjhgi的博客 611

Unity多渠道APK打包:同一工程稳定输出不冲突安装包

Android应用多渠道分发是移动开发的基础场景,其核心在于解决包名唯一性、渠道可识别性与构建可重复性三大问题。原理上,Unity安卓打包本质是三阶段流程:生成Android工程、Gradle编译、APK签名,而包名冲突根源在生成阶段对PlayerSettings的强依赖。技术价值体现在规避人工配置失误、支撑CI/CD自动化、满足华为/小米等商店合规要求。典型应用场景包括应用宝、TapTap、B站等渠道独立包管理,以及AB测试、灰度发布等运营需求。本文聚焦Unity原生方案,通过BuildPlayerOpt

weixin_33736048的博客 794

精通UI弹窗设计的5个规范和技巧!

弹出窗口是一个浮动层,旨在激发用户的反应,需要用户与之互动。它可以告知用户关键信息,要求用户做出决定,或涉及多个操作。根据iOS和MD规范,弹出窗口可分为模态弹出窗口和非模态弹出窗口。一般来说,非模态弹出窗口用于告诉用户信息内容。除了告诉用户信息内容外,模态弹出窗口还需要用户进行功能操作。①模态弹窗用于强提醒,可以获得用户的视觉焦点。例如,“点击收到礼物”、“版本更新”等弹出窗口具有一定的强制性和干扰性,需要用户点击或关闭。常用于对话框、表单弹出窗口、项目选择弹出窗口、复杂信息显示等。

2301_79599164的博客 2045

Tribon Vitesse开发教程(一)

Tribon Vitesse简介 Tribon Vitesse是Tribon提供给Python编程语言的编程接口,它是一系列的API。使用Python的语法调用这些API,结合Python语言自身的语法生成的程序叫做Vitesse程序。Vitesse是法语“速度”的意思,读作“为戴斯”。使用Tribon Vitesse可以直接访问Tribon产品信息模型和使用Tribon应用程序的功能,以控制设计

forevermemory的专栏 2593

STM32F103+LAN9252实战:从站代码迁移中的5个硬件坑与解决方案

本文分享了将EtherCAT从站代码从STM32F767迁移至STM32F103平台时,搭配LAN9252遇到的五个典型硬件问题及解决方案。核心挑战包括时钟源不匹配、FSMC时序配置、中断映射错误、片选资源不足以及Flash烧录异常。文章通过实战经验,强调了硬件差异对代码迁移的关键影响,并提供了具体的调试思路与配置方法。

p5l2m9n4o6q的博客 698

弹窗管理工具

一个页面同时只展示一个弹窗

一个前端工作者的博客 560

模拟波束赋形 vs 数字波束赋形:5G天线设计中的成本与性能权衡

本文深入剖析了5G天线设计中模拟波束赋形与数字波束赋形的核心差异,重点探讨了二者在硬件成本、功耗、网络覆盖能力和频谱效率等方面的权衡。文章指出,模拟方案成本低但灵活性有限,数字方案性能强大但代价高昂,而混合波束赋形已成为主流折中方案。决策需紧密结合具体的部署场景、性能要求和总拥有成本进行综合考量。

weixin_28432777的博客 840

用Python的Tkinter做一个超治愈的温馨提示弹窗管理器

本文介绍了一个使用Python Tkinter库开发的温馨提示弹窗管理器,能够随机在屏幕上弹出150个暖心小贴士窗口。每个弹窗具有随机尺寸(220-300px宽,90-130px高)、随机位置(避免屏幕边缘)、柔和马卡龙色背景和40多种鼓励性文案。弹窗会在2-4秒后自动淡出,也可点击立即关闭。项目采用多线程优化弹窗创建流程,通过元组存储静态资源节省内存,并包含完善的异常处理和资源清理机制。用户可自定义弹窗数量、尺寸、文案和背景色,适合用作工作间隙的自我鼓励工具或Python GUI编程学习案例。

weixin_62988359的博客 1338

SAP ABAP CDS View 里的日期函数

摘要:本文系统介绍了ABAP CDS日期函数在企业级应用中的关键作用,包括账龄计算、合同续期等业务场景。重点解析了DATS_IS_VALID、DATS_DAYS_BETWEEN等核心函数的语义和使用边界,特别强调on_error四种异常处理策略的选择逻辑。针对系统日期获取,对比了经典CDS的参数注入和View Entity会话变量两种方式。文章还提供了完整可运行的示例代码(包含CDS视图和ABAP程序),帮助开发者快速验证不同版本下的函数行为差异,确保在实际项目中正确应用这些日期处理函数。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 380

【升级U8+】不能将值 NULL 插入列 ‘VT_ID‘,表 ‘VoucherItems‘;列不允许有 Null 值。

不能将值 NULL 插入列 ‘VT_ID’,表 ‘UFDATA_006_2012.dbo.VoucherItems’;列不允许有 Null 值。INSERT 失败。

努力不懈的为广大客户提供优质的产品与真诚、贴心、专业的服务! 517

HarmonyOS Next 弹窗系列教程(5)

本文介绍了HarmonyOS Next的两种弹出层效果:模态页面和浮层。模态页面分为半模态(bindSheet)和全模态(bindContentCover)两类。半模态支持多种形态和关闭方式,通过bindSheet绑定显示;全模态覆盖全屏,适用于大图查看等场景,通过bindContentCover触发。文章提供了两种模态的代码示例,并列出相关参数说明,帮助开发者快速实现这两种弹窗效果。

不懂先生的博客 758

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

安卓逆向学习——怎么解决APP界面广告以及系统弹窗问题

函数名称描述onCreat()一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作,例如创建View,绑定数据,注册监听,加级参数等。onStart()当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互换作。onResume()这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。onPause()

Yyx260019的博客 4803

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

基于ArkUI现有能力实现自定义弹窗封装方案

hongxiaomeng的博客 953

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从用户体验到细节之美:移动端弹窗设计

点击上方前端Q,关注公众号回复加群,加入前端Q技术交流群在当今的移动应用设计中,弹窗作为一种重要的交互元素,对于提升用户体验和增强应用的可用性具有举足轻重的作用。然而,弹窗设计并非简单的堆砌信息,它需要考虑到用户的使用习惯、心理预期以及操作流程等多个方面。因此,如何设计出优秀的移动端弹窗,成为了一个值得探讨的话题。本文旨在为设计师们提供一份全面的移动端弹窗设计指南。我们将从弹窗的定义与重要性、类...

LuckyWinty的博客 1955

ArkUI之常见弹窗组件

弹窗一般指打开应用时自动弹出或者用户行为操作时弹出的UI界面,用于短时间内展示用户需关注的信息或待处理的操作。弹窗的种类根据用户交互操作场景,弹窗可分为模态弹窗和非模态弹窗两种类型,其区别在于用户是否必须对其做出响应。为强交互形式,会中断用户当前的操作流程,要求用户必须做出响应才能继续其他操作,通常用于需要向用户传达重要信息的场景。为弱交互形式,不会影响用户当前操作行为,用户可以不对其进行回应,通常都有时间限制,出现一段时间后会自动消失。一般用于告诉用户信息内容外还需要用户进行功能操作的场景。说明。

weixin_67448099的博客 2048

开发中Dialog多弹窗管理

随着项目的不断迭代,加上产品经理大法(这里加一个弹窗提示,这里加一个引导….)各种弹窗在应用启动时候需要展示, 然而它们出现的时机还有可能重叠。我勒个擦。。。有没有一种优(tou)雅(lan)的方式来完成这部分的需求呢?没错,这就是我们今天要介绍的东西. 我们想的是需要一个队列来管理弹窗,在各种请求回来之后去往队列中添加我们需要显示的弹窗,第一个弹窗消失了之后在显示下一个弹窗,往复下去直到任务完...

肤浅失眠中 3566

APP内弹窗管理方案

PopOverlay App 内弹窗管理器 github 提供功能: 面向协议,为view,vc 等,提供弹窗能力。 在app生命周期内,任何位置,快速任意添加一个弹窗。 易拓展,方便二次开发 解决场景: App内的很多view 或者 vc 已经开发完成。 需要更改弹出样式为 pop App启动登陆时,很多通知弹窗。 讨论 其他实现方式: 1.1.1. 代码硬编: 在每个业务view消...

weixin_33971130的博客 1097

iOS弹框统一管理器

由于多个业务需要,在一个界面会有多个弹框的存在,而这多个弹框需要按顺序、优先级给统一管理起来,不然会杂乱无章的弹出,用户会一脸懵逼啊。 我写了一个管理器,把弹框的出现和消失给管理起来,出现和消失的时机给管理起来。 AlertManager不关心怎么显示和消失,也就是不关系的UI层面,只管理显示和消失两个block事件。 实现的功能: 统一管理弹框 弹框叠加显现 弹框依次显现 弹框的优先级排序 弹框被拦截缓存起来;允许激活会在别的弹框消失后显示 头文件 @interface AlertManager .

郑帅伟的专栏 1087

layui框架——弹出层layer

两种调用方法: 1、引用独立的layer.js文件 引入好layer.js后,直接用即可 <script src="layer.js"></script> <script> layer.msg('hello'); </script> 2、调用layui中的layer模块 layui.use('layer', function(){ ...

meixu568的专栏 9万+

Android弹窗优先级管理高级应用

之前我写过一篇Android优雅实现弹窗优先级管理来介绍如何在android日常开发中管理多个弹窗的优先级,这个解决方案也被其他开发者所采用,在这里也感谢大家的认可。 我们常说世界上唯一不变的就是变化,开发的业务场景也在不停地变化,所以之前的弹窗管理解决方案在某些业务上则有场景的限制了,比如Android优雅实现弹窗优先级管理更偏向于将各个自定义的Dialog(api上的Dialog)纳入管理,且每个Dialog需要实现我们约定好的“Dialog Interface”,这样的话某种意义上已经对自定义Dia

MuMuSir的博客 3086
上一篇: 4.unity UI ScrollRect 无限滚动条(最详细)
下一篇: Unity 中配置文件Excel 转xml ;josn;序列化ScriptableObject及加载(最详细)。
东皇十三妖
博客等级 码龄9年 8粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值