開源app之MyHearts

前言

這個月,說實話,有忙有閑,經歷了一次病痛的洗禮,才認識到了只有好好的生活,認真的對待自己的身體,才能更好的去工作,沒有了身體的支撐,什么工作都只能是紙老虎,不攻自破。在這里也祝愿大家,在生活中好好對待自己,身體第一,工作第二。

為什么要寫這個app

群里的一個哥們前幾天晚上給我看了一下一個app,我粗略看了下界面(還沒運行下載,他給我發的),我看了一下,感覺挺不錯的,當時心里一熱,哈哈,這不是挺簡單的么,幾天就搞完了,但是當我去下載的時候,看到了30-40MB的大小,我驚呆了,要知道一個淘寶才那么大。哈哈,不過還是被這個界面吸引了,而且里面的內容也挺不錯的,大多關于心理方面的。那就自己模仿一下吧,順帶的自己去學習一下,因為這個app涉及到的知識點挺多(即時通訊、直播、視屏播放、第三方登錄),想著自己就慢慢的寫,然后去學習一下會用到的知識,伴隨著這樣的想法,就有了這個MyHearts項目。

幾個小知識點

一、進入到主界面,可以看到下方的幾個Tab鍵,原本想著是用FragmentTabhost實現,但是看到中間的那個Tab鍵和其他的按鍵是不同等高度的,而且這個還是有動畫效果的,后面想著,如果用framelayout覆蓋在上面應該是可以實現的,但是動畫呢,這個時候想到之前用到的幀動畫,想必這個幀動畫也是可以實現的,然后自己就去試了試,結果還真給實現了,對于程序這東西來說,當別人問這個能不能實現,我在這個地方加一個字段、加個方法,可以實現么,我想說的就是,既然已經想到了,那就試一下唄,行了就證明方法可以,不行證明需要找其他的方法,最重要的是動手寫程序,程序不是問出來的,而是一句一句代碼積累出來的。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false"><itemandroid:drawable="@mipmap/main_layout_center_image_1"android:duration="100"/><itemandroid:drawable="@mipmap/main_layout_center_image_2"android:duration="100"/><itemandroid:drawable="@mipmap/main_layout_center_image_3"android:duration="100"/><itemandroid:drawable="@mipmap/main_layout_center_image_4"android:duration="100"/><itemandroid:drawable="@mipmap/main_layout_center_image_5"android:duration="100"/><itemandroid:drawable="@mipmap/main_layout_center_image_6"android:duration="100"/><itemandroid:drawable="@mipmap/main_layout_center_image_7"android:duration="100"/><itemandroid:drawable="@mipmap/main_layout_center_image_8"android:duration="100"/><itemandroid:drawable="@mipmap/main_layout_center_image_9"android:duration="100"/>//這里并沒有寫完,可以直接去代碼里面查看,最后會附上git地址</animation-list>

在代碼中這樣就可以執行動畫了

// 獲取ImageView上的動畫背景AnimationDrawable spinnerImg = (AnimationDrawable) mIvImg.getBackground();// 開始動畫spinnerImg.start();

這樣就可以實現直播和life動畫的切換了。

二、心事界面的圖片展示,之前在用postman(用于接口調試的,值得推薦)請求數據接口的時候,看到里面有個photos字段,并不是所有的item都有這個字段,而且里面個數不一,但都是一個圖片地址,想著應該是類似于qq空間發表說說的附帶的圖片。自己想著用RecyclerView實現,因為這個是很好實現的,但是我在看到okgo(本項目的網絡請求框架,支持Rx,挺不錯的)項目中,他的項目也有這個類似的功能,用到的就是NineGridView(https://github.com/jeasonlzy/NineGridView),okgo這個項目也是這位大神寫的。這個也是很簡單使用的,他是在ViewGroup的基礎上自定義的。用法也是很簡單,如下

 //也就是用戶發朋友圈的那種,添加圖片List<String> images = bean.getPhotos();if (images != null) {for (String image : images) {//ImageInfo 是他的實體類,用于image的地址ImageInfo info = new ImageInfo();info.setThumbnailUrl(image);info.setBigImageUrl(image);imageInfo.add(info);}}holder.mPhotoRecycler.setAdapter(new NineGridViewClickAdapter(mContext, imageInfo));if (images != null && images.size() == 1) {//如果用戶只發了一張圖片的話,就設置圖片的寬和高holder.mPhotoRecycler.setSingleImageSize(300);holder.mPhotoRecycler.setSingleImageRatio(1);//holder.mPhotoRecycler.setSingleImageRatio(images.get(0).width * 1.0f / images.get(0).height);}

實現的結果如下:

三、二級評論列表,這個我一直想不到好的解決辦法(在我腦海里一直以為有更好的方法),這里我就是用的item里面嵌套一個RecyclerView,得到的comment list,然后在進行item分配。如果有好的,請告知。謝謝啦。
這里就看下代碼,也沒什么可寫的,無非就是RecyclerView嵌套RecyclerView

  List<CommentsBean> comments = bean.getComments();if (comments != null && comments.size() > 0) {CommentAdapter adapter = new CommentAdapter(comments);holder.mCommentRe.setVisibility(View.VISIBLE);holder.mCommentRecycler.setLayoutManager(new LinearLayoutManager(mContext));//  holder.mCommentRecycler.addItemDecoration(new DividerItemDecoration(mContext//,DividerItemDecoration.VERTICAL_LIST));holder.mCommentRecycler.setItemAnimator(new DefaultItemAnimator());holder.mCommentRecycler.setAdapter(adapter);}

對于評論里面的回復和被回復者,為了便于區分,我這里使用到了SpanableString。類似于下面:

CommentsBean bean = mCommentsBeen.get(position);//評論用戶String profileName = bean.getName();//被回復者  如果為空  默認回復發帖者String replayName = bean.getReplyToUserName();StringBuffer sb = new StringBuffer();sb.append(profileName);sb.append(" ");String replay = mContext.getResources().getString(R.string.replay_comment);if (!replayName.equals("")) {  //判斷是否有被回復的,沒有就是默認發帖者sb.append(replay);sb.append(replayName);}String commentContent = bean.getContent();sb.append(commentContent);// String result = ;SpannableString msp = new SpannableString(sb.toString());//對評論者進行顏色配置msp.setSpan(new ForegroundColorSpan(Color.BLUE), 0,profileName.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//如果有被回復的對象,那么被回復的對象也要進行顏色配置if (!replayName.equals("")) {int start = profileName.length() + 3;int end = start + replayName.length();msp.setSpan(new ForegroundColorSpan(Color.BLUE), start, end,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);}//這個地方要直接設置成msp  不能用msp.toString() 要不然沒有樣式holder.mTvCommentContent.setText(msp);

效果圖,大家可以git代碼去運行一下。
四、之前用到左滑出菜單欄,第一個是Draglayout,但是這個存在沖突,滑動不是很流暢,自己后面換到了git上的一個仿QQ5.2的,但是和自己app里面的輪播(從左向右滑動的時候,會帶出左側邊欄,還有就是心事界面的Tablayout也是存在同樣的方式,后面自己想到了應該是用到的ViewPager滑動事件的問題,就想著之前用到的,就重寫了ViewPager,然后處理了一些邏輯,基本解決了沖突),代碼如下:

/*** 事件分發,請求父控件是否攔截* <p/>* 1、右滑,而且是第一個頁面,需要父控件攔截* <p/>* 2、左滑,而且當前的頁面是最后一個頁面,需要父控件攔截* <p/>* 3、上下滑動,需要父控件攔截** @param ev* @return*/@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {/*** 用getParent()去請求,請求父控件是否不要攔截滑動事件*/switch (ev.getAction()) {case MotionEvent.ACTION_DOWN://先去讓父控件不要攔截,這樣才可能走到ACTION_MOVE方法調用getParent().requestDisallowInterceptTouchEvent(true);/*** 拿到剛開始按下的時候的坐標*/startX = (int) ev.getRawX();startY = (int) ev.getRawY();break;case MotionEvent.ACTION_MOVE:/*** 獲取到移動之后的坐標*/int endX = (int) ev.getRawX();int endY = (int) ev.getRawY();//左右滑動if (Math.abs(endX - startX) > Math.abs(endY - startY)) {if (endX > startX) {//右滑//獲取到第一個 需要父控件攔截if (getCurrentItem() == 0) {getParent().requestDisallowInterceptTouchEvent(false);}} else if (endX <= startX) {//左滑//獲取到最后一個// 需要父控件攔截if (getCurrentItem() == getAdapter().getCount() - 1) {getParent().requestDisallowInterceptTouchEvent(false);}}} else {//上下滑動getParent().requestDisallowInterceptTouchEvent(false);}break;default:break;}return super.dispatchTouchEvent(ev);}

哈哈,最后還是換成了DrawerLayout,不存在了滑動的沖突BUG了,Drawerlayout默認劃出是覆蓋在主界面上的,這里為了模仿的比較像,就重寫了一些邏輯(hongyang大神的博客中有介紹)

 mDrawerLayout.setDrawerListener(new DrawerLayout.DrawerListener() {@Overridepublic void onDrawerSlide(View drawerView, float slideOffset) {View mContent = mDrawerLayout.getChildAt(0);View mMenu = drawerView;float scale = 1 - slideOffset;float rightScale = 0.8f + scale * 0.2f;if (drawerView.getTag().equals("LEFT")){float leftScale = 1 - 0.3f * scale;ViewHelper.setScaleX(mMenu, leftScale);ViewHelper.setScaleY(mMenu, leftScale);ViewHelper.setAlpha(mMenu, 0.6f + 0.4f * (1 - scale));ViewHelper.setTranslationX(mContent,mMenu.getMeasuredWidth() * (1 - scale));ViewHelper.setPivotX(mContent, 0);ViewHelper.setPivotY(mContent,mContent.getMeasuredHeight() / 2);mContent.invalidate();ViewHelper.setScaleX(mContent, rightScale);ViewHelper.setScaleY(mContent, rightScale);} else{ViewHelper.setTranslationX(mContent,-mMenu.getMeasuredWidth() * slideOffset);ViewHelper.setPivotX(mContent, mContent.getMeasuredWidth());ViewHelper.setPivotY(mContent,mContent.getMeasuredHeight() / 2);mContent.invalidate();ViewHelper.setScaleX(mContent, rightScale);ViewHelper.setScaleY(mContent, rightScale);}}@Overridepublic void onDrawerOpened(View drawerView) {}@Overridepublic void onDrawerClosed(View drawerView) {mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gravity.RIGHT);}@Overridepublic void onDrawerStateChanged(int newState) {}});

到這里,基本上就沒什么知識點了(因為自己也寫的不是很好,加上自己的水平有限),后面增加新功能了在做補充。
最后上傳幾張效果圖:



代碼傳送門(如果感覺還不錯,歡迎star下)

轉載于:https://www.cnblogs.com/android-blogs/p/6006598.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457061.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于在軟件中添加掃描二維碼功能的詳細步驟及對應的資源。

最近有在一款軟件中添加二維碼掃描功能&#xff0c;在網上整理了一堆資源后&#xff0c;把一些干貨拿出來給大家分享&#xff0c;希望大家以后能更容易的使用這個功能。 詳細步驟見這個視頻連接&#xff1a;http://www.jikexueyuan.com/course/134.html 對應的zxing資源放在下…

前端那些事之原生 js實現貪吃蛇篇

2019獨角獸企業重金招聘Python工程師標準>>> 原生js實現貪吃蛇 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>貪吃蛇游戲</title><style>body, div, img {margin: 0 auto;pa…

整理一些完全免費開放的API接口

前言 在開發測試階段&#xff0c;或者是在寫Demo的時候&#xff0c;難免會用到一些測試數據&#xff0c;有時苦于沒有可用的接口&#xff0c;需要自己動手去寫&#xff0c;但是這樣大大降低了效率&#xff0c;前期我也找了一些開放的接口&#xff0c;這篇文章整理一下&#xff…

Linux格式化異常,Linux下DateFormat的parse方法出現”ParseException”異常

在windows下使用DateFormat的parse方法&#xff0c;將字符中轉化為Date類型時&#xff0c;一切正常。可安裝到Linux下&#xff0c;就出現了ParseException異常。代碼如下&#xff1a;public Date toDateTime(String str){Date dt new Date();try{DateFormat df;df DateFormat…

如何發現優秀的開源項目?

之前發過一系列有關 GitHub 的文章&#xff0c;有同學問了&#xff0c;GitHub 我大概了解了&#xff0c;Git 也差不多會使用了&#xff0c;但是 還是搞不清 GitHub 如何幫助我的工作&#xff0c;怎么提升我的工作效率&#xff1f; 問到點子上了&#xff0c;GitHub 其中一個最重…

自已開發完美的觸摸屏網頁版仿app彈窗型滾動列表選擇器/日期選擇器

手機端網頁版app在使用下拉列表時&#xff0c;傳統的下拉列表使用起來體驗非常不好&#xff0c;一般做的稍好一點的交互功能界面都不會直接使用下拉列表&#xff0c;所以app的原生下拉列表都是彈窗列表選擇&#xff0c;網頁型app從使用體驗上來當然也應該做成那樣&#xff0c;前…

*args, **kwargs的用法

python 中參數*args, **kwargs def foo(*args, **kwargs): print args , args print kwargs , kwargs print ---------------------------------------if __name__ __main__: foo(1,2,3,4) foo(a1,b2,c3) foo(1,2,3,4, a1,b2,c3) foo(a, 1, None, a1, b2, c3)輸出結果如下&…

一個 js 中值傳遞和引用傳遞的坑。

今天在調試代碼時遇到一個問題&#xff0c;剛開始想不明白&#xff0c;然后分析了一下后&#xff0c;才知道其中的問題&#xff0c;這也是一個基礎的問題&#xff0c;&#xff08;所以基礎是很重要的&#xff09; 代碼如下&#xff1a; var a 3; a a * 2; console.log(a); //…

linux運維適合女生么,女生真的不適合做IT行業嗎?Linux運維適合女生學習嗎?

在很多人的腦海中都是女生不適合做IT&#xff0c;IT行業不適合女性。可能傳統的思想中&#xff0c;女生只適合做文職工作&#xff0c;比如說幼師、公務員、會計等&#xff0c;就因為這樣的思想也讓IT行業男女出現了失衡的情況&#xff0c;那么作為女生真的不適合做IT行業嗎?Li…

關于在用異步消息處理機制使用Message.Obtain()方法(而非New Message)獲得一個Message對象的好處

類概述 定義一個包含任意類型的描述數據對象&#xff0c;此對象可以發送給Handler。對象包含兩個額外的int字段和一個額外的對象字段&#xff0c;這樣可以使得在很多情況下不用做分配工作。 盡管Message的構造器是公開的&#xff0c;但是獲取Message對象的最好方法是調用Messag…

python編程中的if __name__ == 'main': 的作用和原理

大多數編排得好一點的腳本或者程序里面都有這段if __name__ main: &#xff0c;雖然一直知道他的作用&#xff0c;但是一直比較模糊&#xff0c;收集資料詳細理解之后與打架分享。 1、這段代碼的功能 一個python的文件有兩種使用的方法&#xff0c;第一是直接作為腳本執行&…

vim 配置

vim包下載 https://github.com/spf13/spf13-vim 安裝教程 http://blog.csdn.net/u011729865/article/details/49210841 https://www.zhihu.com/question/20151659轉載于:https://www.cnblogs.com/aituming/p/6013279.html

自己簡單封裝的自己項目需要的http請求

2019獨角獸企業重金招聘Python工程師標準>>> package www.tydic.com.util;import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Http…

excel導入linux亂碼怎么解決方法,,請大家都來看下,Excel導入有亂碼?原因出在哪里?應該怎么解決?...

老師&#xff0c;感謝你再次的回答。我按照您的方法操作&#xff0c;轉換utf-8另外為CSV格式&#xff0c;然后這個CSV格式在Notepad 編輯器中打開后&#xff0c;沒有亂碼&#xff0c;μ 符號(希臘字符)正確顯示。我想導入文件已經準備完畢&#xff0c;當我導入的時候&#xff0…

Oracle 正則表達式

一. 正則表達式簡介: 正則表達式&#xff0c;就是以某種模式來匹配一類字符串。一旦概括了某類字符串&#xff0c;那么正則表達式即可用于針對字符串的各種相關操作。例如&#xff0c;判斷匹配性&#xff0c;進行字符串的重新組合等。正則表達式提供了字符串處理的快捷方式。…

python編程中的if __name__ == 'main': 的作用和原理[2]

這個問題來自于知乎用戶的提問&#xff0c;當時看到這個問題&#xff0c;我只是做了下簡單的回答。后來我發現&#xff0c;對于很多人來說&#xff0c;更準確的說應該是大部分的 Python 初學者&#xff0c;對這個問題理解的不是很深刻。所以這里我來做下總結&#xff0c;并試圖…

Java基礎中按值傳遞和引用傳遞詳解

下面是我在網上看到的一個帖子&#xff0c;解釋的感覺挺全面&#xff0c;就轉過來&#xff0c;以供以后學習參考&#xff1a; 1&#xff1a;按值傳遞是什么 指的是在方法調用時&#xff0c;傳遞的參數是按值的拷貝傳遞。示例如下&#xff1a; [java] view plaincopy public cla…

【Foreign】采蘑菇 [點分治]

采蘑菇 Time Limit: 20 Sec Memory Limit: 256 MBDescription Input Output Sample Input 51 2 3 2 31 21 32 42 5Sample Output 10912911HINT Main idea 詢問從以每個點為起始點時&#xff0c;各條路徑上的顏色種類的和。 Solution 我們看到題目&#xff0c;立馬想到了O(n^2)…

c語言迷宮游戲怎么存放坐標,求解迷宮問題(c語言,很詳細哦

《求解迷宮問題(c語言,很詳細哦》由會員分享&#xff0c;可在線閱讀&#xff0c;更多相關《求解迷宮問題(c語言,很詳細哦(5頁珍藏版)》請在人人文庫網上搜索。1、求迷宮問題就是求出從入口到出口的路徑。在求解時 , 通常用的是 “窮舉求解”的方法 ,即從入口出發 ,順某一方向向…

模塊概述

概述 目前代碼比較少&#xff0c;寫在一個文件中還體現不出什么缺點&#xff0c;但是隨著代碼量越來越多&#xff0c; 代碼就越來越難以維護 為了解決難以維護的問題&#xff0c;我們把很多相似功能的函數分組&#xff0c;分別放到不同的文件中取。這樣每個文件所包含的內容相…