coding源码分析:实现篇

·入口相关

splash广告页更换实现

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

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

侧拉


<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"
    >


    
    <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"
            />
        

        <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

        "@+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

布局:


"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">

    "@layout/activity_search_project_actionbar" />

    .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" />

    .support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="gone" />

    "@+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" />


输入框、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

你可能感兴趣的:(开源项目源码分析/架构分析)