coding源码分析:实现篇

来源:互联网 发布:wps办公软件mac版免费 编辑:程序博客网 时间:2024/05/11 09:03

·入口相关

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

0 0
原创粉丝点击