coding源码分析:实现篇

    xiaoxiao2022-06-24  51

    #·入口相关

    ##splash广告页更换实现

    第一次进来用先取以前下载的广告页面本次使用,进入首页之后下载会下载,供下次使用。

    这里的实现还是挺好的,把相关代码提取封装到了LoginBackground类中,对外提供了下载和获取缓存图片的方法接口。开始我在想是否可以设计成单例,但是想一想后发现其实这里并不需要单例,《重构与模式》中说过,在实现一个单例之前,需要仔细思考。如果遇到一个本不应该被实现为单例的单例,不要犹豫,内联他。这里既是如此。

    ##侧拉

    <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity" > <!-- Your normal content view --> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/colorPrimary" android:minHeight="?attr/actionBarSize" /> <!--app:theme="@style/NoIconActionbar"--> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout> <fragment android:id="@+id/navigation_drawer" android:name="net.coding.program.NavigationDrawerFragment_" android:layout_width="280dp" android:layout_height="match_parent" android:layout_gravity="start" android:fitsSystemWindows="true" tools:layout="@layout/fragment_navigation_drawer" /> </android.support.v4.widget.DrawerLayout>

    看这个布局,就可明白,侧拉采用的是v4包下的DrawerLayout,左侧菜单栏是一个fragment:NavigationDrawerFragment,右侧内容区域是Toolbar+ container(framelayout)。

    在点击的时候,onNavigationDrawerItemSelected,会将对应的container动态替换对应的fragment。UsersListFragment、TaskFragment、ProjectFragment、SettingFragment。

    ##连续点击两次退出

    @Override public void onBackPressed() { exitApp(); } private void exitApp() { if ((System.currentTimeMillis() - exitTime) > 2000) { showButtomToast("再按一次退出Coding"); exitTime = System.currentTimeMillis(); } else { finish(); } }

    #·我的项目模块ProjectFragment

    ##过滤及项目模块的交替显示

    采用的是个NoHorizontalScrollViewPager,通过显示不同的子view来实现切换且流畅的效果。NoHorizontalScrollViewPager里放的是fragment集合,MenuProjectFragment、ProjectOtherFragment、ProjectListFragment。

    ##创建项目ProjectCreateActivity

    我看到这个view的时候,以为作者使用的是自定义view,其实作者使用的是checkbox

    <CheckBox android:id="@+id/generateReadme" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="@drawable/push_checkbox" android:button="@null" /> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_checked="true" android:drawable="@drawable/push_checkbox_on" /> <item android:drawable="@drawable/push_checkbox_off" /> </selector>

    ##搜索模块SearchProjectActivity

    布局:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/color_EEEEEE" android:orientation="vertical" tools:context="net.coding.program.project.SearchProjectActivity"> <include layout="@layout/activity_search_project_actionbar" /> <net.coding.program.common.PagerSlidingTabStrip android:id="@+id/tabs" android:layout_width="match_parent" android:layout_height="48dip" android:background="@android:color/transparent" android:visibility="gone" /> <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" /> <ListView android:id="@+id/emptyListView" android:layout_width="match_parent" android:layout_height="match_parent" android:cacheColorHint="@color/transparent" android:clipToPadding="false" android:divider="@color/color_DDDDDD" android:dividerHeight="0.5dp" android:drawSelectorOnTop="true" android:listSelector="@color/transparent" android:overScrollMode="never" android:footerDividersEnabled="false" android:scrollbarStyle="outsideOverlay" android:scrollbars="none" android:visibility="gone" /> </LinearLayout>

    输入框、PagerSlidingTabStrip、ViewPager、ListView

    ListView用于存放搜索历史

    ViewPager中存放不同的fragment

    搜索的缓存实现:SearchCache类,单例实现,底层保存采用的是SharedPreferences。

    ##扫一扫:二维码扫码页面QRScanActivity

    #·项目首页模块PublicProjectHomeFragment

    ExpandableStickyListHeadersListView+SwipeRefreshLayout

    ##讨论—讨论的筛选框TopicListFragment

    DropdownButton\DropdownListView组成

    ##讨论-发送时的全屏dialog

    v7包下的alertdialog

    ##代码-markdown的支持

    是webview

    ##代码-代码展示解析,且支持放大和缩小

    是webview

    #·新建任务模块TaskAddActivity

    ##任务-新建:多种颜色的标签

    FlowLabelLayout,扩充自FlowLayout

    #·冒泡模块

    ##切换

    MaopaoListFragment,传递不同的参数,显示不同的页面

    ##点击超链接的webview页面做的支持

    WebActivity

    ##冒泡UI:支持多种颜色和超链接,支持表情,点赞效果,评论是做为?MaopaoDetailActivity

    内容不是使用的是webview,URLSpanNoUnderline用来解析 url 以跳转到不同的界面

    点赞动画 MaopaoLikeAnimation.playAnimation(good, v);

    ##分享弹窗

    CustomShareBoard,继承自PopupWindow

    ##listview自动加载的动画效果:移动上去

    JazzyListView

    #·消息页面

    ##聊天页面

    MessageListActivity

    在当前页面做了一个轮询,实现类似即时通讯的效果

    输入框部分采用自定义view做了封装

    ##相册页面

    PhotoPickActivity、看大图ImagePagerFragment

    ##联系人页面

    UsersListActivity 采用第三方IndexableListView

    #·个人中心

    UserDetailActivity

    #·设置模块

    ##清除缓存,这个缓存包含了哪些部分

    File[] cacheDir = getAllCacheDir(); for (File item : cacheDir) { deleteFiles(item); } showMiddleToast("清除缓存成功"); updateCacheSize(); File[] getAllCacheDir() { return new File[] { getActivity().getCacheDir(), getActivity().getExternalCacheDir() }; }

    计算:

    void updateCacheSize() { File[] cacheDir = getAllCacheDir(); long size = 0; for (File dir : cacheDir) { size += getFileSize(dir); } String sizeString = String.format("%.2f MB", (double) size / 1024 /1024); dispayCacheSize(sizeString); }

    删除缓存的时候只考虑了系统默认的缓存位置。

    #可参考资料

    Coding Android客户端用到的一些开源库 https://blog.coding.net/blog/android-open-source-library

    https://coding.net/u/coding/p/Coding-Android/git

    转载请注明原文地址: https://ju.6miu.com/read-1124011.html

    最新回复(0)