各位看官老爺子你們好,我就是那個挖坑不埋,還喜歡開新礦的小喵同志。
問大家一個問題,在Github上找專案的時候,看到中文簡介說明你們是不是覺得這個專案很low不屑一顧?
最近朋友無意中說,在Github上看到中文的專案點都不想點進去,太low了。想想好像很多大神的專案都是純英語的,so,作為只有四級程度的小同志,我就是那個專案裡瀰漫著中文的傢伙(ノQ益Q)ノ彡┻━┻,你們怎麼看?我挺喜歡中文的。
例牌Github:github.com/CarGuo :歡迎各種姿勢的star,fuck,watch。
這期要聊的是那麼躺在坑裡的需求,想想這一路走來,本人還能正常的行走於人世,真是好感動呢,感謝產品和QA的不殺之恩。
1、TextView的由於Span導致省略號顯示不正常問題。
2、TextView容易被背景同化看不清?增加陰影吧。
3、啟動白屏一會或者點選logo卡頓很久沒反應的暴力解決。
4、開啟自定義相簿,選擇圖片容易OOM,頁面崩潰回到程式crash。
5、ViewPager巢狀RecyclerView還有輪播圖的手勢衝突,參考:linkagescroll。
6、透明主題會導致手機背景在切換Tab的時候穿透到桌面,一般MainActivity不要用這個。
7、ViewPager的實時資料重新整理。
8、CardView 慎用,因為在某些低版本的機器上會有白帶,需要的話可以用shape實現圓角。
9、圖片壓縮安利。
10、RecyclerView的回到頂部的優化。
1、之前分享過一篇文章《文字編輯和顯示(emoji表情,@某人、連結高亮點選)》,這裡用到的Spanable替代String用於TextView的顯示,一般情況下是沒什麼問題的,但是如果你需要在列表中或者詳情中做省略號處理,你就有可能發現,省略號居然出現在表情的前面,把一大段文字給省略了;又或者直接最後面顯示了一部分的表情。原因Google可閱,這裡就說說我農村式的做法吧:
是的,自己截斷,根據你需要的行數,對應的在顯示的時候把資料截斷,然後自己加上···(這裡如有更好的記得評論分享啊!)
textView.setText(spannable);
textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
textView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
if (textView.getLineCount() > lineCount) {
int endOfLastLine = textView.getLayout().getLineEnd(lineCount - 1);
if (endOfLastLine > 4) {
CharSequence newVal = textView.getText().subSequence(0, endOfLastLine - 4);
textView.setText(newVal);
textView.append("...");
}
}
}
});複製程式碼
2、TextView經常會因為背景圖片的原因而導致出現看不清文字的情況,這裡無數次考慮之後,決定某些特殊地方可以用輕微的陰影解決。
android:shadowColor="#AA000000"
android:shadowDy="1"
android:shadowRadius="1"複製程式碼
3、啟動頁問題,其實最好是做冷啟動優化,但是作為一個時間緊(tou)張(lan)的程式猿,我是在WelcomeActivity的主題裡設定了主題,暴力解決,雖然這不是長久之計:
複製程式碼
4、開啟自定義相簿OOM主要要解決的還是記憶體釋放的問題,有時候記憶體一下子來的太猛還是不行的,而且邏輯有問題的崩潰導致APP直接回到解放前的確得不償失,所以呢:
直接把選擇Activityyoga新的process程式開啟,這樣閃退了也不影響APP啊,資料該怎麼返回還是怎麼返回。什麼?首次啟動的時候回卡白屏幾秒,下面的主題暴力幫助你。什麼?開啟卡頓一會才能看到頁面。我試了微信也會,所以如果有優化的控制元件記得評論分享下,這樣我可以愉悅的去找產品說(zhuang)教(B)。
···
複製程式碼
5、更新ViewPager,這裡簡單上程式碼,感受下,我就靜靜的不說話.....((/- -)/:
resolveViewLogic();//比如更新list資料
fragmentPagerAdapter.setUpdateFlag(true);//讓其更新
fragmentPagerAdapter.notifyDataSetChanged();
fragmentPagerAdapter.setUpdateFlag(false);//關了
···
public class RefreshFragmentPagerAdapter extends FragmentPagerAdapter {
private List fragments;
private FragmentManager fragmentManager;
private boolean updateFlag;
public boolean isUpdateFlag() {
return updateFlag;
}
public void setUpdateFlag(boolean updateFlag) {
this.updateFlag = updateFlag;
}
public void setFragments( List fragments) {
this.fragments = fragments;
}
public RefreshFragmentPagerAdapter(FragmentManager fragmentManager, List fragments) {
super(fragmentManager);
this.fragments = fragments;
this.fragmentManager = fragmentManager;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return "";
}
//讓其更新
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
//核心方法
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (updateFlag) {//根據需求新增更新標示
//得到快取的fragment
Fragment fragment = (Fragment) super.instantiateItem(container, position);
//得到tag,這點很重要
String fragmentTag = fragment.getTag(); //這裡的tag是系統自己生產的,我們直接取就可以
//如果這個fragment需要更新
FragmentTransaction ft = fragmentManager.beginTransaction();
//移除舊的fragment
ft.remove(fragment);
//換成新的fragment
fragment = fragments.get(position);
//新增新fragment時必須用前面獲得的tag,這點很重要
if (!fragment.isAdded()) {
ft.add(container.getId(), fragment, fragmentTag);
ft.attach(fragment);
ft.commit();
}
return fragment;
} else {
return super.instantiateItem(container, position);
}
}
} 複製程式碼
9、圖片壓縮安利:Luban,壓縮效果真的不錯,和微信一拼,就是那種長的離譜的圖片壓縮後效果不佳,其他都很不錯,反正我是直接把裡面的thirdCompress拿出來套到自己裡面。
private File thirdCompress(@NonNull File file)複製程式碼
10、RecyclerView的回到頂部的優化。
也許你會問,不就是一鍵回去麼,為什麼還要優化?
因為愛情,不會輕易悲傷,產品經理都是年輕的模樣,看看回到頂部的效果,所以就有了這個優化:
記得先停止滾動,然後回到第十個,然後在智慧的滾到頂部,不信你試試,感覺舒服好多喲。
protected void goToTop() {
mRecyclerView.stopScroll();
mLayoutManager.setSmoothScrollbarEnabled(true);
if (firstVisibilityPosition > 10) {
mLayoutManager.scrollToPositionWithOffset(10, 0);
}
mRecyclerView.smoothScrollToPosition(0);
firstVisibilityPosition = 0;
}複製程式碼