本发明涉及信息处理技术领域,特别是涉及一种应用程序的动态换肤方法及装置。
背景技术:
随着科学技术的发展,越来越多的用户使用应用程序进行互联网交互活动。在目前的移动应用程序开发过程中,由于硬件水平的提升,各个应用开始追求应用的美观性,换肤就是最直接的一种方法。
现有技术的应用程序换肤方案一般需要用户下载并安装皮肤apk,这种方式的思路是,从所有已安装的应用程序中遍历出皮肤程序(根据特定包名区分),然后选中某个主题后,将此皮肤应用的包名保存到主应用中,需要获取资源时,通过皮肤包名得到皮肤应用的context,然后便可得到resources,从而获取到皮肤apk中的资源,如图1所示。
然而,现有的这种换肤方法会存在如下缺点:1、该方法需要用户下载并安装皮肤资源,对用户来说首先要下载完成并重启才能切换皮肤,而且下载皮肤资源需要耗费用户的手机流量;2、下载的皮肤资源会占用手机的存储空间。
技术实现要素:
为克服上述现有技术存在的不足,本发明之目的在于提供一种应用程序的动态换肤方法及装置,以便用户使用应用程序(app)时可轻松切换不同的皮肤,且无需重启app,即可实现一键切换目标皮肤。
为达上述目的,本发明提出一种应用程序的动态换肤方法,包括如下步骤:
步骤s1,在应用程序启动时,检测是否存在对应用程序界面的换肤请求;
步骤s2,在检测到应用程序界面的换肤请求时,根据所述换肤请求获取并加载配置的至少一目标皮肤资源;
步骤s3,确定需要替换资源的view并利用所述目标皮肤资源替换相应资源。
优选地,所述应用程序内预先内嵌多套目标换肤资源。
优选地,于步骤s1之前,所述方法还包括:
获取用户自定义的皮肤文件配置参数;
根据该皮肤文件配置参数配置样式文件并形成目标皮肤资源内嵌于所述应用程序中。
优选地,所述内嵌的多套目标皮肤资源,以资源前缀或后缀来区分不同资源。
优选地,步骤s2进一步包括:
步骤s200,利用resources类根据所述换肤请求中的资源id找到资源文件名称;
步骤s201,将资源文件名称提交给assetmanager类以打开对应的资源文件;
步骤s202,所述assetmanager类将所述资源文件的资源文件路径添加到资源管理器中。
优选地,于步骤s202中,所述assetmanager类利用addassetpath方法将所述资源文件路径添加到资源管理器中。
优选地,于步骤s3中,将需要替换资源的view加上tag属性以区分换肤的view。
优选地,于步骤s3中,根据activity加载view流程,仿照系统类appcompatdelegateimpl的oncreateview方法,自定义一个layoutinflater类去生成view,解释view的属性并利用所述目标皮肤资源替换资源。
为达到上述目的,本发明还提供一种应用程序的动态换肤装置,包括:
换肤请求监测模块,用于在应用程序启动时,检测是否存在对应用程序界面的换肤请求;
资源加载模块,用于在检测到应用程序界面的换肤请求时,获取并加载配置的至少一目标皮肤资源;
资源替换模块,用于确定需要替换资源的view并利用目标皮肤资源替换相应资源。
优选地,所述装置还包括目标皮肤资源内嵌模块,用于获取用户自定义的皮肤文件配置参数,根据该皮肤文件配置参数配置样式文件并形成目标皮肤资源内嵌于所述应用程序中。
与现有技术相比,本发明一种应用程序的动态换肤方法及装置通过采用应用程序内嵌资源的方式,内嵌几套目标皮肤资源,利用android应用加载资源原理,实现了一键动态切换皮肤资源,实时更新,无需下载资源,无需重启应用。
附图说明
图1为本发明一种应用程序的动态换肤方法的步骤流程图;
图2为本发明实施例的多套目标皮肤资源的示意图;
图3为本发明实施例中资源加载过程图;
图4为本发明一种应用程序的动态换肤装置的系统架构图。
具体实施方式
以下通过特定的具体实例并结合附图说明本发明的实施方式,本领域技术人员可由本说明书所揭示的内容轻易地了解本发明的其它优点与功效。本发明亦可通过其它不同的具体实例加以施行或应用,本说明书中的各项细节亦可基于不同观点与应用,在不背离本发明的精神下进行各种修饰与变更。
图1为本发明一种应用程序的动态换肤方法的步骤流程图。如图1所示,本发明一种应用程序的动态换肤方法,包括如下步骤:
步骤s1,在应用程序启动时,检测是否存在对应用程序界面的换肤请求。
在本发明具体实施例中,所述应用程序为手机等移动设备上的移动app(应用程序),在实际应用中,移动app应用界面包括功能框及应用界面,该应用界面通常需要配置有界面皮肤。为了提高移动app应用的体验,移动app应用中常常面临着界面皮肤更换的需求。在本发明具体实施例中,需要于应用程序内预先配置多套目标皮肤资源,以在检测到对应用程序界面的换肤请求时,利用该目标皮肤资源进行皮肤更换。
优选地,于步骤s1之前,本发明还包括如下步骤:
获取用户自定义的皮肤文件配置参数;
根据该皮肤文件配置参数配置样式文件并形成目标皮肤资源内嵌于所述应用程序中。
具体地说,在进行换肤之前,首先要确定应用中哪些界面需要换肤,他们有什么共性。比如一套以蓝色为基调的皮肤,所有的界面title应该是蓝色的,所有的按钮也是蓝色系列的…,这样就可以确定一套皮肤需要哪些颜色以及资源文件;当确定好一套皮肤需要的资源,其余皮肤按照第一套皮肤模板做,在本发明具体实施例中,于应用程序内内嵌多套目标皮肤资源,并以资源前缀或后缀来区分不同资源,如图2所示。
步骤s2,在检测到应用程序界面的换肤请求时,根据换肤请求获取并加载配置的至少一目标皮肤资源。
具体地说,切换皮肤其实就是替换资源的过程,研究安卓系统加载资源流程可以发现,安卓资源都是通过资源resource(资源)类去加载的,resources(资源)中有一系列根据资源id获取资源的方法,其中最关键的就是得到皮肤文件的resources(资源)对象和资源id。资源id在皮肤包打包的时候已经编译好,可以通过反射的方式获取r然后获取到资源id。android资源管理框架实际就是由assetmanager(资源管理器)和resources(资源)两个类来实现的,其中,resources(资源)类可以根据资源id来查找资源,而assetmanager(资源管理器)类则根据文件名来查找资源。
具体地,如图3所示,步骤s2进一步包括:
步骤s200,利用resources类根据换肤请求中的资源id找到资源文件名称。
具体地说,当检测到换肤请求时,该换肤请求中至少包含所要换肤的资源id,该资源id为如图2中的title_skin_res_1,title_skin_res_2等等,经过安卓虚拟机的编译,资源idtitle_skin_res_1会会变成图3的0x7f010001。一般地,一个资源id对应的是一个文件,resources类则根据资源id来找到资源文件名称。需说明的是,资源id在皮肤apk打包的时候已经编译好,可以通过反射的方式获取r然后获取到资源id
步骤s201,将资源文件名称提交给assetmanager类以打开对应的资源文件。
步骤s202,利用addassetpath方法将资源文件路径添加到资源管理器中,所述资源文件路径即为目标换肤资源的路径。
也就是说,assetmanager类中有一个addassetpath方法,此方法将一个资源文件路径添加到资源管理器中,该资源文件路径就是皮肤apk的路径,可以通过反射的方式调用。到此为止,皮肤apk的资源管理器则已经获得。
步骤s3,确定需要替换资源的view并利用目标皮肤资源替换相应资源。
在本发明具体实施例中,在xml布局中,将需要换肤的view(通过资源id对应,新旧皮肤的资源id命名一致)加上tag属性来区分换肤的view,根据activity加载view流程,仿照系统类appcompatdelegateimpl的oncreateview方法,自定义一个layoutinflater类去生成view,然后解释view的属性并利用目标皮肤资源替换资源。
图4为本发明一种应用程序的动态换肤装置的系统架构图。如图4所示,本发明一种应用程序的动态换肤装置,包括:
换肤请求监测模块401,用于在应用程序启动时,检测是否存在对应用程序界面的换肤请求。
在本发明具体实施例中,所述应用程序为手机等移动设备上的移动app(应用程序),在实际应用中,移动app应用界面包括功能框及应用界面,该应用界面通常需要配置有界面皮肤。为了提高移动app应用的体验,移动app应用中常常面临着界面皮肤更换的需求。在本发明具体实施例中,需要于应用程序内预先配置多套目标皮肤资源,以在检测到对应用程序界面的换肤请求时,利用该目标皮肤资源进行皮肤更换。
优选地,本发明还包括:
目标皮肤资源内嵌模块400,用于获取用户自定义的皮肤文件配置参数,根据该皮肤文件配置参数配置样式文件并形成目标皮肤资源内嵌于所述应用程序中。
具体地说,在进行换肤之前,首先要确定应用中哪些界面需要换肤,他们有什么共性。比如一套以蓝色为基调的皮肤,所有的界面title应该是蓝色的,所有的按钮也是蓝色系列的…,这样就可以确定一套皮肤需要哪些颜色以及资源文件;当确定好一套皮肤需要的资源,其余皮肤按照第一套皮肤模板做,在本发明具体实施例中,于应用程序内内嵌多套目标皮肤资源,并以资源前缀或后缀来区分不同资源。
资源加载模块402,用于在检测到应用程序界面的换肤请求时,获取并加载配置的至少一目标皮肤资源。
具体地说,切换皮肤其实就是替换资源的过程,研究安卓系统加载资源流程可以发现,安卓资源都是通过resource类去加载的,resources中有一系列根据资源id获取资源的方法,其中最关键的就是得到皮肤文件的resources对象和资源id。资源id在皮肤apk打包的时候已经编译好,可以通过反射的方式获取r然后获取到资源id。android资源管理框架实际就是由assetmanager和resources两个类来实现的,其中,resources类可以根据资源id来查找资源,而assetmanager类则根据文件名来查找资源。
在本发明具体实施例中,资源加载模块402具体用于:
利用resources类根据资源id找到资源文件名称。
事实上,如果一个资源id对应的是一个文件,那么resources类则根据资源id来找到资源文件名称。需说明的是,资源id在皮肤apk打包的时候已经编译好,可以通过反射的方式获取r然后获取到资源id
将资源文件名称提交给assetmanager类以打开对应的资源文件。
利用addassetpath方法将资源文件路径添加到资源管理器中。
也就是说,assetmanager类中有一个addassetpath方法,此方法将一个资源文件路径添加到资源管理器中,该资源文件路径就是皮肤apk的路径,可以通过反射的方式调用。到此为止,皮肤apk的资源管理器则已经获得。
资源替换模块403,用于确定需要替换资源的view并利用目标皮肤资源替换相应资源。
在本发明具体实施例中,在xml布局中,将需要换肤的view加上tag属性来区分换肤的view,根据activity加载view流程,仿照系统类appcompatdelegateimpl的oncreateview方法,自定义一个layoutinflater类去生成view,然后解释view的属性并利用目标皮肤资源替换资源。
综上所述,本发明一种应用程序的动态换肤方法及装置通过采用应用程序内嵌资源的方式,内嵌几套目标皮肤资源,利用android应用加载资源原理,实现了一键动态切换皮肤资源,实时更新,无需下载资源,无需重启应用。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何本领域技术人员均可在不违背本发明的精神及范畴下,对上述实施例进行修饰与改变。因此,本发明的权利保护范围,应如权利要求书所列。