├── .gitignore
├── .idea
├── .name
├── compiler.xml
├── copyright
│ └── profiles_settings.xml
├── dictionaries
│ └── Administrator.xml
├── encodings.xml
├── gradle.xml
├── misc.xml
├── modules.xml
├── runConfigurations.xml
└── vcs.xml
├── README.md
├── app
├── .gitignore
├── build.gradle
├── proguard-rules.pro
└── src
│ ├── androidTest
│ └── java
│ │ └── com
│ │ └── itheima
│ │ └── systembar
│ │ └── systembartint
│ │ └── ApplicationTest.java
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── itheima
│ │ │ └── systembar
│ │ │ └── systembartint
│ │ │ └── MainActivity.java
│ └── res
│ │ ├── layout
│ │ └── activity_main.xml
│ │ ├── mipmap-hdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ └── ic_launcher.png
│ │ ├── mipmap-xxxhdpi
│ │ └── ic_launcher.png
│ │ ├── values-v14
│ │ └── styles.xml
│ │ ├── values-v19
│ │ └── styles.xml
│ │ ├── values-w820dp
│ │ └── dimens.xml
│ │ └── values
│ │ ├── colors.xml
│ │ ├── dimens.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ └── test
│ └── java
│ └── com
│ └── itheima
│ └── systembar
│ └── systembartint
│ └── ExampleUnitTest.java
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── library
├── .classpath
├── .gitignore
├── AndroidManifest.xml
├── build.gradle
├── build.xml
├── gradle.properties
├── proguard-project.txt
├── project.properties
└── src
│ └── com
│ └── itheima
│ └── systembartint
│ └── SystemBarTintManager.java
└── settings.gradle
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 |
--------------------------------------------------------------------------------
/.idea/.name:
--------------------------------------------------------------------------------
1 | SystemBarTint
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/.idea/copyright/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/dictionaries/Administrator.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
24 |
25 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 | Android
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 | 1.7
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 最火Android开源项目SystemBarTint使用
2 | ---
3 | 开源地址:[https://github.com/open-android/SystemBarTint](https://github.com/open-android/SystemBarTint "开源项目地址")
4 |
5 | PS:如果觉得文章太长,你也可观看该课程的[视频](https://www.boxuegu.com/web/html/video.html?courseId=172§ionId=8a2c9bed5a3a4c7e015a3a69cb6e0072&chapterId=8a2c9bed5a3a4c7e015a3a6a2fce0073&vId=8a2c9bed5a3a4c7e015a3a6a95dd0074&videoId=A85FCED9A07D49719C33DC5901307461),亲,里面还有高清,无码的福利喔
6 |
7 |
8 | 修改状态栏颜色,可保持与actionbar 一致
9 |
10 |
11 | # 运行效果
12 |  
13 |
14 |
15 |
16 | * 爱生活,爱学习,更爱做代码的搬运工,分类查找更方便请下载黑马助手app
17 |
18 | 
19 |
20 |
21 | ## 使用步骤
22 |
23 | ### 1. 在project的build.gradle添加如下代码(如下图)
24 |
25 | allprojects {
26 | repositories {
27 | ...
28 | maven { url "https://jitpack.io" }
29 | }
30 | }
31 |
32 | 
33 |
34 |
35 | ### 2. 在Module的build.gradle添加依赖
36 |
37 | compile 'com.github.open-android:SystemBarTint:v1.0.0'
38 |
39 |
40 | ### 3. 复制如下代码到xml
41 |
42 |
46 |
52 |
53 |
54 |
55 | ### 4. 拷贝以下内容到 res/string.xml中
56 |
57 | > 也可以自己定义自己的字符串。
58 |
59 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ligula sapien, fermentum vitae aliquam sed, lacinia in nibh. Pellentesque euismod diam eget justo interdum, sit amet elementum ipsum vulputate. Aliquam sed purus urna. Vivamus luctus nisi sem, a fringilla velit iaculis id. Donec nec vulputate justo. Fusce vulputate sodales tellus, in fringilla ante posuere non. Vivamus vulputate nisl non augue dignissim, consectetur rutrum risus facilisis. Sed consectetur aliquam dolor, sed pulvinar mi tristique vitae. Donec quis ligula quis velit consequat dictum id eu felis. Mauris ac congue ante, sed elementum eros.\n\nSed eu euismod dolor, a vestibulum lorem. Phasellus euismod volutpat risus sit amet pellentesque. Proin sed massa eget risus malesuada dignissim et in ipsum..\n\nNullam risus felis, dictum et varius eget, rutrum non nunc. Vestibulum lorem nulla, porttitor ac sapien interdum, porta tristique turpis. Quisque ut dui vitae urna congue scelerisque. Nulla eu commodo felis. Nulla aliquam magna a arcu elementum, vitae tincidunt risus semper. Sed consectetur diam vel magna mattis, sed congue nisi fringilla. Ut in facilisis elit. Etiam aliquet orci urna. Nam interdum nunc fringilla iaculis cursus.
60 |
61 | ### 5. 拷贝以下内容到 res/color.xml中
62 |
63 | > 也可以自己定义颜色。
64 |
65 | #FF0099EE
66 | #FF0099cc
67 |
68 | ### 6. 拷贝以下内容到res/style.xml 中
69 |
70 |
73 |
74 |
77 |
78 | ###7. 拷贝以下内容到activity中
79 | > 注意 : 应该继承的是Activity ,而不是AppCompatActivity
80 |
81 | @Override
82 | protected void onCreate(Bundle savedInstanceState) {
83 | super.onCreate(savedInstanceState);
84 | setContentView(R.layout.activity_main);
85 |
86 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
87 | setTranslucentStatus(true);
88 | }
89 |
90 | SystemBarTintManager tintManager = new SystemBarTintManager(this);
91 | tintManager.setStatusBarTintEnabled(true);
92 | //设置状态栏颜色
93 | tintManager.setStatusBarTintResource(R.color.statusbar_bg);
94 |
95 | }
96 |
97 | @TargetApi(19)
98 | private void setTranslucentStatus(boolean on) {
99 | Window win = getWindow();
100 | WindowManager.LayoutParams winParams = win.getAttributes();
101 | final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
102 | if (on) {
103 | winParams.flags |= bits;
104 | } else {
105 | winParams.flags &= ~bits;
106 | }
107 | win.setAttributes(winParams);
108 | }
109 |
110 | ###8 . 注册activity的时候,请指定主题样式为之前定义的主题
111 |
112 |
113 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 | * 注意细节
123 |
124 | 1. 如果想实现上面右图效果,呈现透明色状态栏的。只需要修改布局的根标签的fitsSystemWindows 为false,并且搭配透明的颜色即可。
125 |
126 | //此处修改为false
130 |
131 | 2. 配合透明颜色即可
132 |
133 | #330000ff
134 | #33ff0000
135 |
136 | 3. 界面应该继承的是Activity ,而不是AppCompatActivity
137 |
138 |
139 | * 详细的使用方法在DEMO里面都演示啦,如果你觉得这个库还不错,请赏我一颗star吧~~~
140 |
141 | * 欢迎关注微信公众号
142 |
143 | 
144 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | android {
4 | compileSdkVersion 23
5 | buildToolsVersion "24.0.1"
6 |
7 | defaultConfig {
8 | applicationId "com.itheima.systembar.systembartint"
9 | minSdkVersion 16
10 | targetSdkVersion 23
11 | versionCode 1
12 | versionName "1.0"
13 | }
14 | buildTypes {
15 | release {
16 | minifyEnabled false
17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
18 | }
19 | }
20 | }
21 |
22 | dependencies {
23 | compile fileTree(dir: 'libs', include: ['*.jar'])
24 | testCompile 'junit:junit:4.12'
25 | compile 'com.android.support:appcompat-v7:23.4.0'
26 | compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
27 | }
28 |
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in C:\android\android_studio\SDK/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/com/itheima/systembar/systembartint/ApplicationTest.java:
--------------------------------------------------------------------------------
1 | package com.itheima.systembar.systembartint;
2 |
3 | import android.app.Application;
4 | import android.test.ApplicationTestCase;
5 |
6 | /**
7 | * Testing Fundamentals
8 | */
9 | public class ApplicationTest extends ApplicationTestCase {
10 | public ApplicationTest() {
11 | super(Application.class);
12 | }
13 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
10 |
11 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/app/src/main/java/com/itheima/systembar/systembartint/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.itheima.systembar.systembartint;
2 |
3 | import android.annotation.TargetApi;
4 | import android.app.Activity;
5 | import android.os.Build;
6 | import android.os.Bundle;
7 | import android.view.Window;
8 | import android.view.WindowManager;
9 |
10 | import com.readystatesoftware.systembartint.SystemBarTintManager;
11 |
12 | public class MainActivity extends Activity {
13 |
14 | @Override
15 | protected void onCreate(Bundle savedInstanceState) {
16 | super.onCreate(savedInstanceState);
17 | setContentView(R.layout.activity_main);
18 |
19 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
20 | setTranslucentStatus(true);
21 | }
22 |
23 | SystemBarTintManager tintManager = new SystemBarTintManager(this);
24 | tintManager.setStatusBarTintEnabled(true);
25 | //设置状态栏颜色
26 | tintManager.setStatusBarTintResource(R.color.statusbar_bg);
27 |
28 | }
29 |
30 | @TargetApi(19)
31 | private void setTranslucentStatus(boolean on) {
32 | Window win = getWindow();
33 | WindowManager.LayoutParams winParams = win.getAttributes();
34 | final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
35 | if (on) {
36 | winParams.flags |= bits;
37 | } else {
38 | winParams.flags &= ~bits;
39 | }
40 | win.setAttributes(winParams);
41 | }
42 |
43 | }
44 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/open-android/SystemBarTint/10c7be14d7f50b10e2c069a81d0798b1fb3b417f/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/open-android/SystemBarTint/10c7be14d7f50b10e2c069a81d0798b1fb3b417f/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/open-android/SystemBarTint/10c7be14d7f50b10e2c069a81d0798b1fb3b417f/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/open-android/SystemBarTint/10c7be14d7f50b10e2c069a81d0798b1fb3b417f/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/open-android/SystemBarTint/10c7be14d7f50b10e2c069a81d0798b1fb3b417f/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values-v14/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
11 |
12 |
15 |
16 |
20 |
21 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/src/main/res/values-v19/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 | #FF0099EE
8 | #FF0099cc
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | SystemBarTint
3 |
4 | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ligula sapien, fermentum vitae aliquam sed, lacinia in nibh. Pellentesque euismod diam eget justo interdum, sit amet elementum ipsum vulputate. Aliquam sed purus urna. Vivamus luctus nisi sem, a fringilla velit iaculis id. Donec nec vulputate justo. Fusce vulputate sodales tellus, in fringilla ante posuere non. Vivamus vulputate nisl non augue dignissim, consectetur rutrum risus facilisis. Sed consectetur aliquam dolor, sed pulvinar mi tristique vitae. Donec quis ligula quis velit consequat dictum id eu felis. Mauris ac congue ante, sed elementum eros.\n\nSed eu euismod dolor, a vestibulum lorem. Phasellus euismod volutpat risus sit amet pellentesque. Integer sit amet nisl malesuada, posuere orci sodales, euismod metus. Suspendisse potenti. Nullam mollis tristique accumsan. Vestibulum sit amet dictum nisl. Sed rhoncus lacus purus, vitae scelerisque urna venenatis at.\n\nUt ornare sapien sed condimentum varius. Nulla ut varius nibh. Nam consequat ligula sem, interdum hendrerit diam commodo sed. Vestibulum imperdiet mauris quis mauris vestibulum lobortis. Nunc bibendum, nunc ut porttitor tristique, turpis mauris cursus magna, ac molestie risus hendrerit odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras pulvinar odio vestibulum ligula mollis, vel venenatis orci semper. Duis consectetur molestie justo, ut pulvinar nisi semper vel. Cras quis fringilla augue, ut vehicula turpis. Praesent nec imperdiet dui. Morbi quis pharetra lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed luctus mauris vitae augue rhoncus, vel interdum nisl pellentesque. In tempor, mi et vestibulum condimentum, nisl mauris cursus diam, aliquet vestibulum risus erat sit amet diam.\n\nInteger suscipit eros at diam tempor, ac condimentum turpis pharetra. Vestibulum pharetra risus in lacus semper, at bibendum ligula condimentum. Proin sed massa eget risus malesuada dignissim et in ipsum. Donec convallis tellus vel lectus lobortis, non lobortis libero faucibus. Sed nec posuere mi. Pellentesque sed sem sit amet erat lobortis commodo nec ut nisl. Pellentesque rhoncus risus id massa accumsan, hendrerit posuere mauris pulvinar.\n\nNullam risus felis, dictum et varius eget, rutrum non nunc. Vestibulum lorem nulla, porttitor ac sapien interdum, porta tristique turpis. Quisque ut dui vitae urna congue scelerisque. Nulla eu commodo felis. Nulla aliquam magna a arcu elementum, vitae tincidunt risus semper. Sed consectetur diam vel magna mattis, sed congue nisi fringilla. Ut in facilisis elit. Etiam aliquet orci urna. Nam interdum nunc fringilla iaculis cursus.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ligula sapien, fermentum vitae aliquam sed, lacinia in nibh. Pellentesque euismod diam eget justo interdum, sit amet elementum ipsum vulputate. Aliquam sed purus urna. Vivamus luctus nisi sem, a fringilla velit iaculis id. Donec nec vulputate justo. Fusce vulputate sodales tellus, in fringilla ante posuere non. Vivamus vulputate nisl non augue dignissim, consectetur rutrum risus facilisis. Sed consectetur aliquam dolor, sed pulvinar mi tristique vitae. Donec quis ligula quis velit consequat dictum id eu felis. Mauris ac congue ante, sed elementum eros.\n\nSed eu euismod dolor, a vestibulum lorem. Phasellus euismod volutpat risus sit amet pellentesque. Integer sit amet nisl malesuada, posuere orci sodales, euismod metus. Suspendisse potenti. Nullam mollis tristique accumsan. Vestibulum sit amet dictum nisl. Sed rhoncus lacus purus, vitae scelerisque urna venenatis at.\n\nUt ornare sapien sed condimentum varius. Nulla ut varius nibh. Nam consequat ligula sem, interdum hendrerit diam commodo sed. Vestibulum imperdiet mauris quis mauris vestibulum lobortis. Nunc bibendum, nunc ut porttitor tristique, turpis mauris cursus magna, ac molestie risus hendrerit odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras pulvinar odio vestibulum ligula mollis, vel venenatis orci semper. Duis consectetur molestie justo, ut pulvinar nisi semper vel. Cras quis fringilla augue, ut vehicula turpis. Praesent nec imperdiet dui. Morbi quis pharetra lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed luctus mauris vitae augue rhoncus, vel interdum nisl pellentesque. In tempor, mi et vestibulum condimentum, nisl mauris cursus diam, aliquet vestibulum risus erat sit amet diam.\n\nInteger suscipit eros at diam tempor, ac condimentum turpis pharetra. Vestibulum pharetra risus in lacus semper, at bibendum ligula condimentum. Proin sed massa eget risus malesuada dignissim et in ipsum. Donec convallis tellus vel lectus lobortis, non lobortis libero faucibus. Sed nec posuere mi. Pellentesque sed sem sit amet erat lobortis commodo nec ut nisl. Pellentesque rhoncus risus id massa accumsan, hendrerit posuere mauris pulvinar.\n\nNullam risus felis, dictum et varius eget, rutrum non nunc. Vestibulum lorem nulla, porttitor ac sapien interdum, porta tristique turpis. Quisque ut dui vitae urna congue scelerisque. Nulla eu commodo felis. Nulla aliquam magna a arcu elementum, vitae tincidunt risus semper. Sed consectetur diam vel magna mattis, sed congue nisi fringilla. Ut in facilisis elit. Etiam aliquet orci urna. Nam interdum nunc fringilla iaculis cursus.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ligula sapien, fermentum vitae aliquam sed, lacinia in nibh. Pellentesque euismod diam eget justo interdum, sit amet elementum ipsum vulputate. Aliquam sed purus urna. Vivamus luctus nisi sem, a fringilla velit iaculis id. Donec nec vulputate justo. Fusce vulputate sodales tellus, in fringilla ante posuere non. Vivamus vulputate nisl non augue dignissim, consectetur rutrum risus facilisis. Sed consectetur aliquam dolor, sed pulvinar mi tristique vitae. Donec quis ligula quis velit consequat dictum id eu felis. Mauris ac congue ante, sed elementum eros.\n\nSed eu euismod dolor, a vestibulum lorem. Phasellus euismod volutpat risus sit amet pellentesque. Integer sit amet nisl malesuada, posuere orci sodales, euismod metus. Suspendisse potenti. Nullam mollis tristique accumsan. Vestibulum sit amet dictum nisl. Sed rhoncus lacus purus, vitae scelerisque urna venenatis at.\n\nUt ornare sapien sed condimentum varius. Nulla ut varius nibh. Nam consequat ligula sem, interdum hendrerit diam commodo sed. Vestibulum imperdiet mauris quis mauris vestibulum lobortis. Nunc bibendum, nunc ut porttitor tristique, turpis mauris cursus magna, ac molestie risus hendrerit odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras pulvinar odio vestibulum ligula mollis, vel venenatis orci semper. Duis consectetur molestie justo, ut pulvinar nisi semper vel. Cras quis fringilla augue, ut vehicula turpis. Praesent nec imperdiet dui. Morbi quis pharetra lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed luctus mauris vitae augue rhoncus, vel interdum nisl pellentesque. In tempor, mi et vestibulum condimentum, nisl mauris cursus diam, aliquet vestibulum risus erat sit amet diam.\n\nInteger suscipit eros at diam tempor, ac condimentum turpis pharetra. Vestibulum pharetra risus in lacus semper, at bibendum ligula condimentum. Proin sed massa eget risus malesuada dignissim et in ipsum. Donec convallis tellus vel lectus lobortis, non lobortis libero faucibus. Sed nec posuere mi. Pellentesque sed sem sit amet erat lobortis commodo nec ut nisl. Pellentesque rhoncus risus id massa accumsan, hendrerit posuere mauris pulvinar.\n\nNullam risus felis, dictum et varius eget, rutrum non nunc. Vestibulum lorem nulla, porttitor ac sapien interdum, porta tristique turpis. Quisque ut dui vitae urna congue scelerisque. Nulla eu commodo felis. Nulla aliquam magna a arcu elementum, vitae tincidunt risus semper. Sed consectetur diam vel magna mattis, sed congue nisi fringilla. Ut in facilisis elit. Etiam aliquet orci urna. Nam interdum nunc fringilla iaculis cursus.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ligula sapien, fermentum vitae aliquam sed, lacinia in nibh. Pellentesque euismod diam eget justo interdum, sit amet elementum ipsum vulputate. Aliquam sed purus urna. Vivamus luctus nisi sem, a fringilla velit iaculis id. Donec nec vulputate justo. Fusce vulputate sodales tellus, in fringilla ante posuere non. Vivamus vulputate nisl non augue dignissim, consectetur rutrum risus facilisis. Sed consectetur aliquam dolor, sed pulvinar mi tristique vitae. Donec quis ligula quis velit consequat dictum id eu felis. Mauris ac congue ante, sed elementum eros.\n\nSed eu euismod dolor, a vestibulum lorem. Phasellus euismod volutpat risus sit amet pellentesque. Integer sit amet nisl malesuada, posuere orci sodales, euismod metus. Suspendisse potenti. Nullam mollis tristique accumsan. Vestibulum sit amet dictum nisl. Sed rhoncus lacus purus, vitae scelerisque urna venenatis at.\n\nUt ornare sapien sed condimentum varius. Nulla ut varius nibh. Nam consequat ligula sem, interdum hendrerit diam commodo sed. Vestibulum imperdiet mauris quis mauris vestibulum lobortis. Nunc bibendum, nunc ut porttitor tristique, turpis mauris cursus magna, ac molestie risus hendrerit odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras pulvinar odio vestibulum ligula mollis, vel venenatis orci semper. Duis consectetur molestie justo, ut pulvinar nisi semper vel. Cras quis fringilla augue, ut vehicula turpis. Praesent nec imperdiet dui. Morbi quis pharetra lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed luctus mauris vitae augue rhoncus, vel interdum nisl pellentesque. In tempor, mi et vestibulum condimentum, nisl mauris cursus diam, aliquet vestibulum risus erat sit amet diam.\n\nInteger suscipit eros at diam tempor, ac condimentum turpis pharetra. Vestibulum pharetra risus in lacus semper, at bibendum ligula condimentum. Proin sed massa eget risus malesuada dignissim et in ipsum. Donec convallis tellus vel lectus lobortis, non lobortis libero faucibus. Sed nec posuere mi. Pellentesque sed sem sit amet erat lobortis commodo nec ut nisl. Pellentesque rhoncus risus id massa accumsan, hendrerit posuere mauris pulvinar.\n\nNullam risus felis, dictum et varius eget, rutrum non nunc. Vestibulum lorem nulla, porttitor ac sapien interdum, porta tristique turpis. Quisque ut dui vitae urna congue scelerisque. Nulla eu commodo felis. Nulla aliquam magna a arcu elementum, vitae tincidunt risus semper. Sed consectetur diam vel magna mattis, sed congue nisi fringilla. Ut in facilisis elit. Etiam aliquet orci urna. Nam interdum nunc fringilla iaculis cursus.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nam ligula sapien, fermentum vitae aliquam sed, lacinia in nibh. Pellentesque euismod diam eget justo interdum, sit amet elementum ipsum vulputate. Aliquam sed purus urna. Vivamus luctus nisi sem, a fringilla velit iaculis id. Donec nec vulputate justo. Fusce vulputate sodales tellus, in fringilla ante posuere non. Vivamus vulputate nisl non augue dignissim, consectetur rutrum risus facilisis. Sed consectetur aliquam dolor, sed pulvinar mi tristique vitae. Donec quis ligula quis velit consequat dictum id eu felis. Mauris ac congue ante, sed elementum eros.\n\nSed eu euismod dolor, a vestibulum lorem. Phasellus euismod volutpat risus sit amet pellentesque. Integer sit amet nisl malesuada, posuere orci sodales, euismod metus. Suspendisse potenti. Nullam mollis tristique accumsan. Vestibulum sit amet dictum nisl. Sed rhoncus lacus purus, vitae scelerisque urna venenatis at.\n\nUt ornare sapien sed condimentum varius. Nulla ut varius nibh. Nam consequat ligula sem, interdum hendrerit diam commodo sed. Vestibulum imperdiet mauris quis mauris vestibulum lobortis. Nunc bibendum, nunc ut porttitor tristique, turpis mauris cursus magna, ac molestie risus hendrerit odio. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras pulvinar odio vestibulum ligula mollis, vel venenatis orci semper. Duis consectetur molestie justo, ut pulvinar nisi semper vel. Cras quis fringilla augue, ut vehicula turpis. Praesent nec imperdiet dui. Morbi quis pharetra lectus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Sed luctus mauris vitae augue rhoncus, vel interdum nisl pellentesque. In tempor, mi et vestibulum condimentum, nisl mauris cursus diam, aliquet vestibulum risus erat sit amet diam.\n\nInteger suscipit eros at diam tempor, ac condimentum turpis pharetra. Vestibulum pharetra risus in lacus semper, at bibendum ligula condimentum. Proin sed massa eget risus malesuada dignissim et in ipsum. Donec convallis tellus vel lectus lobortis, non lobortis libero faucibus. Sed nec posuere mi. Pellentesque sed sem sit amet erat lobortis commodo nec ut nisl. Pellentesque rhoncus risus id massa accumsan, hendrerit posuere mauris pulvinar.\n\nNullam risus felis, dictum et varius eget, rutrum non nunc. Vestibulum lorem nulla, porttitor ac sapien interdum, porta tristique turpis. Quisque ut dui vitae urna congue scelerisque. Nulla eu commodo felis. Nulla aliquam magna a arcu elementum, vitae tincidunt risus semper. Sed consectetur diam vel magna mattis, sed congue nisi fringilla. Ut in facilisis elit. Etiam aliquet orci urna. Nam interdum nunc fringilla iaculis cursus.
5 |
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
15 |
16 |
20 |
21 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/app/src/test/java/com/itheima/systembar/systembartint/ExampleUnitTest.java:
--------------------------------------------------------------------------------
1 | package com.itheima.systembar.systembartint;
2 |
3 | import org.junit.Test;
4 |
5 | import static org.junit.Assert.*;
6 |
7 | /**
8 | * To work on unit tests, switch the Test Artifact in the Build Variants view.
9 | */
10 | public class ExampleUnitTest {
11 | @Test
12 | public void addition_isCorrect() throws Exception {
13 | assertEquals(4, 2 + 2);
14 | }
15 | }
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | repositories {
5 | jcenter()
6 | }
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:2.1.0'
9 | classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
10 | // NOTE: Do not place your application dependencies here; they belong
11 | // in the individual module build.gradle files
12 | }
13 | }
14 |
15 | allprojects {
16 | repositories {
17 | jcenter()
18 | }
19 | }
20 |
21 | task clean(type: Delete) {
22 | delete rootProject.buildDir
23 | }
24 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/open-android/SystemBarTint/10c7be14d7f50b10e2c069a81d0798b1fb3b417f/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Dec 28 10:00:20 PST 2015
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
10 | DEFAULT_JVM_OPTS=""
11 |
12 | APP_NAME="Gradle"
13 | APP_BASE_NAME=`basename "$0"`
14 |
15 | # Use the maximum available, or set MAX_FD != -1 to use that value.
16 | MAX_FD="maximum"
17 |
18 | warn ( ) {
19 | echo "$*"
20 | }
21 |
22 | die ( ) {
23 | echo
24 | echo "$*"
25 | echo
26 | exit 1
27 | }
28 |
29 | # OS specific support (must be 'true' or 'false').
30 | cygwin=false
31 | msys=false
32 | darwin=false
33 | case "`uname`" in
34 | CYGWIN* )
35 | cygwin=true
36 | ;;
37 | Darwin* )
38 | darwin=true
39 | ;;
40 | MINGW* )
41 | msys=true
42 | ;;
43 | esac
44 |
45 | # Attempt to set APP_HOME
46 | # Resolve links: $0 may be a link
47 | PRG="$0"
48 | # Need this for relative symlinks.
49 | while [ -h "$PRG" ] ; do
50 | ls=`ls -ld "$PRG"`
51 | link=`expr "$ls" : '.*-> \(.*\)$'`
52 | if expr "$link" : '/.*' > /dev/null; then
53 | PRG="$link"
54 | else
55 | PRG=`dirname "$PRG"`"/$link"
56 | fi
57 | done
58 | SAVED="`pwd`"
59 | cd "`dirname \"$PRG\"`/" >/dev/null
60 | APP_HOME="`pwd -P`"
61 | cd "$SAVED" >/dev/null
62 |
63 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
64 |
65 | # Determine the Java command to use to start the JVM.
66 | if [ -n "$JAVA_HOME" ] ; then
67 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
68 | # IBM's JDK on AIX uses strange locations for the executables
69 | JAVACMD="$JAVA_HOME/jre/sh/java"
70 | else
71 | JAVACMD="$JAVA_HOME/bin/java"
72 | fi
73 | if [ ! -x "$JAVACMD" ] ; then
74 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
75 |
76 | Please set the JAVA_HOME variable in your environment to match the
77 | location of your Java installation."
78 | fi
79 | else
80 | JAVACMD="java"
81 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
82 |
83 | Please set the JAVA_HOME variable in your environment to match the
84 | location of your Java installation."
85 | fi
86 |
87 | # Increase the maximum file descriptors if we can.
88 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
89 | MAX_FD_LIMIT=`ulimit -H -n`
90 | if [ $? -eq 0 ] ; then
91 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
92 | MAX_FD="$MAX_FD_LIMIT"
93 | fi
94 | ulimit -n $MAX_FD
95 | if [ $? -ne 0 ] ; then
96 | warn "Could not set maximum file descriptor limit: $MAX_FD"
97 | fi
98 | else
99 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
100 | fi
101 | fi
102 |
103 | # For Darwin, add options to specify how the application appears in the dock
104 | if $darwin; then
105 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
106 | fi
107 |
108 | # For Cygwin, switch paths to Windows format before running java
109 | if $cygwin ; then
110 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
111 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
112 | JAVACMD=`cygpath --unix "$JAVACMD"`
113 |
114 | # We build the pattern for arguments to be converted via cygpath
115 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
116 | SEP=""
117 | for dir in $ROOTDIRSRAW ; do
118 | ROOTDIRS="$ROOTDIRS$SEP$dir"
119 | SEP="|"
120 | done
121 | OURCYGPATTERN="(^($ROOTDIRS))"
122 | # Add a user-defined pattern to the cygpath arguments
123 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
124 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
125 | fi
126 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
127 | i=0
128 | for arg in "$@" ; do
129 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
130 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
131 |
132 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
133 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
134 | else
135 | eval `echo args$i`="\"$arg\""
136 | fi
137 | i=$((i+1))
138 | done
139 | case $i in
140 | (0) set -- ;;
141 | (1) set -- "$args0" ;;
142 | (2) set -- "$args0" "$args1" ;;
143 | (3) set -- "$args0" "$args1" "$args2" ;;
144 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
145 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
146 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
147 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
148 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
149 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
150 | esac
151 | fi
152 |
153 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
154 | function splitJvmOpts() {
155 | JVM_OPTS=("$@")
156 | }
157 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
158 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
159 |
160 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
161 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/library/.classpath:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/library/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/library/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/library/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 |
3 | apply plugin: 'com.github.dcendents.android-maven'
4 | group='com.github.itcastsh'
5 |
6 | dependencies {
7 | compile fileTree(dir: 'libs', include: '*.jar')
8 | }
9 |
10 | android {
11 | compileSdkVersion 23
12 | buildToolsVersion "24.0.1"
13 |
14 | sourceSets {
15 | main {
16 | manifest.srcFile 'AndroidManifest.xml'
17 | java.srcDirs = ['src']
18 | resources.srcDirs = ['src']
19 | aidl.srcDirs = ['src']
20 | renderscript.srcDirs = ['src']
21 | res.srcDirs = ['res']
22 | assets.srcDirs = ['assets']
23 | }
24 |
25 | // Move the tests to tests/java, tests/res, etc...
26 | instrumentTest.setRoot('tests')
27 |
28 | // Move the build types to build-types/
29 | // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
30 | // This moves them out of them default location under src//... which would
31 | // conflict with src/ being used by the main source set.
32 | // Adding new build types or product flavors should be accompanied
33 | // by a similar customization.
34 | debug.setRoot('build-types/debug')
35 | release.setRoot('build-types/release')
36 | }
37 | }
38 |
39 |
40 | //apply from: 'https://raw.github.com/chrisbanes/gradle-mvn-push/master/gradle-mvn-push.gradle'
41 | //apply from: 'https://raw.githubusercontent.com/jpardogo/gradle-mvn-push/master/gradle-mvn-push.gradle'
--------------------------------------------------------------------------------
/library/build.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
29 |
30 |
31 |
40 |
41 |
42 |
43 |
47 |
48 |
49 |
51 |
63 |
64 |
82 |
83 |
84 |
85 |
86 |
90 |
91 |
92 |
93 |
--------------------------------------------------------------------------------
/library/gradle.properties:
--------------------------------------------------------------------------------
1 | POM_NAME=SystemBarTint
2 | POM_ARTIFACT_ID=systembartint
3 | POM_PACKAGING=jar
--------------------------------------------------------------------------------
/library/proguard-project.txt:
--------------------------------------------------------------------------------
1 | # To enable ProGuard in your project, edit project.properties
2 | # to define the proguard.config property as described in that file.
3 | #
4 | # Add project specific ProGuard rules here.
5 | # By default, the flags in this file are appended to flags specified
6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt
7 | # You can edit the include path and order by changing the ProGuard
8 | # include property in project.properties.
9 | #
10 | # For more details, see
11 | # http://developer.android.com/guide/developing/tools/proguard.html
12 |
13 | # Add any project specific keep options here:
14 |
15 | # If your project uses WebView with JS, uncomment the following
16 | # and specify the fully qualified class name to the JavaScript interface
17 | # class:
18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
19 | # public *;
20 | #}
21 |
--------------------------------------------------------------------------------
/library/project.properties:
--------------------------------------------------------------------------------
1 | # This file is automatically generated by Android Tools.
2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3 | #
4 | # This file must be checked in Version Control Systems.
5 | #
6 | # To customize properties used by the Ant build system edit
7 | # "ant.properties", and override values to adapt the script to your
8 | # project structure.
9 | #
10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
12 |
13 | # Project target.
14 | target=android-19
15 | android.library=true
16 |
--------------------------------------------------------------------------------
/library/src/com/itheima/systembartint/SystemBarTintManager.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Copyright (C) 2013 readyState Software Ltd
3 | *
4 | * Licensed under the Apache License, Version 2.0 (the "License");
5 | * you may not use this file except in compliance with the License.
6 | * You may obtain a copy of the License at
7 | *
8 | * http://www.apache.org/licenses/LICENSE-2.0
9 | *
10 | * Unless required by applicable law or agreed to in writing, software
11 | * distributed under the License is distributed on an "AS IS" BASIS,
12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | * See the License for the specific language governing permissions and
14 | * limitations under the License.
15 | */
16 |
17 | package com.itheima.systembartint;
18 |
19 | import android.annotation.SuppressLint;
20 | import android.annotation.TargetApi;
21 | import android.app.Activity;
22 | import android.content.Context;
23 | import android.content.res.Configuration;
24 | import android.content.res.Resources;
25 | import android.content.res.TypedArray;
26 | import android.graphics.drawable.Drawable;
27 | import android.os.Build;
28 | import android.util.DisplayMetrics;
29 | import android.util.TypedValue;
30 | import android.view.Gravity;
31 | import android.view.View;
32 | import android.view.ViewConfiguration;
33 | import android.view.ViewGroup;
34 | import android.view.Window;
35 | import android.view.WindowManager;
36 | import android.widget.FrameLayout.LayoutParams;
37 |
38 | import java.lang.reflect.Method;
39 |
40 | /**
41 | * Class to manage status and navigation bar tint effects when using KitKat
42 | * translucent system UI modes.
43 | *
44 | */
45 | public class SystemBarTintManager {
46 |
47 | static {
48 | // Android allows a system property to override the presence of the navigation bar.
49 | // Used by the emulator.
50 | // See https://github.com/android/platform_frameworks_base/blob/master/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java#L1076
51 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
52 | try {
53 | Class c = Class.forName("android.os.SystemProperties");
54 | Method m = c.getDeclaredMethod("get", String.class);
55 | m.setAccessible(true);
56 | sNavBarOverride = (String) m.invoke(null, "qemu.hw.mainkeys");
57 | } catch (Throwable e) {
58 | sNavBarOverride = null;
59 | }
60 | }
61 | }
62 |
63 |
64 | /**
65 | * The default system bar tint color value.
66 | */
67 | public static final int DEFAULT_TINT_COLOR = 0x99000000;
68 |
69 | private static String sNavBarOverride;
70 |
71 | private final SystemBarConfig mConfig;
72 | private boolean mStatusBarAvailable;
73 | private boolean mNavBarAvailable;
74 | private boolean mStatusBarTintEnabled;
75 | private boolean mNavBarTintEnabled;
76 | private View mStatusBarTintView;
77 | private View mNavBarTintView;
78 |
79 | /**
80 | * Constructor. Call this in the host activity onCreate method after its
81 | * content view has been set. You should always create new instances when
82 | * the host activity is recreated.
83 | *
84 | * @param activity The host activity.
85 | */
86 | @TargetApi(19)
87 | public SystemBarTintManager(Activity activity) {
88 |
89 | Window win = activity.getWindow();
90 | ViewGroup decorViewGroup = (ViewGroup) win.getDecorView();
91 |
92 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
93 | // check theme attrs
94 | int[] attrs = {android.R.attr.windowTranslucentStatus,
95 | android.R.attr.windowTranslucentNavigation};
96 | TypedArray a = activity.obtainStyledAttributes(attrs);
97 | try {
98 | mStatusBarAvailable = a.getBoolean(0, false);
99 | mNavBarAvailable = a.getBoolean(1, false);
100 | } finally {
101 | a.recycle();
102 | }
103 |
104 | // check window flags
105 | WindowManager.LayoutParams winParams = win.getAttributes();
106 | int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
107 | if ((winParams.flags & bits) != 0) {
108 | mStatusBarAvailable = true;
109 | }
110 | bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
111 | if ((winParams.flags & bits) != 0) {
112 | mNavBarAvailable = true;
113 | }
114 | }
115 |
116 | mConfig = new SystemBarConfig(activity, mStatusBarAvailable, mNavBarAvailable);
117 | // device might not have virtual navigation keys
118 | if (!mConfig.hasNavigtionBar()) {
119 | mNavBarAvailable = false;
120 | }
121 |
122 | if (mStatusBarAvailable) {
123 | setupStatusBarView(activity, decorViewGroup);
124 | }
125 | if (mNavBarAvailable) {
126 | setupNavBarView(activity, decorViewGroup);
127 | }
128 |
129 | }
130 |
131 | /**
132 | * Enable tinting of the system status bar.
133 | *
134 | * If the platform is running Jelly Bean or earlier, or translucent system
135 | * UI modes have not been enabled in either the theme or via window flags,
136 | * then this method does nothing.
137 | *
138 | * @param enabled True to enable tinting, false to disable it (default).
139 | */
140 | public void setStatusBarTintEnabled(boolean enabled) {
141 | mStatusBarTintEnabled = enabled;
142 | if (mStatusBarAvailable) {
143 | mStatusBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);
144 | }
145 | }
146 |
147 | /**
148 | * Enable tinting of the system navigation bar.
149 | *
150 | * If the platform does not have soft navigation keys, is running Jelly Bean
151 | * or earlier, or translucent system UI modes have not been enabled in either
152 | * the theme or via window flags, then this method does nothing.
153 | *
154 | * @param enabled True to enable tinting, false to disable it (default).
155 | */
156 | public void setNavigationBarTintEnabled(boolean enabled) {
157 | mNavBarTintEnabled = enabled;
158 | if (mNavBarAvailable) {
159 | mNavBarTintView.setVisibility(enabled ? View.VISIBLE : View.GONE);
160 | }
161 | }
162 |
163 | /**
164 | * Apply the specified color tint to all system UI bars.
165 | *
166 | * @param color The color of the background tint.
167 | */
168 | public void setTintColor(int color) {
169 | setStatusBarTintColor(color);
170 | setNavigationBarTintColor(color);
171 | }
172 |
173 | /**
174 | * Apply the specified drawable or color resource to all system UI bars.
175 | *
176 | * @param res The identifier of the resource.
177 | */
178 | public void setTintResource(int res) {
179 | setStatusBarTintResource(res);
180 | setNavigationBarTintResource(res);
181 | }
182 |
183 | /**
184 | * Apply the specified drawable to all system UI bars.
185 | *
186 | * @param drawable The drawable to use as the background, or null to remove it.
187 | */
188 | public void setTintDrawable(Drawable drawable) {
189 | setStatusBarTintDrawable(drawable);
190 | setNavigationBarTintDrawable(drawable);
191 | }
192 |
193 | /**
194 | * Apply the specified alpha to all system UI bars.
195 | *
196 | * @param alpha The alpha to use
197 | */
198 | public void setTintAlpha(float alpha) {
199 | setStatusBarAlpha(alpha);
200 | setNavigationBarAlpha(alpha);
201 | }
202 |
203 | /**
204 | * Apply the specified color tint to the system status bar.
205 | *
206 | * @param color The color of the background tint.
207 | */
208 | public void setStatusBarTintColor(int color) {
209 | if (mStatusBarAvailable) {
210 | mStatusBarTintView.setBackgroundColor(color);
211 | }
212 | }
213 |
214 | /**
215 | * Apply the specified drawable or color resource to the system status bar.
216 | *
217 | * @param res The identifier of the resource.
218 | */
219 | public void setStatusBarTintResource(int res) {
220 | if (mStatusBarAvailable) {
221 | mStatusBarTintView.setBackgroundResource(res);
222 | }
223 | }
224 |
225 | /**
226 | * Apply the specified drawable to the system status bar.
227 | *
228 | * @param drawable The drawable to use as the background, or null to remove it.
229 | */
230 | @SuppressWarnings("deprecation")
231 | public void setStatusBarTintDrawable(Drawable drawable) {
232 | if (mStatusBarAvailable) {
233 | mStatusBarTintView.setBackgroundDrawable(drawable);
234 | }
235 | }
236 |
237 | /**
238 | * Apply the specified alpha to the system status bar.
239 | *
240 | * @param alpha The alpha to use
241 | */
242 | @TargetApi(11)
243 | public void setStatusBarAlpha(float alpha) {
244 | if (mStatusBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
245 | mStatusBarTintView.setAlpha(alpha);
246 | }
247 | }
248 |
249 | /**
250 | * Apply the specified color tint to the system navigation bar.
251 | *
252 | * @param color The color of the background tint.
253 | */
254 | public void setNavigationBarTintColor(int color) {
255 | if (mNavBarAvailable) {
256 | mNavBarTintView.setBackgroundColor(color);
257 | }
258 | }
259 |
260 | /**
261 | * Apply the specified drawable or color resource to the system navigation bar.
262 | *
263 | * @param res The identifier of the resource.
264 | */
265 | public void setNavigationBarTintResource(int res) {
266 | if (mNavBarAvailable) {
267 | mNavBarTintView.setBackgroundResource(res);
268 | }
269 | }
270 |
271 | /**
272 | * Apply the specified drawable to the system navigation bar.
273 | *
274 | * @param drawable The drawable to use as the background, or null to remove it.
275 | */
276 | @SuppressWarnings("deprecation")
277 | public void setNavigationBarTintDrawable(Drawable drawable) {
278 | if (mNavBarAvailable) {
279 | mNavBarTintView.setBackgroundDrawable(drawable);
280 | }
281 | }
282 |
283 | /**
284 | * Apply the specified alpha to the system navigation bar.
285 | *
286 | * @param alpha The alpha to use
287 | */
288 | @TargetApi(11)
289 | public void setNavigationBarAlpha(float alpha) {
290 | if (mNavBarAvailable && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
291 | mNavBarTintView.setAlpha(alpha);
292 | }
293 | }
294 |
295 | /**
296 | * Get the system bar configuration.
297 | *
298 | * @return The system bar configuration for the current device configuration.
299 | */
300 | public SystemBarConfig getConfig() {
301 | return mConfig;
302 | }
303 |
304 | /**
305 | * Is tinting enabled for the system status bar?
306 | *
307 | * @return True if enabled, False otherwise.
308 | */
309 | public boolean isStatusBarTintEnabled() {
310 | return mStatusBarTintEnabled;
311 | }
312 |
313 | /**
314 | * Is tinting enabled for the system navigation bar?
315 | *
316 | * @return True if enabled, False otherwise.
317 | */
318 | public boolean isNavBarTintEnabled() {
319 | return mNavBarTintEnabled;
320 | }
321 |
322 | private void setupStatusBarView(Context context, ViewGroup decorViewGroup) {
323 | mStatusBarTintView = new View(context);
324 | LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getStatusBarHeight());
325 | params.gravity = Gravity.TOP;
326 | if (mNavBarAvailable && !mConfig.isNavigationAtBottom()) {
327 | params.rightMargin = mConfig.getNavigationBarWidth();
328 | }
329 | mStatusBarTintView.setLayoutParams(params);
330 | mStatusBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
331 | mStatusBarTintView.setVisibility(View.GONE);
332 | decorViewGroup.addView(mStatusBarTintView);
333 | }
334 |
335 | private void setupNavBarView(Context context, ViewGroup decorViewGroup) {
336 | mNavBarTintView = new View(context);
337 | LayoutParams params;
338 | if (mConfig.isNavigationAtBottom()) {
339 | params = new LayoutParams(LayoutParams.MATCH_PARENT, mConfig.getNavigationBarHeight());
340 | params.gravity = Gravity.BOTTOM;
341 | } else {
342 | params = new LayoutParams(mConfig.getNavigationBarWidth(), LayoutParams.MATCH_PARENT);
343 | params.gravity = Gravity.RIGHT;
344 | }
345 | mNavBarTintView.setLayoutParams(params);
346 | mNavBarTintView.setBackgroundColor(DEFAULT_TINT_COLOR);
347 | mNavBarTintView.setVisibility(View.GONE);
348 | decorViewGroup.addView(mNavBarTintView);
349 | }
350 |
351 | /**
352 | * Class which describes system bar sizing and other characteristics for the current
353 | * device configuration.
354 | *
355 | */
356 | public static class SystemBarConfig {
357 |
358 | private static final String STATUS_BAR_HEIGHT_RES_NAME = "status_bar_height";
359 | private static final String NAV_BAR_HEIGHT_RES_NAME = "navigation_bar_height";
360 | private static final String NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME = "navigation_bar_height_landscape";
361 | private static final String NAV_BAR_WIDTH_RES_NAME = "navigation_bar_width";
362 | private static final String SHOW_NAV_BAR_RES_NAME = "config_showNavigationBar";
363 |
364 | private final boolean mTranslucentStatusBar;
365 | private final boolean mTranslucentNavBar;
366 | private final int mStatusBarHeight;
367 | private final int mActionBarHeight;
368 | private final boolean mHasNavigationBar;
369 | private final int mNavigationBarHeight;
370 | private final int mNavigationBarWidth;
371 | private final boolean mInPortrait;
372 | private final float mSmallestWidthDp;
373 |
374 | private SystemBarConfig(Activity activity, boolean translucentStatusBar, boolean traslucentNavBar) {
375 | Resources res = activity.getResources();
376 | mInPortrait = (res.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT);
377 | mSmallestWidthDp = getSmallestWidthDp(activity);
378 | mStatusBarHeight = getInternalDimensionSize(res, STATUS_BAR_HEIGHT_RES_NAME);
379 | mActionBarHeight = getActionBarHeight(activity);
380 | mNavigationBarHeight = getNavigationBarHeight(activity);
381 | mNavigationBarWidth = getNavigationBarWidth(activity);
382 | mHasNavigationBar = (mNavigationBarHeight > 0);
383 | mTranslucentStatusBar = translucentStatusBar;
384 | mTranslucentNavBar = traslucentNavBar;
385 | }
386 |
387 | @TargetApi(14)
388 | private int getActionBarHeight(Context context) {
389 | int result = 0;
390 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
391 | TypedValue tv = new TypedValue();
392 | context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true);
393 | result = TypedValue.complexToDimensionPixelSize(tv.data, context.getResources().getDisplayMetrics());
394 | }
395 | return result;
396 | }
397 |
398 | @TargetApi(14)
399 | private int getNavigationBarHeight(Context context) {
400 | Resources res = context.getResources();
401 | int result = 0;
402 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
403 | if (hasNavBar(context)) {
404 | String key;
405 | if (mInPortrait) {
406 | key = NAV_BAR_HEIGHT_RES_NAME;
407 | } else {
408 | key = NAV_BAR_HEIGHT_LANDSCAPE_RES_NAME;
409 | }
410 | return getInternalDimensionSize(res, key);
411 | }
412 | }
413 | return result;
414 | }
415 |
416 | @TargetApi(14)
417 | private int getNavigationBarWidth(Context context) {
418 | Resources res = context.getResources();
419 | int result = 0;
420 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
421 | if (hasNavBar(context)) {
422 | return getInternalDimensionSize(res, NAV_BAR_WIDTH_RES_NAME);
423 | }
424 | }
425 | return result;
426 | }
427 |
428 | @TargetApi(14)
429 | private boolean hasNavBar(Context context) {
430 | Resources res = context.getResources();
431 | int resourceId = res.getIdentifier(SHOW_NAV_BAR_RES_NAME, "bool", "android");
432 | if (resourceId != 0) {
433 | boolean hasNav = res.getBoolean(resourceId);
434 | // check override flag (see static block)
435 | if ("1".equals(sNavBarOverride)) {
436 | hasNav = false;
437 | } else if ("0".equals(sNavBarOverride)) {
438 | hasNav = true;
439 | }
440 | return hasNav;
441 | } else { // fallback
442 | return !ViewConfiguration.get(context).hasPermanentMenuKey();
443 | }
444 | }
445 |
446 | private int getInternalDimensionSize(Resources res, String key) {
447 | int result = 0;
448 | int resourceId = res.getIdentifier(key, "dimen", "android");
449 | if (resourceId > 0) {
450 | result = res.getDimensionPixelSize(resourceId);
451 | }
452 | return result;
453 | }
454 |
455 | @SuppressLint("NewApi")
456 | private float getSmallestWidthDp(Activity activity) {
457 | DisplayMetrics metrics = new DisplayMetrics();
458 | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
459 | activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
460 | } else {
461 | // TODO this is not correct, but we don't really care pre-kitkat
462 | activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
463 | }
464 | float widthDp = metrics.widthPixels / metrics.density;
465 | float heightDp = metrics.heightPixels / metrics.density;
466 | return Math.min(widthDp, heightDp);
467 | }
468 |
469 | /**
470 | * Should a navigation bar appear at the bottom of the screen in the current
471 | * device configuration? A navigation bar may appear on the right side of
472 | * the screen in certain configurations.
473 | *
474 | * @return True if navigation should appear at the bottom of the screen, False otherwise.
475 | */
476 | public boolean isNavigationAtBottom() {
477 | return (mSmallestWidthDp >= 600 || mInPortrait);
478 | }
479 |
480 | /**
481 | * Get the height of the system status bar.
482 | *
483 | * @return The height of the status bar (in pixels).
484 | */
485 | public int getStatusBarHeight() {
486 | return mStatusBarHeight;
487 | }
488 |
489 | /**
490 | * Get the height of the action bar.
491 | *
492 | * @return The height of the action bar (in pixels).
493 | */
494 | public int getActionBarHeight() {
495 | return mActionBarHeight;
496 | }
497 |
498 | /**
499 | * Does this device have a system navigation bar?
500 | *
501 | * @return True if this device uses soft key navigation, False otherwise.
502 | */
503 | public boolean hasNavigtionBar() {
504 | return mHasNavigationBar;
505 | }
506 |
507 | /**
508 | * Get the height of the system navigation bar.
509 | *
510 | * @return The height of the navigation bar (in pixels). If the device does not have
511 | * soft navigation keys, this will always return 0.
512 | */
513 | public int getNavigationBarHeight() {
514 | return mNavigationBarHeight;
515 | }
516 |
517 | /**
518 | * Get the width of the system navigation bar when it is placed vertically on the screen.
519 | *
520 | * @return The width of the navigation bar (in pixels). If the device does not have
521 | * soft navigation keys, this will always return 0.
522 | */
523 | public int getNavigationBarWidth() {
524 | return mNavigationBarWidth;
525 | }
526 |
527 | /**
528 | * Get the layout inset for any system UI that appears at the top of the screen.
529 | *
530 | * @param withActionBar True to include the height of the action bar, False otherwise.
531 | * @return The layout inset (in pixels).
532 | */
533 | public int getPixelInsetTop(boolean withActionBar) {
534 | return (mTranslucentStatusBar ? mStatusBarHeight : 0) + (withActionBar ? mActionBarHeight : 0);
535 | }
536 |
537 | /**
538 | * Get the layout inset for any system UI that appears at the bottom of the screen.
539 | *
540 | * @return The layout inset (in pixels).
541 | */
542 | public int getPixelInsetBottom() {
543 | if (mTranslucentNavBar && isNavigationAtBottom()) {
544 | return mNavigationBarHeight;
545 | } else {
546 | return 0;
547 | }
548 | }
549 |
550 | /**
551 | * Get the layout inset for any system UI that appears at the right of the screen.
552 | *
553 | * @return The layout inset (in pixels).
554 | */
555 | public int getPixelInsetRight() {
556 | if (mTranslucentNavBar && !isNavigationAtBottom()) {
557 | return mNavigationBarWidth;
558 | } else {
559 | return 0;
560 | }
561 | }
562 |
563 | }
564 |
565 | }
566 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':library'
2 |
--------------------------------------------------------------------------------