一种移出视图对象的方法及相关装置与流程

文档序号:18894246发布日期:2019-10-15 22:39阅读:697来源:国知局
一种移出视图对象的方法及相关装置与流程

本申请涉及直播平台开发领域,尤其涉及一种移出视图对象的方法及相关装置。



背景技术:

在直播间的开发过程中,会有很多图标挂件的显示空间,多个图标挂件可能显示在同一显示区域,即多个图标挂件的位置可能相同也可能不相同,且有些图标挂件之间还可能存在一些互斥的业务逻辑关系。传统方案中,会编写大量的业务逻辑功能来解决图标挂件之间的互斥关系。但是,当图标挂件的数量越来越多时,会导致维护的难度和成本增加。

现有技术中,采用android系统中的控件recycleview来承载图标挂件的显示空间,并从集合listview中顺序获取图标挂件以进行循环展示。然而,在实际应用的一些场景中,例如广告图标需要随机显示几次后就不再显示,即在一图标显示随机次数后便要求不再显示,因此如何提供更灵活满足更多需求的图标显示方式是一个值得研究的课题。



技术实现要素:

本申请实施例提供了一种移出视图对象的方法及相关装置,用于提高视图对象显示的多样性和稳定性。

本申请实施例的第一方面提供了一种移出视图对象的方法,应用于移动终端,包括:将数据结构类中的多个视图对象插入循环链表,所述循环链表用于循环显示所述多个视图对象;获得所述循环链表中各视图对象的哈希hash值,并将所述各视图对象的hash值与所述各视图对象对应保存到所述数据结构类中,所述hash值用于表示对象的唯一描述信息;定义全局变量,所述全局变量用于指向当前正在显示的视图对象的hash值;获取随机数据m,所述随机数据为整数型,所述随机数据m不大于所述循环链表中视图对象的个数;从所述循环链表的第一个视图对象开始,遍历所述循环链表,直至遍历到第m个视图对象;根据所述第m个视图对象的hash值确定所述第m个视图对象是否为当前正在显示的视图对象;若不是,则从所述循环链表中删除所述第m个视图对象。

在一种可能的实施例中,所述获得所述循环链表中各视图对象的哈希hash值,并将所述各视图对象的hash值与所述各视图对象对应保存到所述数据结构类中包括:通过调用所述数据结构类priorityview中的函数priorityview.hashid()得到所述循环链表中各视图对象的hash值itemhash;通过调用所述数据结构类priorityview中的函数priorityview.sethash(itemhash)将所述各视图对象的hash值itemhash封装到所述数据结构类priorityview中。

在一种可能的实施例中,所述获取随机数据包括:构建随机数选取集合,所述随机数选取集合的取值范围为(0,count]之间的整数,所述count用于表示所述循环链表中视图对象的个数;通过调用函数math.random(0,count)从所述随机数选取集合选取所述随机数据。

在一种可能的实施例中,所述从所述循环链表的第一个视图对象开始,遍历所述循环链表,直至遍历到第m个视图对象包括:定义临时变量tempcount,并将所述临时变量tempcount的值初始化为0;从所述循环链表的第一个视图对象开始,每遍历一个视图对象,将所述临时变量tempcount的值加1;判断所述临时变量tempcount的值是否等于所述随机数据m;若是,则确定遍历的视图对象为所述第m个视图对象,并停止遍历所述循环链表。

在一种可能的实施例中,所述根据所述第m个视图对象的hash值确定所述第m个视图对象是否为当前正在显示的视图对象包括:通过调用函数itemm.gethashid()获取所述第m个视图对象的hash值;通过调用函数textutils.equals(currenthashitem,hashidm)判断所述第m个视图对象的hash值hashidm与所述全局变量指示的当前正在显示的视图对象的hash值currenthashitem是否一致;若是,则确定所述第m个视图对象为当前正在显示的视图对象;若否,则确定所述第m个视图对象不为当前正在显示的视图对象。

在一种可能的实施例中,所述方法还包括:构建数据集合nextarray,所述数据集合nextarray包括随机分布的n个元素,所述n个元素分为m类参数{a1,a2…am},所述各类参数的值互不相同,所述m为所述循环链表中视图对象的个数,所述各类参数用于表示所述循环链表中各视图对象,所述各类参数的个数总和为所述n,所述各类参数的个数比例为预设的所述循环链表中各视图对象的显示概率比例;通过调用函数system.currenttimemills()获取当前的系统时间time;根据所述当前的系统时间time确定所述数据集合nextarray中的第t个元素,并显示目标视图对象,所述第t个元素对应的参数用于表示所述目标视图对象。

在一种可能的实施例中,所述根据所述当前的系统时间time确定所述数据集合nextarray中的第t个元素包括:通过以下公式计算所述t;t=time%(m*n);根据所述余数t在所述数据集合nextarray索引所述第t个元素。

本申请实施例的第二方面提供了一种移动终端,包括:插入单元,用于将数据结构类中的多个视图对象插入循环链表,所述循环链表用于循环显示所述多个视图对象;获取单元,用于获得所述循环链表中各视图对象的哈希hash值,并将所述各视图对象的hash值与所述各视图对象对应保存到所述数据结构类中,所述hash值用于表示对象的唯一描述信息;定义单元,用于定义全局变量,所述全局变量用于指向当前正在显示的视图对象的hash值;所述获取单元还用于获取随机数据m,所述随机数据为整数型,所述随机数据m不大于所述循环链表中视图对象的个数;遍历单元,用于从所述循环链表的第一个视图对象开始,遍历所述循环链表,直至遍历到第m个视图对象;判断单元,用于根据所述第m个视图对象的hash值确定所述第m个视图对象是否为当前正在显示的视图对象;删除单元,用于若不是,则从所述循环链表中删除所述第m个视图对象。

本申请第三方面提供了一种电子设备,包括存储器、处理器,其特征在于,所述处理器用于执行存储器中存储的计算机管理类程序时实现如上述任意一项所述的方法的步骤。

本申请第四方面提供了一种计算机可读存储介质,其上存储有计算机管理类程序,其特征在于:所述计算机管理类程序被处理器执行时实现如上述任意一项所述的方法的步骤。

从以上技术方案可以看出,本申请实施例具有以下优点:将数据结构类中的多个视图对象插入循环链表,所述循环链表用于循环显示所述多个视图对象;获得所述循环链表中各视图对象的哈希hash值,并将所述各视图对象的hash值与所述各视图对象对应保存到所述数据结构类中,所述hash值用于表示对象的唯一描述信息;定义全局变量,所述全局变量用于指向当前正在显示的视图对象的hash值;获取随机数据m,所述随机数据为整数型,所述随机数据m不大于所述循环链表中视图对象的个数;从所述循环链表的第一个视图对象开始,遍历所述循环链表,直至遍历到第m个视图对象;根据所述第m个视图对象的hash值确定所述第m个视图对象是否为当前正在显示的视图对象;若不是,则从所述循环链表中删除所述第m个视图对象。本申请实施例中,通过设置每个视图对象的hash值,并根据随机数据从循环链表中随机选择第m个视图对象,且在根据第m个视图对象的hash确定并不是当前显示的视图对象后,将第m个视图对象从循环链表中删除,提高了视图对象显示的多样性的同时,也保证了显示的稳定性。

附图说明

图1为本申请实施例提供的一种可能的移出视图对象的方法的流程图;

图2为本申请实施例提供的一种可能的移动终端的结构示意图;

图3为本申请实施例提供的一种可能的电子设备的硬件结构示意图;

图4为本申请实施例提供的一种可能的计算机可读存储介质的硬件结构示意图。

具体实施方式

本申请实施例提供了一种移出视图对象的方法及相关装置,用于提高视图对象显示的多样性和稳定性。

下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

在循环链表中,所有的图标即视图对象都是循环显示的,但是有一些应用场景例如广告图标需要随机显示几次后就不在显示,也就是说显示次数随机几次后该图标是需要删除的。为了满足该需求,本申请提供了一种移出视图对象的方法,请参阅图1,为本申请实施例提供的一种移出视图对象的方法的流程图,具体包括:

101、将数据结构类中的多个视图对象插入循环链表;

传统方案中,会使用集合来管理一系列数据,但是如果使用集合来管理数据的时候对数据的插入和删除的性能开销是非常大的,这样整个数据插入和删除会非常慢且效率低下。考虑到链表具备插入和删除数据高效的特点,因此为了能够更好的对视图对象进行管理,定义一个链表的数据结构来对数据结构类priorityview中的视图对象view进行处理,具体定义该链表的函数表达式为linklink=newlink(),本申请实施例中,将该链表可称为循环链表。

可选的,在定义好循环链表link后,将数据结构类priorityview中的多个视图对象view按照显示优先级从高到低的顺序插入到循环链表link中。具体地,当有第一个视图对象priorityview1需要插入循环链表link的时候,通过调用函数link->head=priorityview1进行插入;接下来当有第二个视图对象priorityview2需要插入的时候,通过调用link->head方法来获取第一个视图对象priorityview1,然后再通过调用函数priorityview1.getdypriority()获取视图对象priorityview1的优先级对象的值假设为level1,通过调用函数priorityview2.getdypriority()获取视图对象priorityview2的优先级对象的值假设为level2,需要说明的是,优先级对象的值用于表示显示优先级,该优先级对象的值与显示优先级负相关,即优先级对象的值越大,显示优先级越小;反之,优先级对象的值越小,显示优先级越大。在获得视图对象priorityview1和视图对象priorityview2的优先级对象的值后,判断两者优先级对象的值即判断level1与level2的大小信息,如果level2比level1大,说明视图对象priorityview2的显示优先级更低,可以再进一步判断视图对象priorityview1的下一个元素的优先级对象的值与level2的大小,如果发现priorityview1->next为空,说明priorityview1就是最后一个元素了,因此就可以判定level2所对应的视图对象priorityview2应该插入到视图对象priorityview1之后。

类似的,当有视图对象priorityview3的时候,首先获取该视图对象priorityview3的优先级对象的值假设为level3,然后依次判断level3与leve1、level2的大小,将level3插入到相邻的优先级对象的值之间即可,如果是优先级相等的时候继续与后续的元素进行比较,直到比较到循环链表的末尾或者优先级的值大于level3的值为止,然后将该视图对象priorityview3插入到之间。为便于理解,如果原来循环链表中有2个元素其关系是priorityview1->priorityview2,即level1小于level2。在进行优先级对象的值的比较后,确定level1<level3<level2,则将视图对象priorityview3插入到视图对象priorityview1和视图对象priorityview2之间,具体地,可以通过调用函数priorityview3->next=priorityview1->next以及priorityview1->next=priorityview3将视图对象priorityview3插入到视图对象priorityview1和视图对象priorityview2之间。后面再将数据结构类priorityview中的视图对象采用类似的方式插入循环链表link中,直至数据结构类priorityview中的视图对象全部插入到循环链表link中为止。

因此,通过上述的方式是来实现循环链表link的元素管理后,整个循环链表link中的显示优先级就是有序的,也就是说从头部到尾部显示优先级依次降低。

可选的,本申请实施例中,还可以将数据结构类priorityview中的多个视图对象随机插入循环链表link,因此,将数据结构类priorityview中的多个视图对象插入循环链表link的方式有多种,具体此处不做限定。

102、获得循环链表中各视图对象的hash值,并将各视图对象的hash值与各视图对象对应保存到数据结构类中;

由于视图对象是存储在循环链表link中的,为了对多个视图对象进行管理,需要获得循环链表中每个视图对象的hash值并进行对应保存,即将该hash值封装到数据结构类priorityview的视图对象中,具体的,通过定义一个string字符串类型的变量hash,在数据结构类priorityview的视图对象中添加hash标签。

需要说明的是,获取每个视图对象的hash值并进行对应存储的方式具体包括:通过调用函数priorityview.hashid()方法来计算出视图对象的哈希值itemhash,再通过调用函数priorityview.sethash(itemhash)将获得的哈希值itemhash封装到数据结构类priorityview中对应的视图对象里,因此该视图对象就包含了一个对该视图对象的唯一描述信息hash值itemhash。

采用同样的方式,针对循环链表link中的所有的视图对象,都获取其hash值信息并与视图对象对应保存到数据结构类priorityview中。

103、定义全局变量;

接下来还需要定义一个全局变量currenthashitem,并通过调用函数stringcurrenthashitem=null并将该全局变量初始化为一个空对象null,其中,该全局变量currenthashitem主要用于指向当前正在显示的视图对象的hash值itemhash。例如,当循环链表link移动链表指针指向下一个展示的视图对象itme2时,需要通过调用函数itme2.gethashid()方法来获取到该视图对象的hash值,然后通过调用函数currenthashitem=itme2.gethashid()将获取到的hash值的引用关系传递给全局变量currenthashitem,这样全局变量currenthashitem就指向了当前正在显示元素的hash值了。因此,通过该全局变量currenthashitem,可以确定某元素是否为当前正在显示的元素。

104、获取随机数据m;

接下来需要通过获取随机数据m来筛选出需要在循环链表link中随机删除的视图对象。具体地,构建随机数选取集合,其中,随机数选取集合的取值范围为(0,count]之间的整数,该count用于表示循环链表link中视图对象的个数;再通过调用函数math.random(0,count)输出参数m,以实现从随机数选取集合选取随机数据m。

105、从循环链表的第一个视图对象开始,遍历循环链表,直至遍历到第m个视图对象;

在确定了随机数据m后,从循环链表link的第一个视图对象开始,遍历该循环链表link,直至遍历到第m个视图对象,即停止遍历。具体地,定义临时变量tempcount,并通过调用函数inttempcount=0将临时变量tempcount的值初始化为0;从循环链表的第一个视图对象开始,每遍历一个视图对象,将临时变量tempcount的值加1;每遍历完成一个视图对象,则判断当前的临时变量tempcount的值是否等于随机数据m;若是,则确定遍历的视图对象为第m个视图对象,并停止遍历循环链表,该第m个视图对象即为需要从循环链表link中删除的视图对象;反之,若否,则继续遍历下一个视图对象。

106、根据第m个视图对象的hash值确定第m个视图对象是否为当前正在显示的视图对象;

需要说明的是,正常流程下如果找到需要删除的视图对象即第m个视图对象后,就直接对第m个视图对象进行删除即可,但是考虑到如果找到的这个视图对象就是当前正在显示的视图对象,那么将一个正在显示的视图对象直接删除掉将有可能会出现导致页面崩溃。有鉴于此,需要根据第m个视图对象的hash值确定第m个视图对象是否为当前正在显示的视图对象。具体地,将第m个视图对象标记为itmem,通过调用函数itmem.gethashid()来获取到第m个视图对象itmem的hash值,然后将获取到的hash值标记为hashidm,将hashidm与前文描述的currenthashitem的内容进行比较,具体的比较函数是textutils.equals(currenthashitem,hashidm),如果相同就返回true;否则返回false。如果该函数返回true表示hashidm与currenthashitem的内容相同,也就是第m个视图对象是正在显示的视图对象,反之,如果该函数返回false表示hashidm与currenthashitem的内容不相同,也就是第m个视图对象并不是正在显示的视图对象。

107、若不是,则从循环链表中删除第m个视图对象;

若第m个视图对象并不是正在显示的视图对象,则直接从循环链表中删除第m个视图对象。

可选的,若第m个视图对象是正在显示的视图对象,则不能做删除操作,需要重新执行上述的随机数筛选,筛选出另外一个随机数来进行处理。需要说明的是,在极端情况下连续删除随机数筛选都筛选出当前正在显示的元素后,就不在做随机数的筛选操作了,此时直接删除当前显示的视图对象的前一个视图对象。如果当前显示的视图对象是循环链表link的第一个元素,就直接删除该循环链表link的最末尾的那个元素。

因此,通过上述方式就能够随机的从链表link中删除视图对象。

需要说明的是,通过循环链表link显示视图对象时,所有的视图对象都是显示一次后就开始顺序的显示下一个视图,也就是说同一个视图对象显示的时候需要等待整个循环链表link中的所有视图对象全部显示完一整圈后才能再次显示该视图对象。但是在实际应用的某些场景中,例如为了营销目标会嵌入一些广告,希望广告的曝光率会更高,也就是说希望更大概率的会多次重复展示该广告内容,为了满足该需求本申请实施例还提供了一套解决方案,具体的实现方法如下几个步骤所述:

108、构建数据集合nextarray;

构建数据集合nextarray,其中,数据集合nextarray包括随机分布的n个元素,该n个元素分为m类参数{a1,a2…am},各类参数的值互不相同,其中m为循环链表link中视图对象的个数,各类参数用于表示循环链表link中各视图对象,各类参数的个数总和即为n,且各类参数的个数比例为预设的循环链表link中各视图对象的显示概率比例。

为便于理解,以下将通过具体的举例进行描述:

假设循环链表link中包括3个视图对象分别是a、b和c,即上述m的取值为3,且要求该3个视图对象的显示概率分别为10%,60%,30%,即显示概率比例为1:6:3。故为达到该目的,首先通过调用函数int[100]array=newint[]构建一个数组array,且该数组array可放入100个元素。接下来为了使得这三个视图对象的概率分布为10%,60%,30%,可以对a、b、c分别定义一个不同的参数,为便于描述,将该参数定义成一个int类型的整数,该参数用于唯一描述视图对象。可选的,假设inta=1,intb=2,intc=3,即参数1用于表示视图对象a,参数2用于表示视图对象b,参数3用于表示视图对象c。需要说明的是,参数的取值可以有多种,只需要保证参数的唯一性即可,即a、b、c的取值不能出现相同的参数。

接下来通过循环的方式从循环链表link中一次取出视图对象a、b、c的参数信息存储到数组array中,即将代表视图对象a的10个1、代表视图对象b的60个2和代表视图对象c的30个3,依次按顺序取出并存储到数组array中,因此该数据array中当前存储有100个参数。接下来通过调用函数math.random(1,100)从区间[1,100]中随机选取数据i1,然后通过调用函数nt[100]nextarray=newint[]构建一个新的数组即数据集合nextarray;并且将数组array中的第i1个数据对应的参数存储到数据集合nextarray中。然后再将该区间[1-100]分为[1,i1)和(i1,100]这两个区间,其中[表示可以相等;(表示不能相等的含义,则下一次再通过调用函数math.random(1,i1)从区间[1,i1)中获取随机数i2,获取后将[1,i1)拆分成2个小区间[1,i2)和(i2,i1],并将数组array中的第i2个数据对应的参数存储到数据集合nextarray中;类似的,也通过调用函数math.random(i1,100)从区间(i1,100]中获取随机数i3,获取后将(i1,100]也拆分成2个小区间(i1,i3)和(i3,100],并将数组array中的第i3个数据对应的参数存储到数组nextarray中,即每次获取到数据后,都将获取到的数据在数组array对应的参数按获取顺序存储到nextarray集合中,直到数组array中的参数全部存储到数据集合nextarray中,即上述数据集合nextarray包括n个元素的n取值为100。此时数据集合nextarray中的元素就是完全乱序了,且这个乱序的数据集合nextarray中包含了10个1,60个2和30个3,以分别对应10个视图对象a,60个视图对象b和30个视图对象c。

因此,通过上述方式,实现了数据集合nextarray包括随机分布的n个元素,该n个元素包括的m类参数的值互不相同,且各类参数的个数比例为预设的循环链表link中各视图对象的显示概率比例。故在顺序播放该数据集合nextarray中的元素时,可以实现元素播放的随机性。

109、获取当前的系统时间time;

110、根据当前的系统时间time确定数据集合nextarray中的第t个元素,并显示目标视图对象。

在构建了数据集合nextarray后,当需要显示其中的视图对象时,可以首先通过调用函数system.currenttimemillis()函数来获取到当前的系统时间信息time,然后根据当前的系统时间time确定数据集合nextarray中的第t个元素,具体地,通过以下公式计算所述t;

t=time%(m*n);

其中,m用于表示循环链表link中视图对象的总个数,n用于表示数据集合nextarray中元素的个数,将当前的系统时间信息time与m*n求余,得到该余数t;

因此在确定了余数t后,在数据集合nextarray索引第t个元素,第t个元素对应的参数用于表示目标视图对象,故确定了该目标显示对象后,进行显示处理。可以理解的是,通过当前时间来确定目标显示对象,更加增强了元素显示的随机性。另外,本申请实施例中,除了通过上述公式确定目标显示对象外,还包括按照数据集合nextarray的元素顺序来显示目标视图对象,或者通过随机数生成器随机生成数字x,该数字x为不大于n的正整数,通过数字x在数据集合nextarray索引第x个元素,第x个元素对应的参数用于表示目标视图对象。因此,确定目标显示对象的方式有多种,具体此处不做限定。

需要说明的是,步骤108至步骤110与步骤102至107并没有特定的执行顺序,即可以先执行步骤108至步骤110,后执行步骤102至107,也可以先执行步骤102至107,后执行步骤108至步骤110,或者同时执行,具体此处不做限定。

需要说明的是,实际应用中,通过控件recycleview显示图标,在删除或者增加图标挂件时,会刷新所有图标挂件,对性能有较大的损耗而引起闪屏,导致显示效果较差。故本申请实施例中,还提供了一种更新图标的方法,以提高更新图标时的显示效果并增加更新图标的便捷性,具体包括以下步骤:

步骤1、定义视图容器类mycontainer;

首先定义一个视图容器类mycontainer,使该视图容器类mycontainer通过extends的方式来集成android系统的一个线性布局(linearlayout)容器。具体地,可通过publicclass语句来定义该视图容器类mycontainer,其中,public可以修饰类,表示公共的访问权限,具体定义视图容器类mycontainer的实现函数包括:

publicclassmycontainerextendslinearlayout;

然后在视图布局文件xml中通过xml标签来定义视图容器类mycontainer的视图标签,在定义该视图标签的时候对视图容器类mycontainer设置宽度和高度,具体地,通过调用函数android:width=“adp”和函数android:height=“bdp”将视图容器类mycontainer的视图标签的宽度和高度分别设置为adp和所述bdp。需要说明的是,在不同的应用场景下,a和b的取值不同,例如实际应用中,可将a设置为100,b设置为50,或者a和b为其他参数,具体此处不做限定。

步骤2、构建对象mimageview;

当需要添加一个视图到视图容器类mycontainer中的时候,需要动态的构建一个imageview类型的对象mimageview,其中,imageview是android系统提供的一个可以容纳视图的容器对象,主要功能为显示图片。具体的,通过调用函数imageviewmimageview=newimageview()来构建对象mimageview。

构建过程中,还需要对对象mimageview设置其大小信息,使对象mimageview完全填充视图容器类mycontainer布局的空间。具体设置对象mimageview的大小如下:先构建布局对象layoutparmas,由于视图容器类mycontainer是一个linearlayout类型的容器,因此该布局对象的类型也为linearlayout.params,具体地,通过调用函数linearlayout.paramslayoutparmas=newlinearlayout.params()构造该布局对象layoutparmas。然后设置该布局对象layoutparmas的大小,具体地,通过调用函数layoutparmas.width=linearlayout.layoutparam.match_parent来设置布局函数的宽度以填充父布局,本申请实施例中,父布局为视图容器类mycontainer布局的空间。同理,通过调用函数youtparmas.height=linearlayout.layoutparam.match_parent来设置布局函数的高度以填充父布局,这样布局对象layoutparmas就能够完全的占满父布局的内容空间。

在设置了布局对象layoutparmas的大小后,再通过调用对象mimageview中的函数mimageview.setlayoutparams(layoutparmas)将布局对象layoutparmas设置到对象mimageview中去,这样对象mimageview就能够完全的填充mycontainer布局的空间大小了。

步骤3、为对象mimageview设置手势监听器,以使得对象mimageview识别手势操作;

需要说明的是,在构建了对象mimageview后,调用函数addview(mimageview)来将对象mimageview中的内容填充到视图容器类mycontainer中去,这样对象mimageview就占据了整个视图容器类mycontainer的大小,但是由于刚构建的对象mimageview中没有填充任何内容信息,因此显示的就是一个透明的区域,即界面上还不会显示任何内容信息。故本申请实施例中,可以通过函数addview()在视图集合listview中填充视图,为便于描述,将填充的视图称为图标view,具体地,在视图集合listview中填充视图包括:定义一个添加视图view的函数addview(),具体的函数定义方法包括:publicvoidaddview(viewgroupview),其中,函数addview()是一个公有(public)类型的函数,该函数addview()的返回值是一个void类型的返回类型,为了能够兼容复杂的视图,该函数addview()的输入参数设置为viewgroup类型的view。在函数addview()内部,首先需要通过view==null的方式来判断一下图标view是否是一个空(null)对象;如果是空对象,通过调用return方法来结束整个添加流程;如果view不是空对象,通过调用函数listview.contains(view)方法来判定视图集合listview中是否已经包含了图标view;如果视图集合listview中已经包含了该图标view,通过调用函数return来结束掉整个流程;如果视图集合listview中不包含该图标view,通过调用函数listview.add(view)方法来将图标view添加到视图集合listview中。

故通过函数addview()向视图集合listview填充图标view后,视图集合listview中就会有数据了,再通过调用函数mimageview.setbackground(view)方法来将视图集合listview中的图标view填充到对象mimageview中,这样界面上就能够完整的显示出图标view的内容信息了。

然而,由于该对象imageview是一个静止的图标,当用户滑动该图标的时候并不会出现滑动的效果,因此需要为对象mimageview设置手势监听器,以使得对象mimageview识别手势操作。具体地,通过调用函数mimageview.setontouchlintener(this)为对象mimageview设置手势监听器,因此,对象mimageview就可以识别出手势在对象mimageview上的相关性。

步骤4、接收针对对象mimageview的第一手势操作;

步骤5、响应于第一手势操作,将视图集合listview中的图标view放入对象mimageview中;

步骤6、将更新后的对象mimageview中的内容放入视图容器类mycontainer;

当用户需要对对象mimageview中的内容进行更新操作时,通过对对象mimageview的第一手势操作指示进行更新操作,其中,该更新操作可以为增加图标或者移除图标,该第一手势操作可以为滑动操作或者其他操作,此处不做限定。具体地,接收针对对象mimageview的第一手势操作后,响应于该第一手势操作,从视图集合listview中取出下一个图标view,并将该图标view填充到mimageview对象中,这样就达到了滑动的时候更换mimageview中内容的方法,从而实现了滑动更换图标的目的。

具体地,当该更新操作用于增加图标时,判断更新操作所指示的待新增图标是否为空null对象;若待新增图标不为空对象,则判断视图集合listview中是否存在待新增图标;若视图集合listview中不存在待新增图标,通过调用函数listview.add()将待新增图标添加到视图集合listview中,函数listview.add()的输入参数为待新增图标。

当该更新操作用于移除图标时,判断更新操作所指示的待移除图标是否为空null对象;若待移除图标不为空对象,则判断视图集合listview中是否存在待新增图标;若视图集合listview中存在待移除图标,通过调用函数listview.remove()将视图集合listview中的待移除图标删除,函数listview.remove()的输入参数为待移除图标。

因此,将进行了新增图标或者删除图标后的视图集合listview中的图标view放入对象mimageview中,即在自定义的视图容器类mycontainer中实现了recycleview的类似功能,且并没有不断刷新所有视图的操作。同时由于没有数据适配器等一系列的操作,整个操作便捷性也是优于recycleview的。

可选的,在实际应用的一些场景中,会要求个别图标的长时间显示,即根据需求对图标的显示时长进行自定义,因此本申请实施例还提供了一种视图对象的显示方法,使视图对象的显示更加灵活且自动化,具体包括以下步骤:

步骤1、定义数据结构类;

为了满足实际应用中,需要优先显示某些图标的需求,对各视图对象定义优先级,可以理解的是,视图对象的优先级越高,越优先显示该视图对象即图标。首先,需要设计一个数据结构类priorityview,该数据结构类priorityview包括两个字段信息,其一是viewgroup类型的视图对象view,还有一个与各视图对象view对应的优先级对象dypriority,其中优先级对象dypriority用于表示视图对象的显示优先级,该优先级对象dypriority有多个,该多个优先级对象dypriority包含在优先级类dypriority中。需要说明的是,优先级对象的值与显示优先级负相关,即优先级对象的值越大,对应的显示优先级越低;优先级对象的值越小,对应的显示优先级越高。其中,优先级类dypriority的具体定义方式的函数表达可能如下:

publicenumdypriority{

level_one=1,

level_two=2,

level_three=3,…};

其中,该优先级类dypriority为公有(public)类型的类,public可以修饰类,表示公共的访问权限,使得其他类具备访问该优先级类dypriority的权限。另外,优先级类dypriority中的每一个优先级对象如level_one、level_two等是具有唯一性的,由于枚举(enum)类型的类具备枚举的每一个值都不重复的特点,故将该优先级类dypriority设置为enum类型。需要说明的是,每个优先级对象可以映射一个数值,如优先级对象level_one映射数字1,优先级对象level_two=2映射数字2等,数字越大表示显示优先级越低,数字越小表示显示优先级越高。实际应用中,优先级对象映射的数值还可以为其他数字,能满足优先级对象映射的数值与显示优先级负相关的条件即可,故具体优先级对象映射的数值此处不做限定。

因此,数据结构类priorityview就存储有多个viewgroup类型的视图对象view和每个视图对象对应的优先级对象了。

步骤2、将多个视图对象按照显示优先级从高到低的顺序插入到循环链表中;

传统方案中,会使用集合来管理一系列数据,但是如果使用集合来管理数据的时候对数据的插入和删除的性能开销是非常大的,这样整个数据插入和删除会非常慢且效率低下。考虑到链表具备插入和删除数据高效的特点,因此为了能够更好的对视图对象进行管理,定义一个链表的数据结构来对数据结构类priorityview中的视图对象view进行处理,具体定义该链表的函数表达式为linklink=newlink(),本申请实施例中,将该链表可称为循环链表。

在定义好循环链表link后,将数据结构类priorityview中的多个视图对象view按照显示优先级从高到低的顺序插入到循环链表link中。具体地,当有第一个视图对象priorityview1需要插入循环链表link的时候,通过调用函数link->head=priorityview1进行插入;接下来当有第二个视图对象priorityview2需要插入的时候,通过调用link->head方法来获取第一个视图对象priorityview1,然后再通过调用函数priorityview1.getdypriority()获取视图对象priorityview1的优先级对象的值假设为level1,通过调用函数priorityview2.getdypriority()获取视图对象priorityview2的优先级对象的值假设为level2。在获得视图对象priorityview1和视图对象priorityview2的优先级对象的值后,判断两者优先级对象的值即判断level1与level2的大小信息,如果level2比level1大,说明视图对象priorityview2的显示优先级更低,可以再进一步判断视图对象priorityview1的下一个元素的优先级对象的值与level2的大小,如果发现priorityview1->next为空,说明priorityview1就是最后一个元素了,因此就可以判定level2所对应的视图对象priorityview2应该插入到视图对象priorityview1之后。

类似的,当有视图对象priorityview3的时候,首先获取该视图对象priorityview3的优先级对象的值假设为level3,然后依次判断level3与leve1、level2的大小,将level3插入到相邻的优先级对象的值之间即可,如果是优先级相等的时候继续与后续的元素进行比较,直到比较到循环链表的末尾或者优先级的值大于level3的值为止,然后将该视图对象priorityview3插入到之间。为便于理解,如果原来循环链表中有2个元素其关系是priorityview1->priorityview2,即level1小于level2。在进行优先级对象的值的比较后,确定level1<level3<level2,则将视图对象priorityview3插入到视图对象priorityview1和视图对象priorityview2之间,具体地,可以通过调用函数priorityview3->next=priorityview1->next以及priorityview1->next=priorityview3将视图对象priorityview3插入到视图对象priorityview1和视图对象priorityview2之间。后面再将数据结构类priorityview中的视图对象采用类似的方式插入循环链表link中,直至数据结构类priorityview中的视图对象全部插入到循环链表link中为止。

因此,通过上述的方式是来实现循环链表link的元素管理后,整个循环链表link中的显示优先级就是有序的,也就是说从头部到尾部显示优先级依次降低。

步骤3、将循环链表的最后一个元素指向循环链表的第一个元素;

需要说明的是,将多个视图对象按照显示优先级从高到低的顺序插入到循环链表后,

当需要依次从循环链表link中取出视图对象进行显示时,在取到循环链表link的末尾的时候,需要需要手动调节数据指针的指向,将循环链表link的指针再次指向头部从头再次循环进行显示,这个流程就比较麻烦。有鉴于此,本申请实施例中,可以将循环链表link的最后一个元素默认指向循环链表link的第一个元素,这样整个循环链表就构建成了一个环形结构,无论怎么循环都不会存在结尾的情况。具体地,判断当前显示的视图对象在循环链表link中的下一个元素是否为空null;若是,则确定当前显示的视图对象为循环链表link的最后一个元素,并通过调用函数priorityviewl->next=priorityviewf将当前显示的视图对象指向循环链表的第一个元素,其中,priorityviewl用于表示当前显示的视图对象,priorityviewf用于表示循环链表的第一个元素。

可选的,由于在循环链表link中,如果一个元素的指向出现错误,那整个显示结构就有可能会出现严重的顺序异常,为了解决这个风险点,在设计循环链表link的时候不是简单的环形结构的指向,还可以在循环链表link的每一个元素中存储下一个元素的秘钥key和上一个元素的秘钥key,其中,秘钥key用于唯一表示元素。具体的实现方式是,在数据结构类priorityview中设计一个string类型的lastekey和beforekey秘钥信息,其中beforekey表示上一个元素的秘钥key,lastekey表示下一个元素的秘钥key。例如,循环链表link中,第一个视图对象priorityview1存储有key1和key2,其中,key1为循环链表link中最后一个视图对象的秘钥,key2为循环链表link中第二个视图对象的秘钥。因此,通过该方式,可以确定在循环链表link中找到的下一个要显示的视图对象是否正确,保证整个循环链表link中的元素的指向的完整性和正确性。

步骤4、按照显示优先级从高到低的顺序从循环链表中依次取出第一视图对象;

在通过上述的方式构建好循环链表link,且循环链表link中的元素即视图对象按照显示优先级从高到低的顺序排序后,当需要显示图标时,从循环链表中依次取出第一视图对象,其中,该第一视图对象为循环链表link中的任一视图对象。

步骤5、根据第一视图对象对应的优先级对象的值和预设调剂区间确定第一视图对象的显示时长;

需要说明的是,实际应用中,不仅要求个别图标优先显示,还会要求该个别图标长时间进行显示,以起到更好的推广作用,因此需要动态调节图标的显示时长以满足该要求。传统方案中,通过定义一个优先级与显示时间长短之间的映射关系,这样的实现方式过于模板化。有鉴于此,本申请实施例中,还提供了一个动态调节视图对象的显示时长的方法。

具体地,构建一个优先级对象的值与预设调剂区间的映射关系,即构建一个映射函数关系式来描述两者之间的逻辑关系,具体的函数表达式设计如下所述:

y=int(c/level)*[min,max];

其中,y用于表示动态的目标调整区间;c为常量,这个常量是一个调节系数主要是针对不同的应用场景该常量值的大小可以根据需求来定义;level用于表示视图对象对应的优先级对象的值,数值越大显示优先级越小;函数int()为取整函数,区间[min,max]为预设调整区间。

因此,可以通过上述映射函数得到第一视图对象的目标调整区间y1,设为[min,max],其中,min用于表示目标调整区间y1的最小值,max用于表示目标调整区间y1的最大值;然后通过调用函数math.random(min,max)在目标调整区间y1中输出随机值,该随机值为第一视图对象的显示时长。

步骤6、根据显示定时器对第一视图对象进行显示。

在确定第一视图对象的显示时长后,对于该第一视图对象的显示可以通过定义一个显示定时器timer,将显示定时器timer中的超时时间设置为target,该target的值即为第一视图对象的显示时长。在显示定时器timer超时之前显示该第一视图对象,直到超时后确定并展示第一视图对象的下一个视图对象。

可选的,当视图对象中存储上一个元素的秘钥key设为第一秘钥和下一个元素的秘钥key设为第二秘钥时,还需判断第一视图对象的下一个视图对象是否正确。具体地,判断第一视图对象存储的第二秘钥与第一视图对象的下一个视图对象存储的第一秘钥是否相同;若相同,则确定该第一视图对象的下一个视图对象并进行显示;反之,若不相同,则认为该第一视图对象的下一个视图对象确定错误,则停止显示视图对象,或者重新确定正确的下一个视图对象以进行显示。

上面从移出视图对象的方法的角度对本申请实施例进行了描述,下面从移动终端的角度对本申请实施例进行描述。

请参阅图2,图2为本申请实施例提供的一种可能的移动终端的实施例示意图,其中,该移动终端具体包括:

插入单元201,用于将数据结构类中的多个视图对象插入循环链表,所述循环链表用于循环显示所述多个视图对象;

获取单元202,用于获得所述循环链表中各视图对象的哈希hash值,并将所述各视图对象的hash值与所述各视图对象对应保存到所述数据结构类中,所述hash值用于表示对象的唯一描述信息;

定义单元203,用于定义全局变量,所述全局变量用于指向当前正在显示的视图对象的hash值;

所述获取单元202还用于获取随机数据m,所述随机数据为整数型,所述随机数据m不大于所述循环链表中视图对象的个数;

遍历单元204,用于从所述循环链表的第一个视图对象开始,遍历所述循环链表,直至遍历到第m个视图对象;

判断单元205,用于根据所述第m个视图对象的hash值确定所述第m个视图对象是否为当前正在显示的视图对象;

删除单元206,用于若不是,则从所述循环链表中删除所述第m个视图对象。

请参阅图3,图3为本申请实施例提供的电子设备的实施例示意图。

如图3所示,本申请实施例提供了一种电子设备,包括存储器310、处理器320及存储在存储器320上并可在处理器320上运行的计算机程序311,处理器320执行计算机程序311时实现以下步骤:将数据结构类中的多个视图对象插入循环链表,所述循环链表用于循环显示所述多个视图对象;获得所述循环链表中各视图对象的哈希hash值,并将所述各视图对象的hash值与所述各视图对象对应保存到所述数据结构类中,所述hash值用于表示对象的唯一描述信息;定义全局变量,所述全局变量用于指向当前正在显示的视图对象的hash值;获取随机数据m,所述随机数据为整数型,所述随机数据m不大于所述循环链表中视图对象的个数;从所述循环链表的第一个视图对象开始,遍历所述循环链表,直至遍历到第m个视图对象;根据所述第m个视图对象的hash值确定所述第m个视图对象是否为当前正在显示的视图对象;若不是,则从所述循环链表中删除所述第m个视图对象。

可选的,在一种可能的实施例中,所述处理器320具体用于:通过调用所述数据结构类priorityview中的函数priorityview.hashid()得到所述循环链表中各视图对象的hash值itemhash;通过调用所述数据结构类priorityview中的函数priorityview.sethash(itemhash)将所述各视图对象的hash值itemhash封装到所述数据结构类priorityview中。

可选的,在一种可能的实施例中,所述处理器320具体用于:构建随机数选取集合,所述随机数选取集合的取值范围为(0,count]之间的整数,所述count用于表示所述循环链表中视图对象的个数;通过调用函数math.random(0,count)从所述随机数选取集合选取所述随机数据。

可选的,在一种可能的实施例中,所述处理器320具体用于:定义临时变量tempcount,并将所述临时变量tempcount的值初始化为0;从所述循环链表的第一个视图对象开始,每遍历一个视图对象,将所述临时变量tempcount的值加1;判断所述临时变量tempcount的值是否等于所述随机数据m;若是,则确定遍历的视图对象为所述第m个视图对象,并停止遍历所述循环链表。

可选的,在一种可能的实施例中,所述处理器320具体用于:通过调用函数itemm.gethashid()获取所述第m个视图对象的hash值;通过调用函数textutils.equals(currenthashitem,hashidm)判断所述第m个视图对象的hash值hashidm与所述全局变量指示的当前正在显示的视图对象的hash值currenthashitem是否一致;若是,则确定所述第m个视图对象为当前正在显示的视图对象;若否,则确定所述第m个视图对象不为当前正在显示的视图对象。

可选的,在一种可能的实施例中,所述处理器320具体用于:构建数据集合nextarray,所述数据集合nextarray包括随机分布的n个元素,所述n个元素分为m类参数{a1,a2…am},所述各类参数的值互不相同,所述m为所述循环链表中视图对象的个数,所述各类参数用于表示所述循环链表中各视图对象,所述各类参数的个数总和为所述n,所述各类参数的个数比例为预设的所述循环链表中各视图对象的显示概率比例;通过调用函数system.currenttimemills()获取当前的系统时间time;根据所述当前的系统时间time确定所述数据集合nextarray中的第t个元素,并显示目标视图对象,所述第t个元素对应的参数用于表示所述目标视图对象。

可选的,在一种可能的实施例中,所述处理器320具体用于:通过以下公式计算所述t;t=time%(m*n);根据所述余数t在所述数据集合nextarray索引所述第t个元素。

由于本实施例所介绍的电子设备为实施本申请实施例中一种移动终端所采用的设备,故而基于本申请实施例中所介绍的方法,本领域所属技术人员能够了解本实施例的电子设备的具体实施方式以及其各种变化形式,所以在此对于该电子设备如何实现本申请实施例中的方法不再详细介绍,只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。

请参阅图4,图4为本申请实施例提供的一种计算机可读存储介质的实施例示意图。

如图4所示,本实施例提供了一种计算机可读存储介质400,其上存储有计算机程序411,该计算机程序411被处理器执行时实现如下步骤:将数据结构类中的多个视图对象插入循环链表,所述循环链表用于循环显示所述多个视图对象;获得所述循环链表中各视图对象的哈希hash值,并将所述各视图对象的hash值与所述各视图对象对应保存到所述数据结构类中,所述hash值用于表示对象的唯一描述信息;定义全局变量,所述全局变量用于指向当前正在显示的视图对象的hash值;获取随机数据m,所述随机数据为整数型,所述随机数据m不大于所述循环链表中视图对象的个数;从所述循环链表的第一个视图对象开始,遍历所述循环链表,直至遍历到第m个视图对象;根据所述第m个视图对象的hash值确定所述第m个视图对象是否为当前正在显示的视图对象;若不是,则从所述循环链表中删除所述第m个视图对象。

可选的,在一种可能的实施例中,该计算机程序411被处理器执行时还用于实现如下步骤:通过调用所述数据结构类priorityview中的函数priorityview.hashid()得到所述循环链表中各视图对象的hash值itemhash;通过调用所述数据结构类priorityview中的函数priorityview.sethash(itemhash)将所述各视图对象的hash值itemhash封装到所述数据结构类priorityview中。

可选的,在一种可能的实施例中,该计算机程序411被处理器执行时还用于实现如下步骤:构建随机数选取集合,所述随机数选取集合的取值范围为(0,count]之间的整数,所述count用于表示所述循环链表中视图对象的个数;通过调用函数math.random(0,count)从所述随机数选取集合选取所述随机数据。

可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:定义临时变量tempcount,并将所述临时变量tempcount的值初始化为0;从所述循环链表的第一个视图对象开始,每遍历一个视图对象,将所述临时变量tempcount的值加1;判断所述临时变量tempcount的值是否等于所述随机数据m;若是,则确定遍历的视图对象为所述第m个视图对象,并停止遍历所述循环链表。

可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过调用函数itemm.gethashid()获取所述第m个视图对象的hash值;通过调用函数textutils.equals(currenthashitem,hashidm)判断所述第m个视图对象的hash值hashidm与所述全局变量指示的当前正在显示的视图对象的hash值currenthashitem是否一致;若是,则确定所述第m个视图对象为当前正在显示的视图对象;若否,则确定所述第m个视图对象不为当前正在显示的视图对象。

可选的,在一种可能的实施例中,该计算机程序411被处理器执行时还用于实现如下步骤:构建数据集合nextarray,所述数据集合nextarray包括随机分布的n个元素,所述n个元素分为m类参数{a1,a2…am},所述各类参数的值互不相同,所述m为所述循环链表中视图对象的个数,所述各类参数用于表示所述循环链表中各视图对象,所述各类参数的个数总和为所述n,所述各类参数的个数比例为预设的所述循环链表中各视图对象的显示概率比例;通过调用函数system.currenttimemills()获取当前的系统时间time;根据所述当前的系统时间time确定所述数据集合nextarray中的第t个元素,并显示目标视图对象,所述第t个元素对应的参数用于表示所述目标视图对象。

可选的,在一种可能的实施例中,该计算机程序411被处理器执行时具体用于实现如下步骤:通过以下公式计算所述t;t=time%(m*n);根据所述余数t在所述数据集合nextarray索引所述第t个元素。

需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包括这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1