`

实现APP换肤功能

 
阅读更多

1.用自己的Layout实现layout监听

 

 

public class SkinActivity implements Layout{
SkinLayoutInflater  skinLayoutInflator;
protected void onCreate(Bundle saveInstanceState){
skinLayoutInflator = new SkinLayoutInflater();
   LayoutInflaterCompat.setFactory(getLayoutoutInflater().skinLayoutInflater);   
}

public void update(){

   SkinManager.loadPath("skin.apk");
   SkinManager.update();

}
}

 

 

 

2.实现自己的LayoutInflaterFactory

 

public class SkinLayoutInflater implements LayoutInflaterFactory{
SkinLayoutInflater skinLayoutInflater;

private 
public View createView(View parent,String name,String Context,AttributeSet attrs){
    View view = null;
    if(name.indexOf(".")!=-1)){//自定义控件
       view = createView(context,attrs,name);
    }else{//反射构造系统控件
       for(String pre:prefixList){
           view = createView(context,attrs,pre+name);
           if(view == null){break;}
      }
    }
}
//反射View
public View createView(String name,String Context,AttributeSet attrs){

Class viewClazz = context.getClassLoader().loadClass(name);
Contructor<? extends view> contructor = viewClazz.getContructor(new Class[](Context.class,AttrubuteSet.class));
contructor.setAccessible(true);

}
//对从apk插件中得到的颜色进行应用
public void apply(){
    for(SkinItem skinItem :list){
       if("textColor".equals(skinItem.getAttrName())){
          if(view instanceof TextView){
              ((TextView)view).setTextColor(skinItem.getId());
          }else{
              ((TextView)view).setTextColor(SkinManager.getInstance().getColor(skinItem.getId()));
         }
       }
    }

}
//skinitem的包装类
class SkinItem{

   private String attrName;
   private String attrValue;

   String String attrType;

   int id;
}


private void parseView(Context context,AttributeSet attrs,View view,String name){

    for(int i=0;i<attrs.getAttributeCount();i++){
        String attrName = attrs.getAttributeName(i);
        String attrValue = attrs.getAttributeValue(i);

        if("background".equal(attrName)||"textColor".equal(attrName)){
             int id = Integer.parseInt(attrValue.substring(1));
              String entryName = context.getResources().getResourceEntryName(id);
             String typeName = context.getResources().getResourceTypeName(id);
              SkinItem skinItem =new SkinItem(attrName,id,entryName,typeName);
              list.add(skinItem);//收集换肤的ITem
        }
    }
        
     if(!list.isEmpty){
         SkinView skinview  = new SkinView 
     }


}

class SkinManager{

    private Context context;
    private Resource skinResource;
    private String skinPackageName;

    private static SkinManager ourInstance = new SkinManager();

    public SkinManager(){

    }

    public static SkinManager getInstance(){return ourInstance;}

        public void  init(Context context){

         this.context = context.getApplicationContext();
    }

    //加载apk路径
    public void loadSkin(File apkPath){

       PackageManager packageManager = coontext.getPackageManager();
       PackageInfo packageInfo = packageManager.getPackagerArchiveInfo(apkPath.getAbsolutePath,PackageManager.GET_ACTIVITIE);//这里很重要,根据packageManage来加载apk包信息和包资源

       skinPackageName = packageInfo.packageName;

          AssetManager assetManager  = AssetManager.class.newInstance();
          Method addAssetPath()=assetManager.getClass.getClass.getMethod("addAssetPath",String.class);
          addAssetPath.invoke(assetManager.apkPath.getAbsoluteFile());
          skinResource = new Resource(assetManager,context.getResources().getDisplayMetries,context.getResources().getContext);      

   }
    //对每个View进行更新
    public void update(){
        for(View view : cacheMap.keySet()){
              SkinView skinitem = cacheMap.get(view);
              skinItem.apply();
        }
   
   }
  public int getColor(int resId){
      
        if(skinResource == null){
               return resId;
        }
        String resName = context.getResources().getResoucesEntryName(resId);//得到资源名
        int skinId = skinResource.getIndentifier(resName,"color",skinPackageName);//通过资源名去拿到皮肤ID
        return skinResource.getColors(resId);
  }


}


class SkinView{

     private View view;
     private List<SkinItem> list;

     public SkinView(View view,List<SkinItem> list>) {
         this.view = view;
         this.list = list;
     }
     //将ViewItem里面需要换肤的进行更新
     public void apply(){
         
        for(SkinItem skinItem :list){
               if("textColor".equals(skinItem.getAttrName())){
                   if(view instanceof TextView){
                       (TextView)view .setTextColor(skinItem.getId());
                   }else if(view instanceof Button){
                       (TextView)viwe.setTextColor(skinItem.getId);
                   }
                }
        }
     }
}
}
 

 

 

分享到:
评论

相关推荐

    简单实现app换肤原理

    在移动应用开发中,app换肤功能是一种常见的需求,它能提供给用户个性化的体验,增强用户对应用的喜好度。本篇文章将深入探讨如何通过修改`R.mipmap.test`文件来实现这一功能,让读者了解app换肤的基本原理。 首先...

    仿QQ换肤功能

    在IT行业中,用户界面(UI)的个性化设计已经成为吸引用户...总之,换肤功能的实现是一个综合了资源管理、动态渲染、事件处理等多个技术领域的挑战,但通过合理的架构设计和优化,可以为用户提供更加个性化的使用体验。

    app动态换肤,适配5.0到9.0

    7. **测试与调试**:在开发过程中,对各个版本的设备进行充分的测试是非常必要的,确保在各种环境下换肤功能都能正常工作,无异常或视觉问题。 8. **用户界面响应**:换肤过程中应保持用户界面的流畅性,尽量避免...

    Qt实现换肤功能

    在本文中,我们将深入探讨如何使用Qt框架实现应用程序的换肤功能。Qt是一个跨平台的C++库,广泛用于开发图形用户界面应用。通过利用Qt的样式表(QSS,Qt Style Sheets)特性,我们可以轻松地改变应用的外观和感觉,...

    换肤功能——WPF实现的CS结构桌面程序的换肤功能

    在本文中,我们将深入探讨如何在基于Windows Presentation Foundation(WPF)的客户端应用程序(CS结构桌面程序)中实现换肤功能。WPF是.NET Framework的一部分,它提供了丰富的用户界面(UI)设计工具和功能,使得...

    Android皮肤资源内置实现换肤功能Demo

    该资源是 Android 应用实现换肤功能的demo程序,同时也是博客文章:http://blog.csdn.net/janice0529/article/details/39999727 中demo程序, 博客中有详细的demo程序设计介绍。

    app内置换肤,效率高,适配高

    在实现app内置换肤功能时,还要考虑性能优化。例如,使用内存缓存来存储已加载的皮肤资源,减少重复加载;同时,对于大图资源,可以采用懒加载策略,只在需要时才加载,防止内存占用过高。 最后,为了提供良好的...

    iOS APP动态换肤方案详解.docx

    换肤功能是现代移动应用提升用户体验的重要手段,它不仅涵盖了全局主题的更换,如节假日主题切换,还包括局部页面的个性化设置,如白天/夜间模式。iOS系统自iOS13开始引入暗黑模式,为实现动态换肤提供了基础。本文...

    app主题换肤的demo

    本文将深入探讨如何实现一个Android app的主题换肤功能,基于提供的"app主题换肤的demo"。 首先,理解主题换肤的基本概念。在Android中,主题(Theme)是指一套全局的UI风格,包括颜色、字体、布局等元素。通过更换...

    微信小程序实现换肤功能

    在微信小程序中实现换肤功能是一项常见的需求,它允许用户根据个人喜好选择不同的主题颜色或样式。微信小程序的开发方式与传统的PC或移动端有所不同,因此实现换肤功能时需要采用特殊的方法。以下将详细介绍如何在...

    Android软件换肤功能(AppTheme)

    Android软件的换肤功能,也称为AppTheme,是提升用户体验的一种常见方式,它允许用户根据个人喜好调整应用的视觉风格,如边框图片、颜色、字体样式和大小等。尤其在阅读类应用中,例如小说软件,用户可以切换背景色...

    android换肤原理实现

    - **代码实现**:通常,换肤功能的实现需要编写一段代码,用于监听用户选择的主题并进行资源的切换。这部分代码可以放在一个专门的`SkinManager`类中,该类负责加载和切换皮肤资源。 - **兼容性问题**:考虑到...

    react实现换肤功能的示例代码

    在React应用中实现换肤功能是一项常见的需求,它允许用户根据个人喜好选择不同的主题颜色,提升用户体验。本文将详细介绍如何在React中实现这一功能,并提供一个具体的示例代码。 一、目标 目标是为用户提供几种...

    iOS实现换肤功能的简单处理框架(附源码)

    iOS实现换肤功能的简单处理框架 ...使用本框架可以实现换肤功能的简单处理,可以提供更好的用户体验,提高APP的可用性和灵活性。同时,本框架也可以扩展到其他的功能模块中,例如夜间模式、暗黑模式等。

    后台框架页面换肤并保存设置简单实例

    本实例将探讨如何在后台框架页面中实现换肤功能,并且能够保存用户的设置,以便下次打开时仍然保持用户的首选样式。这一功能通常涉及到前端开发、后端存储以及用户交互设计等多个方面。 首先,我们来理解"框架页面...

    vue+iview+less 实现换肤功能

    在本文中,我们将探讨如何使用Vue.js、iView和Less实现一个动态换肤功能。Vue.js是一个流行的前端框架,iView是一个基于Vue的UI组件库,而Less是一种预处理器CSS语言,它允许我们编写更简洁、可维护的样式代码。以下...

    安卓天气预报源码(带换肤功能)weatherApp.7z

    1、资料包括安卓app源代码和产品设计说明相关文档,有助于理解整个app设计开发过程。 2、资源内容:安卓app框架源代码文档 3、使用/学习目标:了解移动开发核心原理 4、应用场景:安卓编程,项目产品化、资源处理等内容...

    MIUI主题风格_一种Android系统换肤功能的设计 思路(董红光)

    ### MIUI主题风格——一种Android系统换肤功能的设计思路 #### 一、引言 随着移动设备的普及和发展,用户体验成为软件开发中的一个重要考量因素。其中,个性化设置,特别是主题风格的定制化服务,越来越受到用户的...

Global site tag (gtag.js) - Google Analytics