一个不错的动态设置app主题的框架

前几天看到干货集中营的gank这个app的架构,给我最大的吸引地方是里面动态app的主题。今天就总结出来,分享给大家吧。里面的一些资源文件用的都是里面的,这些都是次要的。下面来看下效果图吧:

simple.gif

可能有人一上来就觉得这没啥的啊,不就是去改变一些背景的颜色吗?nono,如果你这样想的话,那你就错了,现在画面上就这么几个简单的控件,假如现在页面上很多的控件的话,那不你得要费很多的时间去一个个设置控件的背景、字体的颜色了。那样真的是事倍功半了。下面就简单地讲讲如何实现的吧。我这里就动态设置了两块的背景色,还有一块文本的字体颜色。

讲解:

第一步:
你得先列出你的style组合,这里就是控制你的控件显示那种样式的。

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"/>   

<style name="BlueTheme" parent="AppTheme">   
  <item name="colorPrimary">@color/colorBluePrimary</item> 
</style>

<style name="RedTheme" parent="AppTheme">
  <item name="colorPrimary">@color/colorRedPrimary</item>
</style>

<style name="BrownTheme" parent="AppTheme">   
  <item name="colorPrimary">@color/colorBrownPrimary</item>
</style>

<style name="GreenTheme" parent="AppTheme">  
  <item name="colorPrimary">@color/colorGreenPrimary</item>
</style>

<style name="PurpleTheme" parent="AppTheme">   
  <item name="colorPrimary">@color/colorPurplePrimary</item>
</style>

<style name="TealTheme" parent="AppTheme"> 
  <item name="colorPrimary">@color/colorTealPrimary</item>
</style>

<style name="PinkTheme" parent="AppTheme">   
  <item name="colorPrimary">@color/colorPinkPrimary</item>
</style>

<style name="DeepPurpleTheme" parent="AppTheme">    
  <item name="colorPrimary">@color/colorDeepPurplePrimary</item>
</style>

<style name="OrangeTheme" parent="AppTheme">   
  <item name="colorPrimary">@color/colorOrangePrimary</item>
</style>

<style name="IndigoTheme" parent="AppTheme">   
  <item name="colorPrimary">@color/colorIndigoPrimary</item>
</style>

<style name="CyanTheme" parent="AppTheme">   
  <item name="colorPrimary">@color/colorCyanPrimary</item>
</style>

<style name="LightGreenTheme" parent="AppTheme">      
  <item name="colorPrimary">@color/colorLightGreenPrimary</item>
</style>

<style name="LimeTheme" parent="AppTheme">  
  <item name="colorPrimary">@color/colorLimePrimary</item>
</style>

<style name="DeepOrangeTheme" parent="AppTheme">    
  <item name="colorPrimary">@color/colorDeepOrangePrimary</item>
</style>

<style name="BlueGreyTheme" parent="AppTheme">  
  <item name="colorPrimary">@color/colorBlueGreyPrimary</item>
</style>

在这里定义了多种style的样式,其中里面的item就只有一个,因为在该demo里面就简单地只用到一个属性item。如果你想在app里面用到多个item属性的时候,你也可以在此基础上添加多个。大家可以看到我这里的colorPrimary就定义成一个颜色的值,其实你也可以定义drawableanim等等。

首先来看状态栏的背景动态改变吧。其实这里我是把自带的状态栏给去隐藏掉了,而是用我们自定义的view来代替了状态栏。首先来看如何隐藏系统的statusbar的。

public class MainActivity extends AppCompatActivity{
     @Override
     protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.KITKAT){    
            setTranslucentStatus(true);
        }
     }

     @TargetApi(19)
     private void setTranslucentStatus(boolean on) {    
        Window win = getWindow();    
        WindowManager.LayoutParams winParams = win.getAttributes();    
        final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;    
        if (on) {        
            winParams.flags |= bits;   
        } else {      
            winParams.flags &= ~bits;  
        }   
        win.setAttributes(winParams);
     }
}

这里就是隐藏掉系统的状态栏的,隐藏掉后,下面就是用我们自定义的View来代替状态栏了。下面先看下MainActivity的布局吧。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"    
     android:id="@+id/main"    
     android:layout_width="match_parent"      
     android:layout_height="match_parent"    
     android:orientation="vertical"  
     tools:context=".MainActivity" >    
<com.demo.statusbar.ColorView        
     android:id="@+id/status_bar"        
     android:layout_width="match_parent"        
     android:layout_height="20dp"      
     android:background="?attr/colorPrimary" />    
<com.demo.statusbar.ColorRelativeLayout        
     android:id="@+id/toolbar"        
     android:layout_width="match_parent"        
     android:layout_height="48dp"    
     android:background="?attr/colorPrimary">     
     <TextView            
         android:id="@+id/title"               
         android:layout_width="wrap_content"            
         android:layout_height="wrap_content"            
         android:layout_centerVertical="true"            
         android:layout_marginLeft="10dp"            
         android:layout_toRightOf="@+id/icon"            
         android:text="状态栏切换"            
         android:textColor="@android:color/white"            
         android:textSize="18sp" />       
     <ImageView            
         android:id="@+id/menu"            
         android:layout_width="wrap_content"            
         android:layout_height="wrap_content"               
         android:layout_alignParentRight="true"            
         android:layout_centerVertical="true"            
         android:layout_marginRight="10dp"            
         android:src="@mipmap/ic_menu" />    
</com.demo.statusbar.ColorRelativeLayout>    
<com.demo.statusbar.ColorTextView        
     android:id="@+id/main_text"        
     android:layout_width="match_parent"        
     android:layout_height="match_parent"        
     android:gravity="center"  
     android:text="点击右上角的图标"     
     android:textColor="?attr/colorPrimary"          
     android:textSize="15sp" />
</LinearLayout>

其中这里的com.demo.statusbar.ColorView就是一个自定义的View,用来代替系统的statusBar。
这里的com.demo.statusbar.ColorRelativeLayout就是用来表示toolBar了。
这里的com.demo.statusbar.ColorTextView就是用来表示下面自定义的textView。
下面就讲讲com.demo.statusbar.ColorView是如何实现改变样式的:

public class ColorView extends View implements SelectColorsWindow.OnItemClickListener {  
  private static final String TAG =ColorView.class.getSimpleName();   
  private int attr_background = -1;
  public ColorView(Context context) {   
     super(context);   
  }    
  public ColorView(Context context, AttributeSet attrs) {        
     super(context, attrs);       
     this.attr_background = ViewAttributeUtil.getBackgroundAttibute(attrs); 
  }   
  public ColorView(Context context, AttributeSet attrs, int defStyleAttr) {      
     super(context, attrs, defStyleAttr);   
     this.attr_background = ViewAttributeUtil.getBackgroundAttibute(attrs); 
  }   
  @Override   
  public View getView() {   
     return this;   
  } 
  @Override   
  public void setMyTheme(int index) { 
  }    
  @Override  
  public void ItemClick(Resources.Theme theme) {        
      if (attr_background != -1) {            
          ViewAttributeUtil.applyBackgroundDrawable(this, theme, attr_background);  
      }   
  }
}

这里实际上做了三件事,第一就是在构造里面获取了该View的background属性值,而我们在布局里面定义了android:background="?attr/colorPrimary"这么个属性,因此大家可以看得出来,马上看到该字眼很熟,是不是在style里面见到了该item的定义呢。这里就是用到了不同style下的colorPrimary这个item。第二就是监听了主题切换的回调,我这里定义的是ItemClick方法的回调,这个没什么好说的。第三就是设置background了,这个是在ViewAttributeUtil类中实现的,由于ViewAttributeUtil类太庞大了,这里就不赘述了。

借鉴的项目:https://github.com/dongjunkun/GanK

关于我

email: a1002326270@163.com
github:enter

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容