Skip to content

Commit ca0241d

Browse files
committed
添加简书夜间模式的实现思路
1 parent abea1f7 commit ca0241d

11 files changed

Lines changed: 341 additions & 106 deletions

File tree

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,5 @@ dependencies {
4343
//compile project(":AndroidUtils")
4444
compile 'com.android.support:appcompat-v7:23.2.1'
4545
compile 'com.android.support:recyclerview-v7:23.2.1'
46+
compile 'com.android.support:cardview-v7:23.1.1'
4647
}
Lines changed: 110 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,154 @@
11
package com.clock.study.activity;
22

3-
import android.animation.Animator;
4-
import android.animation.AnimatorListenerAdapter;
5-
import android.animation.ObjectAnimator;
6-
import android.graphics.Bitmap;
3+
import android.content.res.Resources;
74
import android.os.Bundle;
85
import android.support.v7.app.AppCompatActivity;
9-
import android.view.Menu;
10-
import android.view.MenuInflater;
11-
import android.view.MenuItem;
12-
import android.view.View;
13-
import android.widget.ImageView;
6+
import android.support.v7.widget.LinearLayoutManager;
7+
import android.support.v7.widget.RecyclerView;
8+
import android.util.Log;
9+
import android.util.TypedValue;
10+
import android.view.Window;
11+
import android.widget.CheckBox;
12+
import android.widget.CompoundButton;
13+
import android.widget.LinearLayout;
14+
import android.widget.RelativeLayout;
15+
import android.widget.TextView;
1416

1517
import com.clock.study.R;
18+
import com.clock.study.adapter.SimpleAuthorAdapter;
19+
import com.clock.study.helper.DayNightHelper;
20+
import com.clock.study.type.DayNight;
21+
22+
import java.util.ArrayList;
23+
import java.util.List;
1624

1725
/**
1826
* 夜间模式实现方案
1927
*
2028
* @author Clock
21-
* @since 2016=08-11
29+
* @since 2016-08-11
2230
*/
23-
public class DayNightActivity extends AppCompatActivity {
31+
public class DayNightActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
2432

2533
private final static String TAG = DayNightActivity.class.getSimpleName();
2634

27-
private static boolean isNight = false;
35+
private DayNightHelper mDayNightHelper;
2836

29-
private View mRootView;
30-
/**
31-
* 切换模式时,保存界面效果用于
32-
*/
33-
private ImageView mTransView;
37+
private RecyclerView mRecyclerView;
38+
39+
private LinearLayout mHeaderLayout;
40+
private List<RelativeLayout> mLayoutList;
41+
private List<TextView> mTextViewList;
42+
private List<CheckBox> mCheckBoxList;
3443

3544
@Override
3645
protected void onCreate(Bundle savedInstanceState) {
3746
super.onCreate(savedInstanceState);
38-
if (isNight) {
39-
setTheme(R.style.NightTheme);
40-
} else {
41-
setTheme(R.style.DayTheme);
42-
}
47+
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
48+
initData();
49+
initTheme();
4350
setContentView(R.layout.activity_day_night);
4451
initView();
52+
}
53+
54+
private void initView() {
55+
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
56+
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
57+
mRecyclerView.setLayoutManager(layoutManager);
58+
mRecyclerView.setAdapter(new SimpleAuthorAdapter());
59+
60+
mHeaderLayout = (LinearLayout) findViewById(R.id.header_layout);
61+
62+
mLayoutList = new ArrayList<>();
63+
mLayoutList.add((RelativeLayout) findViewById(R.id.jianshu_layout));
64+
mLayoutList.add((RelativeLayout) findViewById(R.id.zhihu_layout));
65+
66+
mTextViewList = new ArrayList<>();
67+
mTextViewList.add((TextView) findViewById(R.id.tv_jianshu));
68+
mTextViewList.add((TextView) findViewById(R.id.tv_zhihu));
69+
70+
mCheckBoxList = new ArrayList<>();
71+
CheckBox ckbJianshu = (CheckBox) findViewById(R.id.ckb_jianshu);
72+
ckbJianshu.setOnCheckedChangeListener(this);
73+
mCheckBoxList.add(ckbJianshu);
74+
CheckBox ckbZhihu = (CheckBox) findViewById(R.id.ckb_zhihu);
75+
ckbZhihu.setOnCheckedChangeListener(this);
76+
mCheckBoxList.add(ckbZhihu);
4577

4678
}
4779

48-
@Override
49-
public boolean onCreateOptionsMenu(Menu menu) {
50-
MenuInflater menuInflater = new MenuInflater(this);
51-
menuInflater.inflate(R.menu.day_night_menu, menu);
52-
return super.onCreateOptionsMenu(menu);
80+
private void initData() {
81+
mDayNightHelper = new DayNightHelper(this);
5382
}
5483

84+
5585
@Override
56-
public boolean onOptionsItemSelected(MenuItem item) {
57-
int itemId = item.getItemId();
58-
if (itemId == R.id.day_mode) {
59-
isNight = false;
60-
recreate();
61-
} else if (itemId == R.id.night_mode) {
62-
isNight = true;
63-
//initTransBitmap();
64-
//startAnimation(mTransView);
65-
recreate();
86+
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
87+
int viewId = buttonView.getId();
88+
if (viewId == R.id.ckb_jianshu) {
89+
changeThemeByJianShu();
90+
91+
} else if (viewId == R.id.ckb_zhihu) {
92+
changeThemeByZhiHu();
93+
6694
}
67-
return super.onOptionsItemSelected(item);
6895
}
6996

70-
private void initView() {
71-
mRootView = findViewById(R.id.layout_main);
72-
mTransView = (ImageView) findViewById(R.id.iv_trans);
97+
private void initTheme() {
98+
if (mDayNightHelper.isDay()) {
99+
setTheme(R.style.DayTheme);
100+
} else {
101+
setTheme(R.style.NightTheme);
102+
}
73103
}
74104

75105
/**
76-
* 初始化起过渡效果用的Bitmap
106+
* 切换主题设置
77107
*/
78-
private void initTransBitmap() {
79-
//开启绘制缓存,让View中的内容能够转换成为Bitmap
80-
mRootView.setDrawingCacheEnabled(true);
81-
Bitmap bitmap = mRootView.getDrawingCache();
82-
if (bitmap != null) {
83-
mTransView.setImageBitmap(bitmap);
84-
mTransView.setAlpha(1f);
85-
mTransView.setVisibility(View.VISIBLE);
108+
private void toggleThemeSetting() {
109+
if (mDayNightHelper.isDay()) {
110+
mDayNightHelper.setMode(DayNight.NIGHT);
111+
setTheme(R.style.NightTheme);
112+
} else {
113+
mDayNightHelper.setMode(DayNight.DAY);
114+
setTheme(R.style.DayTheme);
86115
}
87116
}
88117

89118
/**
90-
* 启动过度用的动画效果
119+
* 使用简书的实现套路来切换夜间主题
91120
*/
92-
private void startAnimation(final View transView) {
93-
ObjectAnimator animator = ObjectAnimator.ofFloat(transView, "alpha", 1f, 0f);
94-
animator.addListener(new AnimatorListenerAdapter() {
95-
@Override
96-
public void onAnimationEnd(Animator animation) {
97-
super.onAnimationEnd(animation);
98-
transView.setVisibility(View.GONE);
99-
}
100-
});
101-
animator.setDuration(1000);
102-
animator.start();
121+
private void changeThemeByJianShu() {
122+
toggleThemeSetting();
103123

124+
final TypedValue typedValue = new TypedValue();
125+
Resources.Theme theme = getTheme();
126+
127+
theme.resolveAttribute(R.attr.clockBackground, typedValue, true);
128+
Log.i(TAG, "clockBackground resourceId: " + typedValue.resourceId);
129+
mHeaderLayout.setBackgroundResource(typedValue.resourceId);
130+
mRecyclerView.setBackgroundResource(typedValue.resourceId);
131+
for (RelativeLayout layout : mLayoutList) {
132+
layout.setBackgroundResource(typedValue.resourceId);
133+
}
134+
for (CheckBox checkBox : mCheckBoxList) {
135+
checkBox.setBackgroundResource(typedValue.resourceId);
136+
}
137+
for (TextView textView : mTextViewList) {
138+
textView.setBackgroundResource(typedValue.resourceId);
139+
}
140+
141+
theme.resolveAttribute(R.attr.clockTextColor, typedValue, true);
142+
Log.i(TAG, "clockTextColor resourceId: " + typedValue.resourceId);
143+
for (TextView textView : mTextViewList) {
144+
textView.setTextColor(getResources().getColor(typedValue.resourceId));
145+
}
104146
}
105147

148+
/**
149+
* 使用知乎的实现套路来切换夜间主题
150+
*/
151+
private void changeThemeByZhiHu() {
152+
toggleThemeSetting();
153+
}
106154
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.clock.study.adapter;
2+
3+
import android.support.v7.widget.RecyclerView;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.view.ViewGroup;
7+
8+
import com.clock.study.R;
9+
10+
/**
11+
* Just Simple Author Adapter
12+
* <p/>
13+
* Created by Clock on 2016/8/24.
14+
*/
15+
public class SimpleAuthorAdapter extends RecyclerView.Adapter<SimpleAuthorAdapter.SimpleViewHolder> {
16+
17+
@Override
18+
public SimpleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
19+
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
20+
View rootView = inflater.inflate(R.layout.author_info_layout, parent, false);
21+
return new SimpleViewHolder(rootView);
22+
}
23+
24+
@Override
25+
public void onBindViewHolder(SimpleViewHolder holder, int position) {
26+
27+
}
28+
29+
@Override
30+
public int getItemCount() {
31+
return 20;
32+
}
33+
34+
static class SimpleViewHolder extends RecyclerView.ViewHolder {
35+
public SimpleViewHolder(View itemView) {
36+
super(itemView);
37+
}
38+
}
39+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.clock.study.helper;
2+
3+
import android.content.Context;
4+
import android.content.SharedPreferences;
5+
6+
import com.clock.study.type.DayNight;
7+
8+
/**
9+
* Created by Clock on 2016/8/24.
10+
*/
11+
public class DayNightHelper {
12+
13+
private final static String FILE_NAME = "settings";
14+
private final static String MODE = "day_night_mode";
15+
16+
private SharedPreferences mSharedPreferences;
17+
18+
public DayNightHelper(Context context) {
19+
this.mSharedPreferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
20+
}
21+
22+
/**
23+
* 保存模式设置
24+
*
25+
* @param mode
26+
* @return
27+
*/
28+
public boolean setMode(DayNight mode) {
29+
SharedPreferences.Editor editor = mSharedPreferences.edit();
30+
editor.putString(MODE, mode.getName());
31+
return editor.commit();
32+
}
33+
34+
/**
35+
* 夜间模式
36+
*
37+
* @return
38+
*/
39+
public boolean isNight() {
40+
String mode = mSharedPreferences.getString(MODE, DayNight.DAY.getName());
41+
if (DayNight.NIGHT.getName().equals(mode)) {
42+
return true;
43+
} else {
44+
return false;
45+
}
46+
}
47+
48+
/**
49+
* 日间模式
50+
*
51+
* @return
52+
*/
53+
public boolean isDay() {
54+
String mode = mSharedPreferences.getString(MODE, DayNight.DAY.getName());
55+
if (DayNight.DAY.getName().equals(mode)) {
56+
return true;
57+
} else {
58+
return false;
59+
}
60+
}
61+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.clock.study.type;
2+
3+
/**
4+
* Created by Clock on 2016/8/24.
5+
*/
6+
public enum DayNight {
7+
8+
DAY("DAY", 0),
9+
NIGHT("NIGHT", 1);
10+
11+
private String name;
12+
private int code;
13+
14+
private DayNight(String name, int code) {
15+
this.name = name;
16+
this.code = code;
17+
}
18+
19+
public int getCode() {
20+
return code;
21+
}
22+
23+
public void setCode(int code) {
24+
this.code = code;
25+
}
26+
27+
public String getName() {
28+
return name;
29+
}
30+
31+
public void setName(String name) {
32+
this.name = name;
33+
}
34+
}

0 commit comments

Comments
 (0)