Skip to content

Commit ec28433

Browse files
committed
添加搜索博主个人博客功能
博主界面动画过度优化
1 parent 6c371b3 commit ec28433

File tree

14 files changed

+190
-73
lines changed

14 files changed

+190
-73
lines changed

app/src/main/java/com/rae/cnblogs/AppRoute.java

+11
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,16 @@ public static void jumpToSearchKb(Context context) {
350350
startActivity(context, intent);
351351
}
352352

353+
/**
354+
* 搜索-博主
355+
*/
356+
public static void jumpToSearchBlogger(Context context, String blogApp, String nickName) {
357+
Intent intent = new Intent(context, SearchActivity.class);
358+
intent.putExtra("blogApp", blogApp);
359+
intent.putExtra("nickName", nickName);
360+
startActivity(context, intent);
361+
}
362+
353363
/**
354364
* 系统消息
355365
*/
@@ -443,4 +453,5 @@ public static void jumpToImageSelection(Activity context, ArrayList<String> sele
443453
public static void jumpToAboutMe(Context context) {
444454
startActivity(context, AboutMeActivity.class);
445455
}
456+
446457
}

app/src/main/java/com/rae/cnblogs/activity/BloggerActivity.java

+33-11
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.support.annotation.Nullable;
66
import android.support.design.widget.AppBarLayout;
77
import android.support.design.widget.DesignTabLayout;
8+
import android.support.v4.content.ContextCompat;
89
import android.support.v4.view.ViewPager;
910
import android.support.v7.widget.Toolbar;
1011
import android.text.TextUtils;
@@ -16,6 +17,7 @@
1617
import android.widget.TextView;
1718

1819
import com.bumptech.glide.load.DataSource;
20+
import com.bumptech.glide.load.MultiTransformation;
1921
import com.bumptech.glide.load.engine.GlideException;
2022
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
2123
import com.bumptech.glide.request.RequestListener;
@@ -26,6 +28,7 @@
2628
import com.rae.cnblogs.AppRoute;
2729
import com.rae.cnblogs.AppUI;
2830
import com.rae.cnblogs.GlideApp;
31+
import com.rae.cnblogs.GlideRequest;
2932
import com.rae.cnblogs.R;
3033
import com.rae.cnblogs.fragment.BlogListFragment;
3134
import com.rae.cnblogs.message.UserInfoEvent;
@@ -46,6 +49,7 @@
4649
import butterknife.ButterKnife;
4750
import butterknife.OnClick;
4851
import jp.wasabeef.glide.transformations.BlurTransformation;
52+
import jp.wasabeef.glide.transformations.ColorFilterTransformation;
4953

5054
/**
5155
* blogger info
@@ -254,18 +258,13 @@ private void showAvatar(String blogApp, final String url) {
254258
if (TextUtils.isEmpty(url) || url.endsWith("simple_avatar.gif")) return;
255259
// 封面图
256260
final String coverUrl = String.format("https://files.cnblogs.com/files/%s/app-cover.bmp", blogApp);
257-
GlideApp.with(this)
258-
.load(coverUrl)
261+
262+
createAvatarGlide(coverUrl)
259263
.listener(new RequestListener<Drawable>() {
260264
@Override
261265
public boolean onLoadFailed(@Nullable GlideException e, Object o, Target<Drawable> target, boolean b) {
262266
// 如果没有这张封面图就展示默认的
263-
GlideApp.with(getContext())
264-
.load(url)
265-
.centerCrop()
266-
.transition(DrawableTransitionOptions.withCrossFade())
267-
.apply(RequestOptions.bitmapTransform(new BlurTransformation(12))) // 高斯模糊
268-
.into(mBackgroundView);
267+
createAvatarGlide(url).into(mBackgroundView);
269268
return true;
270269
}
271270

@@ -278,12 +277,26 @@ public boolean onResourceReady(Drawable drawable, Object o, Target<Drawable> tar
278277
return false;
279278
}
280279
})
281-
.apply(RequestOptions.bitmapTransform(new BlurTransformation(12))) // 高斯模糊
282-
.centerCrop()
283-
.transition(DrawableTransitionOptions.withCrossFade())
284280
.into(mBackgroundView);
285281
}
286282

283+
/**
284+
* 创建头像显示的Glide
285+
*
286+
* @param url 头像地址
287+
*/
288+
private GlideRequest<Drawable> createAvatarGlide(String url) {
289+
int alphaColor = ContextCompat.getColor(getContext(), R.color.blogger_image_alpha_color);
290+
return GlideApp.with(this)
291+
.load(url)
292+
.centerCrop()
293+
.apply(RequestOptions.bitmapTransform(new MultiTransformation<>(
294+
new BlurTransformation(20), // 高斯模糊
295+
new ColorFilterTransformation(alphaColor)) // 遮罩层
296+
))
297+
.transition(DrawableTransitionOptions.withCrossFade());
298+
}
299+
287300
@Override
288301
public String getBlogApp() {
289302
return mBlogApp;
@@ -327,6 +340,15 @@ public void onNotLogin() {
327340
protected void onStatusBarColorChanged() {
328341
}
329342

343+
344+
/**
345+
* 搜索
346+
*/
347+
@OnClick(R.id.img_search)
348+
public void onSearchClick() {
349+
AppRoute.jumpToSearchBlogger(this, mBlogApp, mUserInfo.getDisplayName());
350+
}
351+
330352
/**
331353
* 粉丝
332354
*/

app/src/main/java/com/rae/cnblogs/activity/SearchActivity.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
2525
super.onCreate(savedInstanceState);
2626
mToolBar.setVisibility(View.GONE);
2727
((View) mToolBar.getParent()).setBackgroundColor(Color.TRANSPARENT);
28-
2928
findViewById(android.R.id.content).setFitsSystemWindows(true);
3029
AppMobclickAgent.onClickEvent(getContext(), "Search");
3130
}
@@ -36,7 +35,7 @@ public int getLayoutId() {
3635

3736
@Override
3837
protected Fragment newFragment() {
39-
return SearchFragment.newInstance();
38+
return SearchFragment.newInstance(getIntent().getStringExtra("blogApp"), getIntent().getStringExtra("nickName"));
4039
}
4140

4241
@Override

app/src/main/java/com/rae/cnblogs/fragment/BlogListFragment.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -232,14 +232,15 @@ public void onLoadMoreEmpty() {
232232
* 滚动到顶部
233233
*/
234234
public void scrollToTop() {
235-
RaeViewCompat.scrollToTop(mRecyclerView);
236-
if (mRecyclerView.isOnTop()) {
235+
if (mRecyclerView != null && mRecyclerView.isOnTop()) {
237236
mAppLayout.post(new Runnable() {
238237
@Override
239238
public void run() {
240239
mAppLayout.autoRefresh();
241240
}
242241
});
242+
} else {
243+
RaeViewCompat.scrollToTop(mRecyclerView);
243244
}
244245
}
245246

app/src/main/java/com/rae/cnblogs/fragment/SearchBlogFragment.java

+10-1
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,16 @@
1919
public class SearchBlogFragment extends BlogListFragment {
2020

2121
private String mSearchText;
22+
private String mBlogApp;
2223

2324
public static SearchBlogFragment newInstance(BlogType type) {
25+
return newInstance(type, null);
26+
}
27+
28+
public static SearchBlogFragment newInstance(BlogType type, String blogApp) {
2429
Bundle args = new Bundle();
2530
args.putString("type", type.getTypeName());
31+
args.putString("blogApp", blogApp);
2632
SearchBlogFragment fragment = new SearchBlogFragment();
2733
fragment.setArguments(args);
2834
return fragment;
@@ -36,7 +42,10 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
3642

3743
@Override
3844
protected IBlogListPresenter getBlogListPresenter() {
39-
return CnblogsPresenterFactory.getSearchPresenter(getContext(), mBlogType, this);
45+
if (getArguments() != null) {
46+
mBlogApp = getArguments().getString("blogApp");
47+
}
48+
return CnblogsPresenterFactory.getSearchPresenter(getContext(), mBlogType, mBlogApp, this);
4049
}
4150

4251
@Override

app/src/main/java/com/rae/cnblogs/fragment/SearchFragment.java

+30-11
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.support.v7.widget.LinearLayoutManager;
99
import android.support.v7.widget.RecyclerView;
1010
import android.text.Editable;
11+
import android.text.TextUtils;
1112
import android.text.TextWatcher;
1213
import android.view.KeyEvent;
1314
import android.view.View;
@@ -43,13 +44,21 @@ public class SearchFragment extends BaseFragment implements ISearchContract.View
4344
private SearchBloggerFragment mSearchBloggerFragment;
4445
private SearchBlogFragment mSearchNewsFragment;
4546
private SearchBlogFragment mSearchKbFragment;
46-
47-
public static SearchFragment newInstance() {
48-
return new SearchFragment();
47+
private String mBlogApp;
48+
private String mNickName;
49+
50+
public static SearchFragment newInstance(String blogApp, String nickName) {
51+
SearchFragment fragment = new SearchFragment();
52+
Bundle data = new Bundle();
53+
data.putString("blogApp", blogApp);
54+
data.putString("nickName", nickName);
55+
fragment.setArguments(data);
56+
return fragment;
4957
}
5058

5159
@BindView(R.id.et_search_text)
5260
EditText mSearchView;
61+
5362
@BindView(R.id.img_edit_delete)
5463
ImageView mDeleteView;
5564

@@ -79,6 +88,10 @@ protected int getLayoutId() {
7988
public void onCreate(@Nullable Bundle savedInstanceState) {
8089
super.onCreate(savedInstanceState);
8190
mPresenter = CnblogsPresenterFactory.getSearchPresenter(getContext(), this);
91+
if (getArguments() != null) {
92+
mBlogApp = getArguments().getString("blogApp");
93+
mNickName = getArguments().getString("nickName");
94+
}
8295
}
8396

8497

@@ -99,20 +112,26 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
99112

100113

101114
private void initView() {
115+
102116
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
103117
mSuggestionAdapter = new SearchSuggestionAdapter();
104118
mRecyclerView.setAdapter(mSuggestionAdapter);
105119

106120
RaeFragmentAdapter adapter = new RaeFragmentAdapter(getChildFragmentManager());
107-
mSearchBlogFragment = SearchBlogFragment.newInstance(BlogType.BLOG);
108-
mSearchBloggerFragment = SearchBloggerFragment.newInstance();
109-
mSearchNewsFragment = SearchBlogFragment.newInstance(BlogType.NEWS);
110-
mSearchKbFragment = SearchBlogFragment.newInstance(BlogType.KB);
111-
121+
mSearchBlogFragment = SearchBlogFragment.newInstance(BlogType.BLOG, mBlogApp);
112122
adapter.add("博客", mSearchBlogFragment);
113-
adapter.add("博主", mSearchBloggerFragment);
114-
adapter.add("新闻", mSearchNewsFragment);
115-
adapter.add("知识库", mSearchKbFragment);
123+
124+
if (!TextUtils.isEmpty(mBlogApp)) {
125+
mSearchView.setHint(String.format("搜索%s的博客", mNickName));
126+
mTabLayout.setVisibility(View.GONE);
127+
} else {
128+
mSearchBloggerFragment = SearchBloggerFragment.newInstance();
129+
mSearchNewsFragment = SearchBlogFragment.newInstance(BlogType.NEWS);
130+
mSearchKbFragment = SearchBlogFragment.newInstance(BlogType.KB);
131+
adapter.add("博主", mSearchBloggerFragment);
132+
adapter.add("新闻", mSearchNewsFragment);
133+
adapter.add("知识库", mSearchKbFragment);
134+
}
116135

117136
mViewPager.setAdapter(adapter);
118137
mViewPager.setOffscreenPageLimit(5);

app/src/main/java/com/rae/cnblogs/presenter/CnblogsPresenterFactory.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,8 @@ public static ISearchContract.Presenter getSearchPresenter(Context context, ISea
173173
/**
174174
* 搜索博客列表
175175
*/
176-
public static IBlogListPresenter getSearchPresenter(Context context, BlogType type, IBlogListPresenter.IBlogListView view) {
177-
return new SearchBlogPresenterImpl(context, view, type);
176+
public static IBlogListPresenter getSearchPresenter(Context context, BlogType type, String blogApp, IBlogListPresenter.IBlogListView view) {
177+
return new SearchBlogPresenterImpl(context, view, type, blogApp);
178178
}
179179

180180
/**

app/src/main/java/com/rae/cnblogs/presenter/impl/blog/SearchBlogPresenterImpl.java

+11-2
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
public class SearchBlogPresenterImpl extends BlogListPresenterImpl {
2020

2121
private final BlogType mType;
22+
private final String mBlogApp;
2223
ISearchApi mSearchApi;
2324

24-
public SearchBlogPresenterImpl(Context context, IBlogListView view, BlogType type) {
25+
public SearchBlogPresenterImpl(Context context, IBlogListView view, BlogType type, String blogApp) {
2526
super(context, view);
2627
mType = type;
28+
mBlogApp = blogApp;
2729
mSearchApi = getApiProvider().getSearchApi();
2830
}
2931

@@ -40,7 +42,14 @@ protected void onLoadData(CategoryBean category, int pageIndex) {
4042
} else if (mType == BlogType.KB) {
4143
observable = createObservable(mSearchApi.searchKbList(category.getName(), pageIndex));
4244
} else {
43-
observable = createObservable(mSearchApi.searchBlogList(category.getName(), pageIndex));
45+
String keyword = category.getName();
46+
// 搜索个人博客
47+
if (!TextUtils.isEmpty(mBlogApp)) {
48+
keyword = "blog:" + mBlogApp + " " + keyword;
49+
observable = createObservable(mSearchApi.searchBlogAppList(keyword, pageIndex));
50+
} else {
51+
observable = createObservable(mSearchApi.searchBlogList(keyword, pageIndex));
52+
}
4453
}
4554

4655
observable.subscribe(getBlogObserver());

app/src/main/java/com/rae/cnblogs/widget/CountDownTextView.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void start() {
6060
@Override
6161
public void onAnimationUpdate(ValueAnimator animation) {
6262
int value = (int) animation.getAnimatedValue();
63-
mSweepAngle = 360 - value;
63+
mSweepAngle = value;
6464
invalidate();
6565
}
6666
});
@@ -83,7 +83,7 @@ protected void onDraw(Canvas canvas) {
8383

8484
// 画倒计时线内圆
8585
canvas.drawArc(mRect, //弧线所使用的矩形区域大小
86-
270, //开始角度
86+
-90, //开始角度
8787
mSweepAngle, //扫过的角度
8888
false, //是否使用中心
8989
mBackgroundPaint);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<selector xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item>
4+
<shape>
5+
<corners android:radius="56dp"/>
6+
<solid android:color="@color/dividerPrimary_night"/>
7+
</shape>
8+
</item>
9+
</selector>

0 commit comments

Comments
 (0)