基于Android平台的开源项目PlanBetter设计篇之一 核心功能

之前介绍过自己大学时期做过的一些项目,里面有一个基于Android平台的项目叫PlanBetter,项目的详细介绍请参见《项目回顾之一:PlanBetter时间管理软件(基于Android平台)》,里面附有本项目的一些截图。如果您对本项目的设计实现感兴趣,欢迎您继续看下去!

      这个项目是一年前做的,时间隔得比较久,而且之前也没做过什么总结,所以对于项目的具体设计实现可能记得不是很清楚,但是我会尝试着将它完整地呈现给大家。

      这个项目的核心功能是计划这一块,通过三个连续的视图将昨天任务完成情况、今天任务完成情况以及未来任务提醒表现出来。用户可以通过滑动屏幕在这三个连续的视图之间进行切换,透过事先的规划作为一种提醒和指引,督促用户在规定的时间内把事情做好。可以给大家简单看一下计划这一块的截图:

                                                 

                                                                       均为昨天视图,左图为没有活动的显示效果,右图为有活动的显示效果

                                                 

                                                                       均为今天视图,左图为没有活动的显示效果,右图为有活动的显示效果

                                                                              

                                                                                   上图为未来视图,这里只截了有活动的效果图

      截图演示到此为止。由于这里是设计篇,所以我着重介绍这里的设计思路。

      对于一个活动,比较重要的三点就是时间、地点和活动内容。当然地点可以不用确定,有的时候只用了解时间和活动内容即可。

关于昨天

     对于昨天,我们往往关心的是昨天都做了哪些事情,有哪些事情没有完成,哪些事情是比较重要的。当然你可以看完之后将其删除,保护您的隐私。

      所以你们看到的昨天视图,即是将这些信息提供给用户。之前的设计图是在纸上画的,就不提供给大家了。画图说明如下图所示:

                         

昨天视图的布局代码如下所示,其中yesterday_task_layout.xml为整个布局的文件,yesterday_task_item.xml为单个活动的布局,因为活动列表是用ListView来实现的。

yesterday_task_layout.xml
 <?xml version="1.0" encoding="utf-8"?>
 2 <ScrollView android:layout_width="fill_parent"
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/task_yesterday_bg"
 5     android:fillViewport="true">
 6     <LinearLayout android:orientation="vertical"
 7         android:layout_width="@dimen/day_container_width" android:paddingLeft="15.0dp" android:paddingTop="7.0dp"
 8         android:paddingRight="15.0dp" android:paddingBottom="15.0dp"
 9         android:layout_height="fill_parent">
10         <RelativeLayout android:layout_width="fill_parent"
11             android:layout_height="wrap_content">
12             <TextView android:textSize="30.0sp" android:typeface="serif"
13                 android:textColor="@android:color/black" android:id="@+id/textView_yesterday"
14                 android:focusable="true" android:focusableInTouchMode="true"
15                 android:layout_width="wrap_content" android:layout_height="wrap_content"
16                 android:text="@string/label_yesterday" android:layout_alignParentLeft="true" />
17             <TextView android:textSize="18.0sp" android:typeface="serif"
18                 android:textColor="@android:color/black" android:id="@+id/textView_yesterday_date"
19                 android:layout_width="wrap_content" android:layout_height="wrap_content"
20                 android:layout_below="@id/textView_yesterday" />
21             
22         </RelativeLayout>
23         <ListView android:id="@+id/yesterday_task_listview"
24             android:layout_width="fill_parent" android:layout_height="wrap_content"
25             android:layout_marginTop="5dp" android:layout_marginBottom="10dp"
26             android:cacheColorHint="@android:color/transparent" android:dividerHeight="10dp"
27             android:divider="@android:color/transparent" android:listSelector="@android:color/transparent"
28             android:drawSelectorOnTop="false" />
29     </LinearLayout>
30 </ScrollView>
yesterday_task_item.xml
1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="horizontal" android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:padding="5dp"
 6     android:background="@drawable/layoutbg"
 7     android:gravity="center_vertical"
 8     >
 9 
10     <!-- 任务名称、时间和地点  时间提醒和地点提醒图标 -->
11     <LinearLayout android:orientation="vertical"
12         android:layout_width="wrap_content" android:layout_height="wrap_content">
13         <RelativeLayout android:orientation="horizontal"
14             android:layout_width="@dimen/task_item_name_width" android:layout_height="wrap_content">
15             <com.planbetter.view.AlwaysMarqueeTextView android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever"
16             android:focusableInTouchMode="true" android:focusable="true"
17                 android:id="@+id/yesterday_task_info" android:layout_width="160dp"
18                 android:layout_height="wrap_content" android:textColor="@android:color/black"
19                 android:scrollHorizontally="true"
20                 android:singleLine="true"
21                 android:textSize="20sp" />
22             <LinearLayout android:orientation="horizontal" android:layout_marginTop="5dp"
23                  android:layout_marginLeft="10dp" android:layout_alignParentRight="true" android:layout_toRightOf="@id/yesterday_task_info"
24                 android:layout_width="wrap_content" android:layout_height="wrap_content">
25                 <ImageView android:id="@+id/yesterday_star_rank"  
26                     android:layout_width="wrap_content" android:layout_height="wrap_content" 
27                     />
28             </LinearLayout>
29         </RelativeLayout>
30         <LinearLayout android:orientation="horizontal"
31             android:layout_width="@dimen/task_item_name_width" android:layout_height="wrap_content">
32             <com.planbetter.view.AlwaysMarqueeTextView android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever"
33                     android:focusableInTouchMode="true" android:focusable="true" android:scrollHorizontally="true"
34                     android:layout_width="210dp" android:id="@+id/yesterday_task_time_position_textview"
35                     android:layout_height="wrap_content" android:textColor="@android:color/black"
36                     android:singleLine="true"
37                     android:textSize="15sp" />
38             
39         </LinearLayout>
40     </LinearLayout>
41 
42     <LinearLayout android:gravity="right" android:orientation="vertical"
43         android:layout_width="fill_parent" android:layout_height="fill_parent">
44         <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent"
45             android:layout_height="fill_parent" >
46             <Button android:id="@+id/yesterday_task_edit_btn" android:layout_width="fill_parent"
47                 android:layout_marginLeft="2dp" android:background="@drawable/yesterday_delete_btn_bg"
48                 android:layout_height="fill_parent" />
49         </LinearLayout>
50     </LinearLayout>
51 </LinearLayout> 

关于今天

     今天对比昨天而言,需求又不一样。随着新的空白的一天的开始,你可以随时添加当天需要完成的任务,除了活动内容和时间地点以外,你还可以指定活动周期(即该活动持续多少天)、活动优先级(即活动重要性)以及是否设置活动提醒(即闹钟提醒)。如果当天存在活动未完成,且设置了活动提醒,状态栏会显示一个小闹钟的图标,可以参见上面今天视图右边那张图片。

      同样,活动的完成情况可以根据颜色的明暗来区分,颜色为暗色的表示活动已完成。用户可以通过单击某个活动来修改活动的是否完成情况,也可以长按该活动来对它进行进一步的操作,包括“编辑活动”、“删除活动”和“推迟活动”。

                 

今天视图的布局代码如下所示,同样活动列表也是用ListView来实现。

today_task_layout.xml
1 <?xml version="1.0" encoding="utf-8"?>
 2 <ScrollView android:layout_width="fill_parent"
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/task_today_bg"
 5     android:fillViewport="true">
 6     <LinearLayout android:orientation="vertical"
 7         android:layout_width="@dimen/day_container_width" android:paddingLeft="15.0dp" android:paddingTop="7.0dp"
 8         android:paddingRight="15.0dp" android:paddingBottom="15.0dp"
 9         android:layout_height="fill_parent">
10         <RelativeLayout android:layout_width="fill_parent"
11             android:layout_height="wrap_content">
12             <TextView android:textSize="30.0sp" android:typeface="serif"
13                 android:textColor="@android:color/black" android:id="@+id/textView_today"
14                 android:focusable="true" android:focusableInTouchMode="true"
15                 android:layout_width="wrap_content" android:layout_height="wrap_content"
16                 android:text="@string/label_today" android:layout_alignParentLeft="true" />
17             <TextView android:textSize="18.0sp" android:typeface="serif"
18                 android:textColor="@android:color/black" android:id="@+id/textView_today_date"
19                 android:layout_width="wrap_content" android:layout_height="wrap_content"
20                 android:layout_below="@id/textView_today" />
21             <FrameLayout android:layout_width="wrap_content"
22                 android:layout_height="wrap_content" android:layout_marginTop="35.0dp"
23                 android:layout_alignParentRight="true">
24                 <Button android:textSize="15.0sp" android:typeface="serif"
25                     android:id="@+id/today_add_task_btn" android:background="@drawable/bg_add_task_btn"
26                     android:layout_width="wrap_content" android:layout_height="40.0dp"
27                     android:text="@string/add_task_label" android:layout_alignBaseline="@id/textView_today_date" />
28             </FrameLayout>
29         </RelativeLayout>
30         <ListView android:id="@+id/today_task_listview"
31             android:layout_width="fill_parent" android:layout_height="wrap_content"
32             android:layout_marginTop="5dp" android:layout_marginBottom="10dp"
33             android:cacheColorHint="@android:color/transparent" android:dividerHeight="10dp"
34             android:divider="@android:color/transparent" android:listSelector="@android:color/transparent"
35             android:drawSelectorOnTop="false" />
36     </LinearLayout>
37 </ScrollView>
today_task_item.xml
1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="horizontal" android:layout_width="fill_parent"
 4     android:layout_height="fill_parent" android:padding="5dp"
 5     android:background="@drawable/layoutbg" android:gravity="center_vertical">
 6 
 7     <!-- 任务名称、时间和地点 时间提醒和地点提醒图标 -->
 8     <LinearLayout android:orientation="vertical"
 9         android:layout_width="wrap_content" android:layout_height="wrap_content">
10         <RelativeLayout android:orientation="horizontal"
11             android:layout_width="@dimen/task_item_name_width"
12             android:layout_height="wrap_content">
13             <TextView
14                 android:id="@+id/today_task_info" android:layout_width="150dp"
15                 android:layout_height="wrap_content" android:textColor="@android:color/black"
16                 android:singleLine="true"
17                 android:textSize="20sp" />
18             <LinearLayout android:orientation="horizontal"
19                 android:layout_marginTop="5dp" android:layout_marginLeft="2dp"
20                 android:layout_alignParentRight="true" android:layout_toRightOf="@id/today_task_info"
21                 android:layout_width="wrap_content" android:layout_height="wrap_content">
22                 <TextView android:id="@+id/today_repeat_days" android:background="@drawable/bg_quick_dial"
23                     android:textColor="@android:color/white" android:textSize="10sp" android:gravity="center"
24                     android:layout_width="15dp"
25                     android:layout_height="15dp"/>
26                 <ImageView android:id="@+id/today_star_rank" android:layout_marginLeft="5dp"
27                     android:layout_width="wrap_content" android:layout_height="wrap_content" />
28             </LinearLayout>
29         </RelativeLayout>
30         <LinearLayout android:orientation="horizontal"
31             android:layout_width="@dimen/task_item_name_width"
32             android:layout_height="wrap_content">
33             <TextView
34                 android:layout_width="210dp"
35                 android:id="@+id/today_task_time_position_textview"
36                 android:layout_height="wrap_content" android:textColor="@android:color/black"
37                 android:singleLine="true" android:textSize="15sp" />
38             <ImageView android:id="@+id/today_time_alert" android:src="@drawable/clock"
39                 android:layout_marginTop="8dp" android:layout_marginLeft="5dp"
40                 android:layout_width="wrap_content" android:layout_height="wrap_content" />
41         </LinearLayout>
42     </LinearLayout>
43 
44     <LinearLayout android:gravity="right" android:orientation="vertical"
45         android:layout_width="fill_parent" android:layout_height="fill_parent">
46         <LinearLayout android:orientation="horizontal"
47             android:layout_width="fill_parent" android:layout_height="fill_parent">
48             <ImageView android:id="@+id/today_task_complete_state"
49                 android:layout_width="fill_parent" android:layout_marginLeft="1dp"
50                 android:layout_height="fill_parent" />
51         </LinearLayout>
52     </LinearLayout>
53 </LinearLayout>  

关于未来

      这里未来相对来说比较容易。关于未来,只要起到提醒的作用就可以了。只要明白活动内容日期,我们就很容易掌握将要到来的事情。你也可以指定具体的时间点,在未来的某时刻进行活动提醒。这里通过倒计时的方式显示,更容易让用户接受,一目了然。

      如下图所示,对比昨天和今天视图,比较大的一个区别在于,多了一个活动详细。你可以通过点击某个活动,活动详细里就可以把详细信息显示出来,在这里你可以查看具体的日期。另外,你可以通过长按某个活动来对活动进行编辑和删除操作。

                                  

tomorrow_task_layout.xml
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <ScrollView android:layout_width="fill_parent"
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/task_tomorrow_bg"
 5     android:fillViewport="true">
 6     <LinearLayout android:orientation="vertical"
 7         android:layout_width="fill_parent" android:layout_height="fill_parent">
 8         <LinearLayout android:orientation="horizontal"
 9             android:layout_height="wrap_content" android:layout_marginLeft="5dp"
10             android:layout_width="fill_parent" android:layout_marginTop="10dp"
11             android:layout_marginBottom="5dp" android:layout_gravity="center_horizontal">
12             <TextView android:textColor="@android:color/black"
13                 android:layout_width="wrap_content" android:layout_marginLeft="8dp"
14                 android:layout_height="wrap_content" android:typeface="serif"
15                 android:text="未来" android:layout_alignParentLeft="true"
16                 android:textSize="28.0sp" android:id="@+id/textView_future"></TextView>
17             <TextView android:textColor="@android:color/black"
18                 android:layout_width="wrap_content" android:layout_marginLeft="8dp"
19                 android:layout_height="wrap_content" android:typeface="serif"
20                 android:text="掌握在我们手中……" android:textSize="15.0sp"
21                 android:layout_below="@id/textView_future" android:id="@+id/textView_futuremessage"></TextView>
22             <Button android:layout_height="wrap_content"
23                 android:layout_width="wrap_content" android:id="@+id/addTask" android:text="增加活动"
24                 android:textSize="13sp" android:background="@drawable/bg_add_task_btn"
25                 android:drawableLeft="@drawable/tomorrowtask_love"
26                 android:layout_marginLeft="5dp" android:layout_below="@id/textView_future"
27                 android:textColor="#000"></Button>
28         </LinearLayout>
29         <RelativeLayout android:layout_height="wrap_content" android:layout_marginTop="5dp"
30             android:layout_width="fill_parent" android:layout_gravity="left">
31             <com.planbetter.view.AlwaysMarqueeTextView
32                 android:textColor="@android:color/black" android:layout_width="200dp"
33                 android:layout_marginLeft="8dp" android:layout_height="wrap_content"
34                 android:scrollHorizontally="true" android:ellipsize="marquee"
35                 android:typeface="serif"
36                 android:singleLine="true" android:layout_alignParentLeft="true"
37                 android:focusable="true" android:textSize="20.0sp" android:id="@+id/textView_datematter"></com.planbetter.view.AlwaysMarqueeTextView>
38             <TextView android:textColor="@android:color/black"
39                 android:layout_width="200dp" android:layout_marginLeft="8dp"
40                 android:layout_height="wrap_content" android:typeface="serif"
41                 android:layout_alignParentLeft="true"
42                 android:textSize="15.0sp" android:layout_below="@id/textView_datematter"
43                 android:id="@+id/textView_datemattermessage"></TextView>
44             <TextView android:textColor="@android:color/black"
45                 android:layout_width="85dp" android:layout_marginLeft="2dp"
46                 android:gravity="center_horizontal" android:layout_height="wrap_content"
47                 android:layout_toLeftOf="@+id/textView_tomorrow_day"
48                 android:typeface="serif" android:textSize="50.0sp"
49                 android:layout_alignBaseline="@+id/textView_datemattermessage"
50                 android:id="@+id/textView_daysleft"></TextView>
51             <TextView android:textColor="@android:color/black"
52                 android:layout_width="wrap_content" android:gravity="center"
53                 android:layout_height="wrap_content"
54                 android:layout_alignParentRight="true" android:typeface="serif"
55                 android:text="天" android:textSize="20.0sp" android:id="@+id/textView_tomorrow_day"></TextView>
56         </RelativeLayout>
57         <ListView 
58             android:id="@+id/tomorrow_task_listview" android:layout_height="wrap_content"
59             android:layout_width="fill_parent" android:layout_marginTop="5dp"
60             android:dividerHeight="10dp" android:layout_marginBottom="10dp"
61             android:cacheColorHint="@android:color/transparent"
62             android:divider="@android:color/transparent" android:listSelector="@android:color/transparent"
63             android:drawSelectorOnTop="false">
64             </ListView>
65     </LinearLayout>
66 </ScrollView>
tomorrow_task_item.xml
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:orientation="horizontal" android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:padding="5dp"
 6     android:background="@drawable/recommend_bg"
 7     android:gravity="center_vertical"
 8     >
 9 
10     <!-- 任务名称、距离的天数图标 -->
11     <RelativeLayout android:layout_width="fill_parent" android:layout_alignParentLeft="true"
12             android:layout_height="50dp" android:layout_gravity="left">
13 
14             <TextView 
15                 android:layout_marginLeft="8dp" android:layout_marginTop="8dp"
16                 android:textSize="25.0sp" android:typeface="serif" android:gravity="center_vertical"
17                 android:textColor="@android:color/white" android:id="@+id/tomorrow_item_textView_datematter"
18                 android:layout_width="200dp" android:layout_height="wrap_content"
19                 android:singleLine="true"
20                 android:layout_alignParentLeft="true" 
21                 />
22 
23             <TextView android:textSize="35.0sp" android:typeface="serif"
24                 android:layout_marginLeft="2dp" android:textColor="@android:color/white"
25                 android:id="@+id/tomorrow_item_textView_daysleft" android:layout_width="85dp"
26                 android:layout_height="wrap_content"
27                 android:layout_toLeftOf="@+id/tomorrow_item_textView_tomorrow_day" 
28                 android:gravity="center_horizontal"/>
29 
30             <TextView android:textSize="25.0sp" android:typeface="serif" android:layout_marginTop="8dp"
31                 android:textColor="@android:color/white" android:id="@+id/tomorrow_item_textView_tomorrow_day"
32                 android:layout_width="wrap_content" android:layout_height="wrap_content"
33                 android:singleLine="true" android:text="天"
34                 android:layout_alignParentRight="true" />
35         </RelativeLayout>
36 </LinearLayout>  

数据存储

      谈完了数据的显示,再说说数据的存储。有关活动的数据都是存储在数据库当中的,相信做过Android开发的都不陌生,我也不班门弄斧了。

      下面是建数据表的SQL语句,写在DatabaseHelper类中:

DatabaseHelper.java
 1 //创建任务表
 2     private static String CREATE_TASK_TABLE_SQL = "CREATE TABLE IF NOT EXISTS " + TaskBean.TABLE_NAME + "("
 3         + TaskBean.ID + " INTEGER PRIMARY KEY,"
 4         + TaskBean.DATETIME + " TEXT,"
 5         + TaskBean.TASK_NAME + " TEXT,"
 6         + TaskBean.POSITION_NAME + " TEXT,"
 7         + TaskBean.TIME_ALERT_FLAG + " INTEGER,"
 8         + TaskBean.PRIORITY + " INTEGER,"
 9         + TaskBean.IF_COMPLETE + " INTEGER,"
10         + TaskBean.REPEAT_DAYS + " INTEGER,"
11         + TaskBean.IF_FUTURE+ " INTEGER,"
12         + TaskBean.PARENT +" INTEGER)";

      见名思义,通过上面的代码可以知道这个表中各个字段的含义,但我还是详细说一下。下面是task表的详细属性说明和表图:

                                                                           

Name

Comment

Default

DataType

     P

     F

     M

task_id

任务编号

 

INTEGER

 

 

task_datetime

任务时间

 

TEXT

 

 

 

task_name

任务内容

 

TEXT

 

 

 

position_name

任务地点

 

TEXT

 

 

 

time_alert

是否提醒

 

INTEGER

 

 

 

task_priority

任务优先级

 

INTEGER

 

 

 

if_complete

是否完成

 

INTEGER

     

repeat_days

重复天数

 

INTEGER

     

parent

父亲编号

 

INTEGER

     

      可能大家会比较好奇为什么会有一个parent字段。因为在今天视图中创建活动时可以设置活动周期,即重复天数。当用户创建了一个活动周期大于1天的活动时,后台数据库需要创建相同数量的记录,此时parent父亲编号同为当天活动的编号。这样在进行后续的修改和删除时根据repeat_days和parent这两个字段就可以有效地进行操作。

 

待续

作者:黑剑 
出处:http://www.cnblogs.com/blacksword/ 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 
标签: Android
原文地址:https://www.cnblogs.com/Leo_wl/p/2728522.html