├── .gitignore
├── AndroidTimetableView
├── .gitignore
├── .idea
│ ├── caches
│ │ └── build_file_checksums.ser
│ ├── codeStyles
│ │ └── Project.xml
│ ├── gradle.xml
│ ├── markdown-navigator.xml
│ ├── markdown-navigator
│ │ └── profiles_settings.xml
│ ├── misc.xml
│ ├── modules.xml
│ ├── runConfigurations.xml
│ └── vcs.xml
├── TimetableView
│ ├── .idea
│ │ ├── gradle.xml
│ │ ├── misc.xml
│ │ ├── modules.xml
│ │ ├── runConfigurations.xml
│ │ └── workspace.xml
│ ├── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle
│ │ └── wrapper
│ │ │ ├── gradle-wrapper.jar
│ │ │ └── gradle-wrapper.properties
│ ├── gradlew
│ ├── gradlew.bat
│ ├── ic_launcher-web.png
│ ├── proguard-project.txt
│ ├── project.properties
│ ├── res
│ │ ├── drawable-hdpi
│ │ │ ├── ic_add.png
│ │ │ └── ic_launcher.png
│ │ ├── drawable-ldpi
│ │ │ └── layer_gridview.xml
│ │ ├── drawable-mdpi
│ │ │ └── ic_launcher.png
│ │ ├── drawable-xhdpi
│ │ │ └── ic_launcher.png
│ │ ├── drawable-xxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── drawable
│ │ │ ├── course_redpoint_style.xml
│ │ │ ├── item_corner_style.xml
│ │ │ ├── layout_press_style.xml
│ │ │ ├── week_oval_normal_style.xml
│ │ │ ├── week_oval_press_style.xml
│ │ │ ├── week_oval_style.xml
│ │ │ ├── weekview_thisweek.xml
│ │ │ └── weekview_white.xml
│ │ ├── layout
│ │ │ ├── chooseweek_item_layout.xml
│ │ │ ├── item_dateview.xml
│ │ │ ├── item_dateview_first.xml
│ │ │ ├── item_slide_default.xml
│ │ │ ├── item_slide_time.xml
│ │ │ ├── item_timetable.xml
│ │ │ ├── item_weekview.xml
│ │ │ ├── timetable_layout.xml
│ │ │ ├── view_content.xml
│ │ │ ├── view_simplescrollview.xml
│ │ │ └── view_weekview.xml
│ │ ├── menu
│ │ │ └── main.xml
│ │ ├── values-v11
│ │ │ └── styles.xml
│ │ ├── values-v14
│ │ │ └── styles.xml
│ │ ├── values-w820dp
│ │ │ └── dimens.xml
│ │ └── values
│ │ │ ├── attrs.xml
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ └── src
│ │ └── com
│ │ └── zhuangfei
│ │ └── timetable
│ │ ├── TimetableView.java
│ │ ├── listener
│ │ ├── ISchedule.java
│ │ ├── IWeekView.java
│ │ ├── OnConfigHandleAdapter.java
│ │ ├── OnDateBuildAapter.java
│ │ ├── OnFlaglayoutClickAdapter.java
│ │ ├── OnItemBuildAdapter.java
│ │ ├── OnItemClickAdapter.java
│ │ ├── OnItemLongClickAdapter.java
│ │ ├── OnScrollViewBuildAdapter.java
│ │ ├── OnSlideBuildAdapter.java
│ │ ├── OnSpaceItemClickAdapter.java
│ │ ├── OnWeekChangedAdapter.java
│ │ ├── OnWeekItemClickedAdapter.java
│ │ ├── OnWeekLeftClickedAdapter.java
│ │ └── package-info.java
│ │ ├── model
│ │ ├── Schedule.java
│ │ ├── ScheduleColorPool.java
│ │ ├── ScheduleConfig.java
│ │ ├── ScheduleEnable.java
│ │ ├── ScheduleSupport.java
│ │ ├── WeekViewEnable.java
│ │ └── package-info.java
│ │ ├── operater
│ │ ├── AbsOperater.java
│ │ ├── SimpleOperater.java
│ │ └── package-info.java
│ │ ├── package-info.java
│ │ ├── utils
│ │ ├── ColorUtils.java
│ │ ├── ScreenUtils.java
│ │ └── package-info.java
│ │ └── view
│ │ ├── PerWeekView.java
│ │ ├── WeekView.java
│ │ └── package-info.java
├── app
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ ├── release
│ │ ├── app-release.apk
│ │ └── output.json
│ └── src
│ │ ├── androidTest
│ │ └── java
│ │ │ └── com
│ │ │ └── zhuangfei
│ │ │ └── android_timetableview
│ │ │ └── ExampleInstrumentedTest.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── zhuangfei
│ │ │ │ └── android_timetableview
│ │ │ │ ├── App.java
│ │ │ │ ├── MainActivity.java
│ │ │ │ ├── adapter
│ │ │ │ ├── NonViewAdapter.java
│ │ │ │ └── OnDateDelayAdapter.java
│ │ │ │ ├── config
│ │ │ │ └── OnMyConfigHandleAdapter.java
│ │ │ │ ├── custom
│ │ │ │ └── CustomOperater.java
│ │ │ │ ├── language
│ │ │ │ ├── OnEnglishDateBuildAdapter.java
│ │ │ │ └── OnEnglishItemBuildAdapter.java
│ │ │ │ ├── model
│ │ │ │ ├── MySubject.java
│ │ │ │ ├── SubjectExtras.java
│ │ │ │ └── SubjectRepertory.java
│ │ │ │ ├── template
│ │ │ │ └── wakeup
│ │ │ │ │ ├── WakeupActivity.java
│ │ │ │ │ └── WakeupFragment.java
│ │ │ │ └── views
│ │ │ │ ├── AttrActivity.java
│ │ │ │ ├── BaseFuncActivity.java
│ │ │ │ ├── ColorPoolActivity.java
│ │ │ │ ├── CustomWidthActivity.java
│ │ │ │ ├── DateActivity.java
│ │ │ │ ├── DateDelayActivity.java
│ │ │ │ ├── ElasticActivity.java
│ │ │ │ ├── ElasticScrollView.java
│ │ │ │ ├── ExtrasActivity.java
│ │ │ │ ├── FlaglayoutActivity.java
│ │ │ │ ├── ItemStyleActivity.java
│ │ │ │ ├── LocalConfigActivity.java
│ │ │ │ ├── NonViewActivity.java
│ │ │ │ ├── SimpleActivity.java
│ │ │ │ └── SlideActivity.java
│ │ └── res
│ │ │ ├── drawable-hdpi
│ │ │ ├── bg.jpg
│ │ │ ├── bg2.jpg
│ │ │ ├── bg3.jpg
│ │ │ └── bg4.jpg
│ │ │ ├── drawable-v24
│ │ │ └── ic_launcher_foreground.xml
│ │ │ ├── drawable
│ │ │ ├── ic_back.png
│ │ │ ├── ic_launcher.png
│ │ │ ├── ic_launcher_background.xml
│ │ │ └── more.png
│ │ │ ├── layout
│ │ │ ├── activity_attr.xml
│ │ │ ├── activity_base_func.xml
│ │ │ ├── activity_color_pool.xml
│ │ │ ├── activity_custom_item_style.xml
│ │ │ ├── activity_custom_scroll_view.xml
│ │ │ ├── activity_custom_width.xml
│ │ │ ├── activity_date.xml
│ │ │ ├── activity_date_delay.xml
│ │ │ ├── activity_extras.xml
│ │ │ ├── activity_flaglayout.xml
│ │ │ ├── activity_local_config.xml
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_new_feature.xml
│ │ │ ├── activity_non_view.xml
│ │ │ ├── activity_slide1.xml
│ │ │ ├── activity_wakeup.xml
│ │ │ ├── custom_myscrollview.xml
│ │ │ ├── fragment_wakeup.xml
│ │ │ ├── header_base_func.xml
│ │ │ ├── header_simple.xml
│ │ │ ├── item_custom_dateview.xml
│ │ │ ├── item_custom_dateview_first.xml
│ │ │ ├── item_custom_slide.xml
│ │ │ └── item_nonview.xml
│ │ │ ├── menu
│ │ │ ├── popmenu_base_func.xml
│ │ │ ├── popmenu_colorpool.xml
│ │ │ ├── popmenu_date.xml
│ │ │ ├── popmenu_flaglayout.xml
│ │ │ ├── popmenu_itemstyle.xml
│ │ │ ├── popmenu_local_config.xml
│ │ │ ├── popmenu_nonview.xml
│ │ │ ├── popmenu_slide1.xml
│ │ │ └── popmenu_subject.xml
│ │ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ │ └── values
│ │ │ ├── colors.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── zhuangfei
│ │ └── android_timetableview
│ │ └── ExampleUnitTest.kt
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
├── LICENSE
├── README.md
├── _config.yml
├── apk
└── app-release.apk
└── images
├── guaishou.jpeg
├── v1.x
├── 1.0.3之前的模式分析图.jpg
├── 1.0.4模式分析图.jpg
├── img1.png
├── img2.png
├── img3.png
├── img4.png
└── img5.png
├── v2.0.3
├── img1.jpg
└── img2.jpg
├── v2.0.6
└── img1.jpg
└── v2.x
├── bg.png
├── img1.png
├── img2.png
├── img3.png
├── img4.png
├── img5.png
├── img6.png
├── img7.png
├── img8.png
├── img9.png
├── v2img1.jpg
├── v2img2.jpg
└── v2img3.jpg
/.gitignore:
--------------------------------------------------------------------------------
1 | # Files for the ART/Dalvik VM
2 | *.dex
3 |
4 | # Java class files
5 | *.class
6 | .classpath
7 | .project
8 |
9 | # Generated files
10 | bin/
11 | gen/
12 | out/
13 |
14 | # Gradle files
15 | .gradle/
16 | build/
17 |
18 | # Local configuration file (sdk path, etc)
19 | local.properties
20 |
21 | # Proguard folder generated by Eclipse
22 | proguard/
23 |
24 | # Log Files
25 | *.log
26 |
27 | # Android Studio Navigation editor temp files
28 | .navigation/
29 |
30 | # Android Studio captures folder
31 | captures/
32 |
33 | # Intellij
34 | *.iml
35 | .idea/workspace.xml
36 | .idea/tasks.xml
37 | .idea/gradle.xml
38 | .idea/dictionaries
39 | .idea/libraries
40 |
41 | # Keystore files
42 | *.jks
43 |
44 | # External native build folder generated in Android Studio 2.2 and later
45 | .externalNativeBuild
46 |
47 | # Google Services (e.g. APIs or Firebase)
48 | google-services.json
49 |
50 | # Freeline
51 | freeline.py
52 | freeline/
53 | freeline_project_description.json
54 |
--------------------------------------------------------------------------------
/AndroidTimetableView/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea/workspace.xml
5 | /.idea/libraries
6 | .DS_Store
7 | /build
8 | /captures
9 | .externalNativeBuild
10 |
--------------------------------------------------------------------------------
/AndroidTimetableView/.idea/caches/build_file_checksums.ser:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/.idea/caches/build_file_checksums.ser
--------------------------------------------------------------------------------
/AndroidTimetableView/.idea/codeStyles/Project.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/AndroidTimetableView/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
18 |
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/.idea/markdown-navigator.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
--------------------------------------------------------------------------------
/AndroidTimetableView/.idea/markdown-navigator/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/AndroidTimetableView/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/AndroidTimetableView/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/AndroidTimetableView/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/.idea/gradle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/.idea/runConfigurations.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.library'
2 | apply plugin: 'com.novoda.bintray-release'//添加
3 |
4 | dependencies {
5 | compile fileTree(include: '*.jar', dir: 'libs')
6 | }
7 |
8 | android {
9 | compileSdkVersion 26
10 | buildToolsVersion '26.0.2'
11 |
12 | compileOptions {
13 | sourceCompatibility JavaVersion.VERSION_1_7
14 | targetCompatibility JavaVersion.VERSION_1_7
15 | }
16 |
17 | sourceSets {
18 | main {
19 | manifest.srcFile 'AndroidManifest.xml'
20 | java.srcDirs = ['src']
21 | resources.srcDirs = ['src']
22 | aidl.srcDirs = ['src']
23 | renderscript.srcDirs = ['src']
24 | res.srcDirs = ['res']
25 | assets.srcDirs = ['assets']
26 | }
27 |
28 | // Move the tests to tests/java, tests/res, etc...
29 | instrumentTest.setRoot('tests')
30 |
31 | // Move the build types to build-types/
32 | // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
33 | // This moves them out of them default location under src//... which would
34 | // conflict with src/ being used by the main source set.
35 | // Adding new build types or product flavors should be accompanied
36 | // by a similar customization.
37 | debug.setRoot('build-types/debug')
38 | release.setRoot('build-types/release')
39 | }
40 |
41 | buildTypes {
42 | release {
43 | //混淆
44 | minifyEnabled false
45 |
46 | //加载默认混淆配置文件
47 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
48 | }
49 | }
50 | }
51 |
52 | //添加
53 | publish {
54 | userOrg = 'zhuangfei'//bintray.com用户名
55 | repoName='Maven'
56 | groupId = 'com.zhuangfei'//jcenter上的路径
57 | artifactId = 'TimetableView'//项目名称
58 | publishVersion = '2.0.6'//版本号
59 | desc = 'A beautiful Android based curriculum schedule widget'//描述,不重要
60 | website = 'https://github.com/zfman/TimetableView'//网站,不重要;尽量模拟github上的地址,例如我这样的;当然你有地址最好了
61 | }
62 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/TimetableView/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Jan 28 17:35:13 CST 2018
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
7 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/ic_launcher-web.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/TimetableView/ic_launcher-web.png
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/proguard-project.txt:
--------------------------------------------------------------------------------
1 | # To enable ProGuard in your project, edit project.properties
2 | # to define the proguard.config property as described in that file.
3 | #
4 | # Add project specific ProGuard rules here.
5 | # By default, the flags in this file are appended to flags specified
6 | # in ${sdk.dir}/tools/proguard/proguard-android.txt
7 | # You can edit the include path and order by changing the ProGuard
8 | # include property in project.properties.
9 | #
10 | # For more details, see
11 | # http://developer.android.com/guide/developing/tools/proguard.html
12 |
13 | # Add any project specific keep options here:
14 |
15 | # If your project uses WebView with JS, uncomment the following
16 | # and specify the fully qualified class name to the JavaScript interface
17 | # class:
18 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
19 | # public *;
20 | #}
21 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/project.properties:
--------------------------------------------------------------------------------
1 | # This file is automatically generated by Android Tools.
2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
3 | #
4 | # This file must be checked in Version Control Systems.
5 | #
6 | # To customize properties used by the Ant build system edit
7 | # "ant.properties", and override values to adapt the script to your
8 | # project structure.
9 | #
10 | # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
11 | #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
12 |
13 | # Project target.
14 | target=android-19
15 | android.library.reference.1=..\\pulltorefreshlibrary
16 | android.library=true
17 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable-hdpi/ic_add.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/TimetableView/res/drawable-hdpi/ic_add.png
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/TimetableView/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable-ldpi/layer_gridview.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | -
9 |
10 |
11 |
12 |
13 |
14 |
15 | -
20 |
21 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/TimetableView/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/TimetableView/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/TimetableView/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable/course_redpoint_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable/item_corner_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable/layout_press_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable/week_oval_normal_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable/week_oval_press_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable/week_oval_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable/weekview_thisweek.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/drawable/weekview_white.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/chooseweek_item_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
12 |
20 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/item_dateview.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
18 |
19 |
24 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/item_dateview_first.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/item_slide_default.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
13 |
14 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/item_slide_time.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
15 |
20 |
21 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/item_timetable.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
16 |
17 |
27 |
28 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/item_weekview.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
21 |
26 |
27 |
33 |
34 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/timetable_layout.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/view_content.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
20 |
21 |
22 |
23 |
30 |
31 |
38 |
39 |
46 |
47 |
54 |
55 |
62 |
63 |
70 |
71 |
78 |
79 |
80 |
86 |
90 |
91 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/view_simplescrollview.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/layout/view_weekview.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
17 |
22 |
23 |
24 |
29 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/menu/main.xml:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/values-v11/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/values-v14/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 | 64dp
9 | 16dp
10 | 56dp
11 | 57dp
12 | 55dp
13 | 3dp
14 | 3dp
15 | 50dp
16 |
17 | 2dp
18 | 80dp
19 |
20 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | #000000
5 |
6 |
7 | #FB6A8F
8 |
9 |
10 |
11 |
12 |
13 | #31C453
14 |
15 |
16 | #FB5137
17 |
18 |
19 | #F52A64
20 |
21 | #84fab0
22 | #8fd3f4
23 |
24 |
25 | #F2F2F2
26 | #EEEEEE
27 | #d81e06
28 | #E8E8E8
29 | #999999
30 | #E6E6E6
31 | #f0f0f0
32 | #636363
33 |
34 |
35 | #FFFFCC
36 | #2196F3
37 | #3FCAB8
38 |
39 | #2ABFFD
40 | #4F8CFE
41 | #FB6A8F
42 |
43 | #faf6f0
44 | #ffac37
45 | #24b9fe
46 |
47 | #BFF6F4
48 | #F4F8F8
49 | #0E0E0E
50 | #D3D3D3
51 | #5ACE45
52 | #ffffff
53 | #FF6633
54 | #EDF0F2
55 | #F7F7F7
56 |
57 | #5D89B6
58 | #C4F1FD
59 | #3D3B46
60 | #8D8B99
61 | #5A5865
62 |
63 |
64 | #FFFF99
65 | #AAA3DB
66 | #86ACE9
67 | #92D261
68 | #80D8A3
69 | #F1C672
70 | #FDAD8B
71 | #ADBEFF
72 | #94D6FA
73 | #C3B5F6
74 | #99CCFF
75 | #FBA6ED
76 |
77 | #EE8262
78 | #EE6363
79 | #EEB4B4
80 | #D2B48C
81 | #CD9B9B
82 | #5F9EA0
83 |
84 | #E6E6E6
85 |
86 | #000000
87 |
88 |
89 | #CCCCCC
90 |
91 | #e7e7e7
92 | #d9d9d9
93 |
94 | #effafe
95 | #f0ffec
96 | #f3fffc
97 |
98 |
99 | #00abcf
100 | #d5ddde
101 | #d3d3d3
102 | #bfbfbf
103 | #FF9966
104 | #66FF66
105 |
106 | #F3F4F7
107 | #E0E0E0
108 | #D7D7DA
109 |
110 | #FDCD00
111 | #EBEBEB
112 | #393939
113 | #8E8E93
114 | #DADBE2
115 | #474747
116 |
117 | #0effc2
118 | #63AEFF
119 | #D6D6D6
120 |
121 | #E9E9E9
122 | #13B0F1
123 | #F4F8F8
124 | #E4EBEE
125 |
126 | #333333
127 | #E2F7F6
128 | #F1FFFE
129 | #B7F5F2
130 |
131 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 16dp
5 | 16dp
6 | 55dp
7 | 3dp
8 | 3dp
9 | 50dp
10 | 2dp
11 |
12 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | subject-timetable
5 | Hello world!
6 | Settings
7 |
8 |
9 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
7 |
14 |
15 |
16 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/ISchedule.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 | import android.content.Context;
4 | import android.graphics.drawable.GradientDrawable;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 | import android.widget.FrameLayout;
8 | import android.widget.LinearLayout;
9 | import android.widget.TextView;
10 |
11 | import com.zhuangfei.timetable.TimetableView;
12 | import com.zhuangfei.timetable.model.Schedule;
13 |
14 | import java.util.List;
15 |
16 | /**
17 | * 与Schedule有关的接口.
18 | */
19 |
20 | public interface ISchedule {
21 |
22 | /**
23 | * 课程项点击监听器
24 | */
25 | interface OnItemClickListener {
26 | /**
27 | * 当课程项被点击时回调
28 | *
29 | * @param v
30 | * @param scheduleList 该位置的所有课程
31 | */
32 | void onItemClick(View v, List scheduleList);
33 | }
34 |
35 | /**
36 | * 课程项长按事件监听器
37 | */
38 | interface OnItemLongClickListener {
39 | /**
40 | * 当课程项被点击时回调
41 | *
42 | * @param v
43 | * @param day 星期,1:周一,7:周日
44 | * @param start 节次,从1开始
45 | */
46 | void onLongClick(View v, int day,int start);
47 | }
48 |
49 | /**
50 | * 空白格子点击监听器
51 | */
52 | interface OnSpaceItemClickListener {
53 | /**
54 | * 当课程项被点击时回调
55 | *
56 | * @param day 表示周几,0:周一,6:周日
57 | * @param start 表示点击空白格子的节次,1:第一节
58 | */
59 | void onSpaceItemClick(int day,int start);
60 |
61 | /**
62 | * 初始化方法
63 | * @param flagLayout 一个指示器的布局
64 | * @param monthWidth 月份列宽度
65 | * @param itemWidth 课程项宽度,itemWidth:是包含了边距的,设置宽度时所以需要减去边距
66 | * @param itemHeight 课程项高度
67 | * @param marTop 外边距
68 | */
69 | void onInit(LinearLayout flagLayout,int monthWidth,int itemWidth,
70 | int itemHeight,int marTop,int marLeft);
71 | }
72 |
73 | /**
74 | * 旗标布局点击监听器
75 | */
76 | interface OnFlaglayoutClickListener {
77 | /**
78 | * 当旗标布局被点击时回调
79 | *
80 | * @param day 表示周几,0:周一,6:周日
81 | * @param start 表示点击空白格子的节次,1:第一节
82 | */
83 | void onFlaglayoutClick(int day,int start);
84 | }
85 |
86 | /**
87 | * 周次改变监听器
88 | */
89 | interface OnWeekChangedListener {
90 | /**
91 | * 当周次被改变时回调
92 | *
93 | * @param curWeek 改变的周次,不一定是当前周,因为切换周次的时候有两种模式:
94 | * 仅仅切换周次、强制切换,前者不会更改当前周
95 | */
96 | void onWeekChanged(int curWeek);
97 | }
98 |
99 | /**
100 | * 课程项构建时回调
101 | */
102 | interface OnItemBuildListener {
103 |
104 | /**
105 | * 构建课程项的文本时回调.
106 | *
107 | * @param schedule 该位置对应的课程实体
108 | * @param isThisWeek 该课程是否是本周上
109 | * @return
110 | */
111 | String getItemText(Schedule schedule, boolean isThisWeek);
112 |
113 | //当changeWeek()调用结束后回调该接口
114 | //你可以在这里对属性进行二次设置,从而使其符合需求
115 |
116 | /**
117 | * 课程项构建完成后回调.
118 | *
119 | * @param layout 课程项的帧布局
120 | * @param textView 课程项的内容区域
121 | * @param countTextView 课程项的角标
122 | * @param schedule 课程实体
123 | * @param gd 内容区域的背景是使用GradientDrawable来设置的,你可以二次设置
124 | */
125 | void onItemUpdate(FrameLayout layout, TextView textView, TextView countTextView,
126 | Schedule schedule, GradientDrawable gd);
127 | }
128 |
129 | /**
130 | * 侧边栏构建监听器
131 | */
132 | interface OnSlideBuildListener {
133 |
134 | /**
135 | * 构建每项
136 | *
137 | * @param pos 位置
138 | * @param inflater 转换器
139 | * @param itemHeight 课程项的高度
140 | * @param marTop 课程项的marTop值
141 | * @return 构建好的一个侧边项
142 | */
143 | View getView(int pos, LayoutInflater inflater, int itemHeight, int marTop);
144 |
145 | /**
146 | * 初始化方法
147 | * @param layout 日期栏容器
148 | * @param alpha 透明度
149 | */
150 | void onInit(LinearLayout layout,float alpha);
151 | }
152 |
153 | /**
154 | * 滚动布局构建监听器
155 | */
156 | interface OnScrollViewBuildListener {
157 | /**
158 | * 构建滚动布局时回调
159 | *
160 | * @param mInflate
161 | * @return
162 | */
163 | View getScrollView(LayoutInflater mInflate);
164 | }
165 |
166 | /**
167 | * 日期构造监听器
168 | */
169 | interface OnDateBuildListener {
170 |
171 | /**
172 | * 初始化方法
173 | * @param layout 日期栏容器
174 | * @param alpha 透明度
175 | */
176 | void onInit(LinearLayout layout,float alpha);
177 |
178 | /**
179 | * 获取View数组
180 | * 被废弃,自v2.0.3起该方法无效
181 | *
182 | * @param mInflate 转换器
183 | * @param monthWidth 月份宽度px
184 | * @param perWidth 日期每项宽度px
185 | * @param height 默认的日期栏高度
186 | * @return
187 | */
188 | View[] getDateViews(LayoutInflater mInflate, float monthWidth,float perWidth, int height);
189 |
190 | /**
191 | * 为日期栏设置高亮时回调
192 | */
193 | void onHighLight();
194 |
195 | /**
196 | * 更新日期时回调
197 | */
198 | void onUpdateDate(int curWeek,int targetWeek);
199 | }
200 |
201 | interface OnConfigHandleListener{
202 | void onParseConfig(String key, String value, TimetableView mView);
203 | }
204 | }
205 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/IWeekView.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 | /**
4 | * WeekView的相关接口.
5 | */
6 |
7 | public interface IWeekView {
8 |
9 | /**
10 | * WeekView的Item点击监听器
11 | */
12 | interface OnWeekItemClickedListener{
13 | /**
14 | * 当Item被点击时回调
15 | * @param week 选择的周次
16 | */
17 | void onWeekClicked(int week);
18 | }
19 |
20 | /**
21 | * WeekView的左侧(设置当前周)的点击监听器
22 | */
23 | interface OnWeekLeftClickedListener{
24 | /**
25 | * 当"设置当前周"按钮被点击时回调
26 | */
27 | void onWeekLeftClicked();
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/OnConfigHandleAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 | import com.zhuangfei.timetable.TimetableView;
4 |
5 | /**
6 | * Created by Liu ZhuangFei on 2018/12/21.
7 | */
8 | public class OnConfigHandleAdapter implements ISchedule.OnConfigHandleListener {
9 |
10 | @Override
11 | public void onParseConfig(String key, String value, TimetableView mView) {
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/OnDateBuildAapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 |
4 | import android.content.Context;
5 | import android.graphics.Color;
6 | import android.util.Log;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.widget.LinearLayout;
10 | import android.widget.TextView;
11 |
12 | import com.zhuangfei.android_timetableview.sample.R;
13 | import com.zhuangfei.timetable.model.ScheduleSupport;
14 | import com.zhuangfei.timetable.utils.ColorUtils;
15 |
16 | import java.text.SimpleDateFormat;
17 | import java.util.Calendar;
18 | import java.util.Date;
19 | import java.util.List;
20 |
21 | /**
22 | * 日期栏的构建过程.
23 | */
24 |
25 | public class OnDateBuildAapter implements ISchedule.OnDateBuildListener {
26 |
27 | private static final String TAG = "OnDateBuildAapter";
28 |
29 | //第一个:月份,之后7个表示周一至周日
30 | protected TextView[] textViews = new TextView[8];
31 | protected LinearLayout[] layouts = new LinearLayout[8];
32 |
33 | protected int background = Color.parseColor("#F4F8F8");
34 | protected float alpha = 1;
35 |
36 | protected String[] dateArray;
37 | protected List weekDates;
38 | protected LinearLayout layout;
39 |
40 | public OnDateBuildAapter setBackground(int background) {
41 | this.background = background;
42 | return this;
43 | }
44 |
45 | @Override
46 | public void onInit(LinearLayout layout, float alpha) {
47 | this.alpha = alpha;
48 | this.layout = layout;
49 | //星期设置
50 | dateArray = getStringArray();
51 | weekDates = ScheduleSupport.getWeekDate();
52 | int alphaColor = ColorUtils.alphaColor(background, alpha);
53 | if (layout != null) layout.setBackgroundColor(alphaColor);
54 | }
55 |
56 | @Override
57 | public View[] getDateViews(LayoutInflater mInflate, float monthWidth, float perWidth, int height) {
58 | View[] views = new View[8];
59 | views[0] = onBuildMonthLayout(mInflate, (int) monthWidth, height);
60 | for (int i = 1; i < 8; i++) {
61 | views[i] = onBuildDayLayout(mInflate, i, (int) perWidth, height);
62 | }
63 | return views;
64 | }
65 |
66 | @Override
67 | public void onHighLight() {
68 | initDateBackground();
69 |
70 | //获取周几,1->7
71 | Calendar now = Calendar.getInstance();
72 | //一周第一天是否为星期天
73 | boolean isFirstSunday = (now.getFirstDayOfWeek() == Calendar.SUNDAY);
74 | int weekDay = now.get(Calendar.DAY_OF_WEEK);
75 | //若一周第一天为星期天,则-1
76 | if (isFirstSunday) {
77 | weekDay = weekDay - 1;
78 | if (weekDay == 0) {
79 | weekDay = 7;
80 | }
81 | }
82 |
83 | activeDateBackground(weekDay);
84 | }
85 |
86 |
87 | @Override
88 | public void onUpdateDate(int curWeek, int targetWeek) {
89 | if (textViews == null || textViews.length < 8) return;
90 |
91 | weekDates = ScheduleSupport.getDateStringFromWeek(curWeek, targetWeek);
92 | int month = Integer.parseInt(weekDates.get(0));
93 | textViews[0].setText(month + "\n月");
94 | for (int i = 1; i < 8; i++) {
95 | if (textViews[i] != null) {
96 | textViews[i].setText(weekDates.get(i) + "日");
97 | }
98 | }
99 | }
100 |
101 | /**
102 | * 构建月份,也就是日期栏的第一格.
103 | * 宽度、高度均为px
104 | *
105 | * @param mInflate
106 | * @param width 宽度
107 | * @param height 默认高度
108 | * @return
109 | */
110 | protected View onBuildMonthLayout(LayoutInflater mInflate, int width, int height) {
111 | View first = mInflate.inflate(R.layout.item_dateview_first, null, false);
112 | //月份设置
113 | textViews[0] = first.findViewById(R.id.id_week_month);
114 | layouts[0] = null;
115 |
116 | LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, height);
117 |
118 | int month = Integer.parseInt(weekDates.get(0));
119 | first.setLayoutParams(lp);
120 | textViews[0].setText(month + "\n月");
121 | return first;
122 | }
123 |
124 | protected View onBuildDayLayout(LayoutInflater mInflate, int pos, int width, int height) {
125 | View v = mInflate.inflate(R.layout.item_dateview, null, false);
126 | TextView dayTextView = v.findViewById(R.id.id_week_day);
127 | dayTextView.setText(dateArray[pos]);
128 |
129 | textViews[pos] = v.findViewById(R.id.id_week_date);
130 | layouts[pos] = v.findViewById(R.id.id_week_layout);
131 |
132 | LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, height);
133 | layouts[pos].setLayoutParams(lp);
134 | textViews[pos].setText(weekDates.get(pos) + "日");
135 |
136 | return v;
137 | }
138 |
139 | /**
140 | * 返回一个长度为8的数组,第0个位置为null
141 | *
142 | * @return
143 | */
144 | public String[] getStringArray() {
145 | return new String[]{null, "周一", "周二", "周三", "周四", "周五", "周六", "周日"};
146 | }
147 |
148 | protected void initDateBackground() {
149 | for (int i = 1; i < 8; i++) {
150 | if (layouts[i] != null) layouts[i].setBackgroundColor(Color.TRANSPARENT);
151 | }
152 | }
153 |
154 | protected void activeDateBackground(int weekDay) {
155 | if (layouts.length > weekDay && layouts[weekDay] != null) {
156 | layouts[weekDay].setBackgroundColor(
157 | ColorUtils.alphaColor(Color.parseColor("#BFF6F4"), alpha));
158 | }
159 | }
160 | }
161 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/OnFlaglayoutClickAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 | /**
4 | * Created by Liu ZhuangFei on 2018/8/3.
5 | */
6 |
7 | public class OnFlaglayoutClickAdapter implements ISchedule.OnFlaglayoutClickListener {
8 | @Override
9 | public void onFlaglayoutClick(int day, int start) {
10 |
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/OnItemBuildAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 | import android.graphics.drawable.GradientDrawable;
4 | import android.text.TextUtils;
5 | import android.widget.FrameLayout;
6 | import android.widget.TextView;
7 |
8 | import com.zhuangfei.timetable.model.Schedule;
9 |
10 | /**
11 | * Item构建监听器的默认实现.
12 | */
13 |
14 | public class OnItemBuildAdapter implements ISchedule.OnItemBuildListener {
15 | @Override
16 | public String getItemText(Schedule schedule, boolean isThisWeek) {
17 | if (schedule == null || TextUtils.isEmpty(schedule.getName())) return "未命名";
18 | if (schedule.getRoom() == null) {
19 | if (!isThisWeek)
20 | return "[非本周]" + schedule.getName();
21 | return schedule.getName();
22 | }
23 |
24 | String r = schedule.getName() + "@" + schedule.getRoom();
25 | if (!isThisWeek) {
26 | r = "[非本周]" + r;
27 | }
28 | return r;
29 | }
30 |
31 | @Override
32 | public void onItemUpdate(FrameLayout layout, TextView textView, TextView countTextView, Schedule schedule, GradientDrawable gd) {
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/OnItemClickAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 | import android.util.Log;
4 | import android.view.View;
5 |
6 | import com.zhuangfei.timetable.model.Schedule;
7 |
8 | import java.util.List;
9 |
10 | /**
11 | * Item点击的默认实现.
12 | */
13 |
14 | public class OnItemClickAdapter implements ISchedule.OnItemClickListener {
15 | private static final String TAG = "OnItemClickAdapter";
16 | @Override
17 | public void onItemClick(View v, List scheduleList) {
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/OnItemLongClickAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 | import android.view.View;
4 |
5 | /**
6 | * Created by Liu ZhuangFei on 2018/8/3.
7 | */
8 |
9 | public class OnItemLongClickAdapter implements ISchedule.OnItemLongClickListener {
10 | @Override
11 | public void onLongClick(View v, int day, int start) {
12 |
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/OnScrollViewBuildAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 | import android.view.LayoutInflater;
4 | import android.view.View;
5 |
6 | import com.zhuangfei.android_timetableview.sample.R;
7 |
8 | /**
9 | * 滚动布局构建监听的默认实现
10 | */
11 |
12 | public class OnScrollViewBuildAdapter implements ISchedule.OnScrollViewBuildListener {
13 | @Override
14 | public View getScrollView(LayoutInflater mInflate) {
15 | return mInflate.inflate(R.layout.view_simplescrollview,null,false);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/listener/OnSlideBuildAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.listener;
2 |
3 | import android.graphics.Color;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.LinearLayout;
8 | import android.widget.TextView;
9 |
10 | import com.zhuangfei.android_timetableview.sample.R;
11 | import com.zhuangfei.timetable.utils.ColorUtils;
12 |
13 | /**
14 | * 控件实现的一个可以显示时间的侧边栏适配器
15 | * Created by Liu ZhuangFei on 2018/6/18.
16 | */
17 |
18 | public class OnSlideBuildAdapter implements ISchedule.OnSlideBuildListener {
19 |
20 | //时刻,每个元素保存每节课的开始时间
21 | protected String[] times;
22 |
23 | //节次文本的颜色、字号
24 | protected int textColor= Color.BLACK;
25 | protected float textSize=14;
26 |
27 | //时刻文本的颜色、字号
28 | protected float timeTextSize=12;
29 | protected int timeTextColor=Color.GRAY;
30 |
31 | //侧边栏背景色
32 | protected int background=Color.WHITE;
33 | protected float alpha=1;
34 |
35 | /**
36 | * 设置时刻数组
37 | * @param times
38 | * @return
39 | */
40 | public OnSlideBuildAdapter setTimes(String[] times) {
41 | this.times = times;
42 | return this;
43 | }
44 |
45 | public OnSlideBuildAdapter setBackground(int backgroundColor) {
46 | this.background=backgroundColor;
47 | return this;
48 | }
49 |
50 | /**
51 | * 获取时刻数组
52 | * @return
53 | */
54 | public String[] getTimes() {
55 | return times;
56 | }
57 |
58 |
59 | /**
60 | * 设置节次文本颜色
61 | * @param textColor 指定颜色
62 | * @return
63 | */
64 | public OnSlideBuildAdapter setTextColor(int textColor) {
65 | this.textColor = textColor;
66 | return this;
67 | }
68 |
69 | /**
70 | * 设置节次文本的大小
71 | * @param textSize 指定字号
72 | * @return
73 | */
74 | public OnSlideBuildAdapter setTextSize(float textSize) {
75 | this.textSize = textSize;
76 | return this;
77 | }
78 |
79 | /**
80 | * 设置节次时间的文本颜色
81 | * @param timeTextColor 颜色
82 | * @return
83 | */
84 | public OnSlideBuildAdapter setTimeTextColor(int timeTextColor) {
85 | this.timeTextColor = timeTextColor;
86 | return this;
87 | }
88 |
89 | /**
90 | * 设置节次时间的文本大小
91 | * @param timeTextSize 字号
92 | * @return
93 | */
94 | public OnSlideBuildAdapter setTimeTextSize(float timeTextSize) {
95 | this.timeTextSize = timeTextSize;
96 | return this;
97 | }
98 |
99 | @Override
100 | public View getView(int pos, LayoutInflater inflater, int itemHeight, int marTop) {
101 | View view=inflater.inflate(R.layout.item_slide_time,null,false);
102 | TextView numberTextView=view.findViewById(R.id.item_slide_number);
103 | TextView timeTextView=view.findViewById(R.id.item_slide_time);
104 | LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
105 | itemHeight);
106 | lp.setMargins(0,marTop,0,0);
107 | view.setLayoutParams(lp);
108 |
109 | numberTextView.setText((pos+1)+"");
110 | numberTextView.setTextSize(textSize);
111 | numberTextView.setTextColor(textColor);
112 |
113 | if(times==null) timeTextView.setText("");
114 | if(times!=null&&pos>=0&&pos
11 | * 1.增加了extras,可以保存一些自己需要的东西
12 | * @author Administrator 刘壮飞
13 | *
14 | */
15 | public class Schedule implements Serializable,Comparable{
16 |
17 | /**
18 | * 课程名
19 | */
20 | private String name="";
21 |
22 | /**
23 | * 教室
24 | */
25 | private String room="";
26 |
27 | /**
28 | * 教师
29 | */
30 | private String teacher="";
31 |
32 | /**
33 | * 第几周至第几周上
34 | */
35 | private List weekList=new ArrayList<>();
36 |
37 | /**
38 | * 开始上课的节次
39 | */
40 | private int start=0;
41 |
42 | /**
43 | * 上课节数
44 | */
45 | private int step=0;
46 |
47 | /**
48 | * 周几上
49 | */
50 | private int day=0;
51 |
52 | /**
53 | * 一个随机数,用于对应课程的颜色
54 | */
55 | private int colorRandom = 0;
56 |
57 | /**
58 | * 额外信息
59 | */
60 | private Map extras=new HashMap<>();
61 |
62 | public Schedule(String name, String room, String teacher,
63 | List weekList, int start, int step, int day,
64 | int colorRandom) {
65 | super();
66 | this.name = name;
67 | this.room = room;
68 | this.teacher = teacher;
69 | this.weekList = weekList;
70 | this.start = start;
71 | this.step = step;
72 | this.day = day;
73 | this.colorRandom = colorRandom;
74 | }
75 |
76 | public Map getExtras(){
77 | return extras;
78 | }
79 |
80 | public void setExtras(Map map){
81 | this.extras=map;
82 | }
83 |
84 | public void putExtras(String key,Object val){
85 | getExtras().put(key,val);
86 | }
87 |
88 |
89 | public String getName() {
90 | return name;
91 | }
92 |
93 | public void setName(String name) {
94 | this.name = name;
95 | }
96 |
97 | public String getRoom() {
98 | return room;
99 | }
100 |
101 | public void setRoom(String room) {
102 | this.room = room;
103 | }
104 |
105 | public String getTeacher() {
106 | return teacher;
107 | }
108 |
109 | public void setTeacher(String teacher) {
110 | this.teacher = teacher;
111 | }
112 |
113 | public void setWeekList(List weekList) {
114 | this.weekList = weekList;
115 | }
116 |
117 | public List getWeekList() {
118 | return weekList;
119 | }
120 |
121 | public int getStart() {
122 | return start;
123 | }
124 |
125 | public void setStart(int start) {
126 | this.start = start;
127 | }
128 |
129 | public int getStep() {
130 | return step;
131 | }
132 |
133 | public void setStep(int step) {
134 | this.step = step;
135 | }
136 |
137 | public int getDay() {
138 | return day;
139 | }
140 |
141 | public void setDay(int day) {
142 | this.day = day;
143 | }
144 |
145 | public int getColorRandom() {
146 | return colorRandom;
147 | }
148 |
149 | public void setColorRandom(int colorRandom) {
150 | this.colorRandom = colorRandom;
151 | }
152 |
153 | public Schedule() {
154 | super();
155 | }
156 |
157 | @Override
158 | public int compareTo(Schedule o) {
159 | if(getStart() mConfigMap;
24 | private Context context;
25 | private String configName="default_schedule_config";
26 |
27 | public ScheduleConfig(Context context){
28 | this.context=context;
29 | mConfigMap=new HashMap<>();
30 | }
31 |
32 | /**
33 | * 设置本地配置的名称
34 | * @param name 配置名称
35 | * @return ScheduleConfig
36 | */
37 | public ScheduleConfig setConfigName(String name){
38 | if(configName==null||name==null) return this;
39 | if(mConfigPreferences==null||!configName.equals(name)){
40 | configName=name;
41 | mConfigPreferences=context.getSharedPreferences(configName,Context.MODE_PRIVATE);
42 | mEditor=mConfigPreferences.edit();
43 | }
44 | return this;
45 | }
46 |
47 | /**
48 | * 设置配置处理器
49 | * @param mOnConfigHandleListener 配置处理器
50 | * @return ScheduleConfig
51 | */
52 | public ScheduleConfig setOnConfigHandleListener(ISchedule.OnConfigHandleListener mOnConfigHandleListener) {
53 | this.mOnConfigHandleListener = mOnConfigHandleListener;
54 | return this;
55 | }
56 |
57 | /**
58 | * 获取配置处理器
59 | * @return ISchedule.OnConfigHandleListener
60 | */
61 | public ISchedule.OnConfigHandleListener getOnConfigHandleListener() {
62 | return mOnConfigHandleListener;
63 | }
64 |
65 | /**
66 | * 将配置提交到缓存,需要使用commit()将其保存到本地
67 | * @param key 属性名
68 | * @param value 属性值
69 | * @return ScheduleConfig
70 | */
71 | public ScheduleConfig put(String key, String value){
72 | if(mConfigMap==null||value==null) return this;
73 | mConfigMap.put(key,value);
74 | return this;
75 | }
76 |
77 | /**
78 | * 从缓存中取出属性key的值
79 | * @param key 属性名
80 | * @return String
81 | */
82 | public String get(String key){
83 | if(mConfigMap==null) return null;
84 | return mConfigMap.get(key);
85 | }
86 |
87 | /**
88 | * 将指定的Map作为缓存
89 | * @param mConfigMap Map
90 | * @return ScheduleConfig
91 | */
92 | public ScheduleConfig setConfigMap(Map mConfigMap) {
93 | this.mConfigMap = mConfigMap;
94 | return this;
95 | }
96 |
97 | /**
98 | * 获取缓存的属性Map
99 | * @return
100 | */
101 | public Map getConfigMap() {
102 | return mConfigMap;
103 | }
104 |
105 | /**
106 | * 将缓存中的修改提交到本地
107 | */
108 | public void commit(){
109 | Set set=new HashSet<>();
110 | for(Map.Entry entry:mConfigMap.entrySet()){
111 | if(entry.getKey()==null||entry.getValue()==null) continue;
112 | set.add(entry.getKey().trim()+"="+entry.getValue().trim());
113 | }
114 | Set finalSet=mConfigPreferences.getStringSet("scheduleconfig_set",new HashSet());
115 | finalSet.addAll(set);
116 | mConfigMap.clear();
117 | mEditor.putStringSet("scheduleconfig_set",finalSet);
118 | mEditor.commit();
119 | }
120 |
121 | /**
122 | * 清除缓存和本地属性配置
123 | */
124 | public void clear(){
125 | mConfigMap.clear();
126 | mEditor.clear();
127 | mEditor.commit();
128 | }
129 |
130 | /**
131 | * 导出本地配置文件中的数据
132 | * @return set集合,每个元素都是一个配置,格式:key=value
133 | */
134 | public Set export(){
135 | Set finalSet=mConfigPreferences.getStringSet("scheduleconfig_set",new HashSet());
136 | return finalSet;
137 | }
138 |
139 | /**
140 | * 将集合配置导入到本地
141 | * @param data
142 | */
143 | public void load(Set data){
144 | Set finalSet=mConfigPreferences.getStringSet("scheduleconfig_set",new HashSet());
145 | finalSet.addAll(data);
146 | mConfigMap.clear();
147 | mEditor.putStringSet("scheduleconfig_set",finalSet);
148 | mEditor.commit();
149 | }
150 |
151 | /**
152 | * 设置TimetableView的属性,使配置生效
153 | * @param view TimetableView
154 | */
155 | public void use(TimetableView view){
156 | if(getConfigMap()==null||getOnConfigHandleListener()==null) return;
157 | Set keySet=mConfigPreferences.getStringSet("scheduleconfig_set",new HashSet());
158 | String[] configArray=null;
159 | for(String str:keySet){
160 | if(!TextUtils.isEmpty(str)&&str.indexOf("=")!=-1){
161 | str=str.trim();
162 | configArray=str.split("=");
163 | if(configArray.length==2){
164 | getOnConfigHandleListener().onParseConfig(configArray[0],configArray[1],view);
165 | }
166 | }
167 | }
168 | }
169 | }
170 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/model/ScheduleEnable.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.model;
2 |
3 | /**
4 | * 该接口定义数据转换的规范,
5 | * 用户自定义课程实体类需要实现该接口以及实现其中的转换方法,
6 | * 在设置数据源时可以使用自定义的课程实体,但是必须实现该接口
7 | */
8 |
9 | public interface ScheduleEnable {
10 |
11 | /**
12 | * 获取Schedule
13 | * @return
14 | */
15 | Schedule getSchedule();
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/model/WeekViewEnable.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.model;
2 |
3 | import java.util.List;
4 |
5 | /**
6 | * 如果需要自定义周次选择栏,请实现该接口,
7 | * 它仅仅提供一个规范,可用可不用
8 | * Created by Liu ZhuangFei on 2018/7/28.
9 | */
10 |
11 | public interface WeekViewEnable {
12 | /**
13 | * 设置当前周
14 | * @param curWeek
15 | * @return
16 | */
17 | T curWeek(int curWeek);
18 |
19 | /**
20 | * 设置项数
21 | * @param count
22 | * @return
23 | */
24 | T itemCount(int count);
25 |
26 | /**
27 | * 获取项数
28 | * @return
29 | */
30 | int itemCount();
31 |
32 | /**
33 | * 设置数据源
34 | * @param list
35 | * @return
36 | */
37 | T source(List extends ScheduleEnable> list);
38 |
39 | /**
40 | * 设置数据源
41 | * @param scheduleList
42 | * @return
43 | */
44 | public T data(List scheduleList);
45 |
46 | /**
47 | * 获取数据源
48 | * @return
49 | */
50 | List dataSource();
51 |
52 | /**
53 | * 初次构建时调用,显示周次选择布局
54 | */
55 | T showView();
56 |
57 | /**
58 | * 当前周被改变后可以调用该方式修正一下底部的文本
59 | * @return
60 | */
61 | T updateView();
62 |
63 | /**
64 | * 设置控件的可见性
65 | * @param isShow true:显示,false:隐藏
66 | */
67 | T isShow(boolean isShow);
68 |
69 | /**
70 | * 判断该控件是否显示
71 | * @return
72 | */
73 | boolean isShowing();
74 | }
75 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/model/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 该包存放与Schedule有关的模型类
3 | */
4 | package com.zhuangfei.timetable.model;
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/operater/AbsOperater.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.operater;
2 |
3 | import android.content.Context;
4 | import android.util.AttributeSet;
5 | import android.widget.LinearLayout;
6 |
7 | import com.zhuangfei.timetable.TimetableView;
8 |
9 | /**
10 | * 抽象的业务逻辑
11 | * Created by Liu ZhuangFei on 2018/9/2.
12 | */
13 | public abstract class AbsOperater {
14 | public void init(Context context, AttributeSet attrs, TimetableView view){};
15 |
16 | public void showView(){};
17 |
18 | public void updateDateView(){};
19 |
20 | public void updateSlideView(){};
21 |
22 | public void changeWeek(int week, boolean isCurWeek){};
23 |
24 | public LinearLayout getFlagLayout(){return null;};
25 |
26 | public LinearLayout getDateLayout(){return null;};
27 |
28 | public void setWeekendsVisiable(boolean isShow){};
29 | }
30 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/operater/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 该包存放与ScheduleOperater有关的类
3 | */
4 | package com.zhuangfei.timetable.operater;
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * TimetableView是课表控件,主要是操作该对象进而完成对属性设置以及对视图的创建、更新
3 | */
4 | package com.zhuangfei.timetable;
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/utils/ColorUtils.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.utils;
2 |
3 | import android.graphics.Color;
4 |
5 | /**
6 | * Created by Liu ZhuangFei on 2018/7/25.
7 | */
8 |
9 | public class ColorUtils {
10 |
11 | /**
12 | * 合成指定颜色、指定不透明度的颜色,
13 | * 0:完全透明,1:不透明
14 | * @param color
15 | * @param alpha 0:完全透明,1:不透明
16 | * @return
17 | */
18 | public static int alphaColor(int color,float alpha){
19 | int a = Math.min(255, Math.max(0, (int) (alpha * 255))) << 24;
20 | int rgb = 0x00ffffff & color;
21 | return a + rgb;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/utils/ScreenUtils.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.timetable.utils;
2 |
3 | import android.content.Context;
4 |
5 | /**
6 | * 尺寸工具类
7 | */
8 | public class ScreenUtils {
9 |
10 | /**
11 | * 获取屏幕的高度Px
12 | * @param context
13 | * @return
14 | */
15 | public static final int getHeightInPx(Context context) {
16 | final int height = context.getResources().getDisplayMetrics().heightPixels;
17 | return height;
18 | }
19 |
20 | /**
21 | * 获取屏幕的宽度Px
22 | * @param context
23 | * @return
24 | */
25 | public static final int getWidthInPx(Context context) {
26 | final int width = context.getResources().getDisplayMetrics().widthPixels;
27 | return width;
28 | }
29 |
30 | /**
31 | * 获取屏幕的高度Dp
32 | * @param context
33 | * @return
34 | */
35 | public static final int getHeightInDp(Context context) {
36 | final float height = context.getResources().getDisplayMetrics().heightPixels;
37 | int heightInDp = px2dip(context, height);
38 | return heightInDp;
39 | }
40 |
41 | /**
42 | * 获取屏幕的宽度Dp
43 | * @param context
44 | * @return
45 | */
46 | public static final int getWidthInDp(Context context) {
47 | final float width = context.getResources().getDisplayMetrics().widthPixels;
48 | int widthInDp = px2dip(context, width);
49 | return widthInDp;
50 | }
51 |
52 | /**
53 | * dp转换为px
54 | * @param context 上下文
55 | * @param dpValue dp
56 | * @return px
57 | */
58 | public static int dip2px(Context context, float dpValue) {
59 | final float scale = context.getResources().getDisplayMetrics().density;
60 | return (int) (dpValue * scale + 0.5f);
61 | }
62 |
63 | /**
64 | * px转换为dp
65 | * @param context 上下文
66 | * @param pxValue px
67 | * @return dp
68 | */
69 | public static int px2dip(Context context, float pxValue) {
70 | final float scale = context.getResources().getDisplayMetrics().density;
71 | return (int) (pxValue / scale + 0.5f);
72 | }
73 |
74 | }
75 |
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/utils/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 该包存放一些全局的工具方法
3 | */
4 | package com.zhuangfei.timetable.utils;
--------------------------------------------------------------------------------
/AndroidTimetableView/TimetableView/src/com/zhuangfei/timetable/view/package-info.java:
--------------------------------------------------------------------------------
1 | /**
2 | * 该包存放控件实现的自定义View
3 | */
4 | package com.zhuangfei.timetable.view;
--------------------------------------------------------------------------------
/AndroidTimetableView/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'com.android.application'
2 |
3 | apply plugin: 'kotlin-android'
4 |
5 | apply plugin: 'kotlin-android-extensions'
6 |
7 | android {
8 | signingConfigs {
9 |
10 | }
11 | compileSdkVersion 26
12 | defaultConfig {
13 | applicationId "com.zhuangfei.android_timetableview"
14 | minSdkVersion 15
15 | targetSdkVersion 26
16 | versionCode 1
17 | versionName "1.0"
18 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
19 |
20 | //添加以下一行
21 | }
22 | buildTypes {
23 | release {
24 | //混淆
25 | minifyEnabled false
26 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
27 | }
28 | }
29 | buildToolsVersion '26.0.2'
30 | compileOptions {
31 | sourceCompatibility JavaVersion.VERSION_1_7
32 | targetCompatibility JavaVersion.VERSION_1_7
33 | }
34 | }
35 |
36 | dependencies {
37 | implementation fileTree(include: ['*.jar'], dir: 'libs')
38 | implementation 'com.android.support:appcompat-v7:26.1.0'
39 | implementation 'com.android.support.constraint:constraint-layout:1.0.2'
40 | implementation 'com.android.support:support-v4:26.1.0'
41 | testImplementation 'junit:junit:4.12'
42 | androidTestImplementation 'com.android.support.test:runner:1.0.1'
43 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
44 | implementation project(':TimetableView')
45 |
46 | debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.3'
47 | releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
48 |
49 | implementation 'com.github.bumptech.glide:glide:3.7.0'
50 | }
51 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
23 | #--------------------------1.实体类---------------------------------
24 | # 如果使用了Gson之类的工具要使被它解析的JavaBean类即实体类不被混淆。(这里填写自己项目中存放bean对象的具体路径)
25 |
26 |
27 | #--------------------------2.第三方包-------------------------------
28 |
29 |
30 | #-------------------------3.与js互相调用的类------------------------
31 |
32 |
33 | #-------------------------4.反射相关的类和方法----------------------
34 |
35 |
36 | #-------------------------5.基本不用动区域--------------------------
37 | #指定代码的压缩级别
38 | -optimizationpasses 5
39 |
40 | #包明不混合大小写
41 | -dontusemixedcaseclassnames
42 |
43 | #不去忽略非公共的库类
44 | -dontskipnonpubliclibraryclasses
45 | -dontskipnonpubliclibraryclassmembers
46 |
47 | #混淆时是否记录日志
48 | -verbose
49 |
50 | #优化 不优化输入的类文件
51 | -dontoptimize
52 |
53 | #预校验
54 | -dontpreverify
55 |
56 | # 保留sdk系统自带的一些内容 【例如:-keepattributes *Annotation* 会保留Activity的被@override注释的onCreate、onDestroy方法等】
57 | -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
58 |
59 | # 记录生成的日志数据,gradle build时在本项根目录输出
60 | # apk 包内所有 class 的内部结构
61 | -dump proguard/class_files.txt
62 | # 未混淆的类和成员
63 | -printseeds proguard/seeds.txt
64 | # 列出从 apk 中删除的代码
65 | -printusage proguard/unused.txt
66 | # 混淆前后的映射
67 | -printmapping proguard/mapping.txt
68 |
69 |
70 | # 避免混淆泛型
71 | -keepattributes Signature
72 | # 抛出异常时保留代码行号,保持源文件以及行号
73 | -keepattributes SourceFile,LineNumberTable
74 |
75 | #-----------------------------6.默认保留区-----------------------
76 | # 保持 native 方法不被混淆
77 | -keepclasseswithmembernames class * {
78 | native ;
79 | }
80 |
81 | -keepclassmembers public class * extends android.view.View {
82 | public (android.content.Context);
83 | public (android.content.Context, android.util.AttributeSet);
84 | public (android.content.Context, android.util.AttributeSet, int);
85 | public void set*(***);
86 | }
87 |
88 | #保持 Serializable 不被混淆
89 | -keepclassmembers class * implements java.io.Serializable {
90 | static final long serialVersionUID;
91 | private static final java.io.ObjectStreamField[] serialPersistentFields;
92 | !static !transient ;
93 | !private ;
94 | !private ;
95 | private void writeObject(java.io.ObjectOutputStream);
96 | private void readObject(java.io.ObjectInputStream);
97 | java.lang.Object writeReplace();
98 | java.lang.Object readResolve();
99 | }
100 |
101 | # 保持自定义控件类不被混淆
102 | -keepclasseswithmembers class * {
103 | public (android.content.Context,android.util.AttributeSet);
104 | }
105 | # 保持自定义控件类不被混淆
106 | -keepclasseswithmembers class * {
107 | public (android.content.Context,android.util.AttributeSet,int);
108 | }
109 | # 保持自定义控件类不被混淆
110 | -keepclassmembers class * extends android.app.Activity {
111 | public void *(android.view.View);
112 | }
113 |
114 | # 保持枚举 enum 类不被混淆
115 | -keepclassmembers enum * {
116 | public static **[] values();
117 | public static ** valueOf(java.lang.String);
118 | }
119 |
120 | # 保持 Parcelable 不被混淆
121 | -keep class * implements android.os.Parcelable {
122 | public static final android.os.Parcelable$Creator *;
123 | }
124 |
125 | # 不混淆R文件中的所有静态字段,我们都知道R文件是通过字段来记录每个资源的id的,字段名要是被混淆了,id也就找不着了。
126 | -keepclassmembers class **.R$* {
127 | public static ;
128 | }
129 |
130 | #如果引用了v4或者v7包
131 | -dontwarn android.support.**
132 |
133 | # 保持哪些类不被混淆
134 | -keep public class * extends android.app.Appliction
135 | -keep public class * extends android.app.Activity
136 | -keep public class * extends android.app.Fragment
137 | -keep public class * extends android.app.Service
138 | -keep public class * extends android.content.BroadcastReceiver
139 | -keep public class * extends android.content.ContentProvider
140 | -keep public class * extends android.preference.Preference
141 |
142 |
143 | # ============忽略警告,否则打包可能会不成功=============
144 | -ignorewarnings
145 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/release/app-release.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/release/app-release.apk
--------------------------------------------------------------------------------
/AndroidTimetableView/app/release/output.json:
--------------------------------------------------------------------------------
1 | [{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1},"path":"app-release.apk","properties":{"packageId":"com.zhuangfei.android_timetableview","split":"","minSdkVersion":"15"}}]
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/androidTest/java/com/zhuangfei/android_timetableview/ExampleInstrumentedTest.kt:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview
2 |
3 | import android.support.test.InstrumentationRegistry
4 | import android.support.test.runner.AndroidJUnit4
5 |
6 | import org.junit.Test
7 | import org.junit.runner.RunWith
8 |
9 | import org.junit.Assert.*
10 |
11 | /**
12 | * Instrumented test, which will execute on an Android device.
13 | *
14 | * See [testing documentation](http://d.android.com/tools/testing).
15 | */
16 | @RunWith(AndroidJUnit4::class)
17 | class ExampleInstrumentedTest {
18 | @Test
19 | fun useAppContext() {
20 | // Context of the app under test.
21 | val appContext = InstrumentationRegistry.getTargetContext()
22 | assertEquals("com.zhuangfei.android_timetableview", appContext.packageName)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/App.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview;
2 |
3 | import android.app.Application;
4 |
5 | import com.squareup.leakcanary.LeakCanary;
6 |
7 | /**
8 | * Created by Liu ZhuangFei on 2018/7/28.
9 | */
10 |
11 | public class App extends Application {
12 | @Override
13 | public void onCreate() {
14 | super.onCreate();
15 | //内存泄漏检测
16 | // LeakCanary.install(this);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview;
2 |
3 | import android.content.Intent;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.os.Bundle;
6 | import android.view.View;
7 | import android.widget.Button;
8 |
9 | import com.zhuangfei.android_timetableview.views.AttrActivity;
10 | import com.zhuangfei.android_timetableview.views.BaseFuncActivity;
11 | import com.zhuangfei.android_timetableview.views.ColorPoolActivity;
12 | import com.zhuangfei.android_timetableview.views.CustomWidthActivity;
13 | import com.zhuangfei.android_timetableview.views.DateActivity;
14 | import com.zhuangfei.android_timetableview.views.DateDelayActivity;
15 | import com.zhuangfei.android_timetableview.views.ElasticActivity;
16 | import com.zhuangfei.android_timetableview.views.ExtrasActivity;
17 | import com.zhuangfei.android_timetableview.views.FlaglayoutActivity;
18 | import com.zhuangfei.android_timetableview.views.ItemStyleActivity;
19 | import com.zhuangfei.android_timetableview.views.LocalConfigActivity;
20 | import com.zhuangfei.android_timetableview.views.NonViewActivity;
21 | import com.zhuangfei.android_timetableview.views.SimpleActivity;
22 | import com.zhuangfei.android_timetableview.views.SlideActivity;
23 | import com.zhuangfei.android_timetableview.template.wakeup.WakeupActivity;
24 |
25 | public class MainActivity extends AppCompatActivity implements View.OnClickListener{
26 |
27 | @Override
28 | protected void onCreate(Bundle savedInstanceState) {
29 | super.onCreate(savedInstanceState);
30 | setContentView(R.layout.activity_main);
31 | initView();
32 | }
33 |
34 | private void initView() {
35 | Button button0=findViewById(R.id.id_btn0);
36 | Button button1=findViewById(R.id.id_btn1);
37 | Button button2=findViewById(R.id.id_btn2);
38 | Button button3=findViewById(R.id.id_btn3);
39 | Button button4=findViewById(R.id.id_btn4);
40 | Button button5=findViewById(R.id.id_btn5);
41 | Button button6=findViewById(R.id.id_btn6);
42 | Button button7=findViewById(R.id.id_btn7);
43 | Button button8=findViewById(R.id.id_btn8);
44 | Button button9=findViewById(R.id.id_btn9);
45 | Button button10=findViewById(R.id.id_btn10);
46 | Button button11=findViewById(R.id.id_btn11);
47 | Button button12=findViewById(R.id.id_btn12);
48 | Button button13=findViewById(R.id.id_btn13);
49 |
50 | button0.setOnClickListener(this);
51 | button1.setOnClickListener(this);
52 | button2.setOnClickListener(this);
53 | button3.setOnClickListener(this);
54 | button4.setOnClickListener(this);
55 | button5.setOnClickListener(this);
56 | button6.setOnClickListener(this);
57 | button7.setOnClickListener(this);
58 | button8.setOnClickListener(this);
59 | button9.setOnClickListener(this);
60 | button10.setOnClickListener(this);
61 | button11.setOnClickListener(this);
62 | button12.setOnClickListener(this);
63 | button13.setOnClickListener(this);
64 | }
65 |
66 | public void toTarget(Class cla){
67 | Intent intent=new Intent(this,cla);
68 | startActivity(intent);
69 | }
70 |
71 | @Override
72 | public void onClick(View view) {
73 | switch (view.getId()){
74 | case R.id.id_btn0:
75 | toTarget(SimpleActivity.class);
76 | break;
77 | case R.id.id_btn1:
78 | toTarget(BaseFuncActivity.class);
79 | break;
80 | case R.id.id_btn2:
81 | toTarget(AttrActivity.class);
82 | break;
83 | case R.id.id_btn3:
84 | toTarget(ColorPoolActivity.class);
85 | break;
86 | case R.id.id_btn4:
87 | toTarget(ItemStyleActivity.class);
88 | break;
89 | case R.id.id_btn5:
90 | toTarget(ElasticActivity.class);
91 | break;
92 | case R.id.id_btn6:
93 | toTarget(SlideActivity.class);
94 | break;
95 | case R.id.id_btn7:
96 | toTarget(DateActivity.class);
97 | break;
98 | case R.id.id_btn8:
99 | toTarget(NonViewActivity.class);
100 | break;
101 | case R.id.id_btn9:
102 | toTarget(ExtrasActivity.class);
103 | break;
104 | case R.id.id_btn10:
105 | toTarget(FlaglayoutActivity.class);
106 | break;
107 | case R.id.id_btn11:
108 | toTarget(DateDelayActivity.class);
109 | break;
110 | case R.id.id_btn12:
111 | toTarget(CustomWidthActivity.class);
112 | break;
113 | case R.id.id_btn13:
114 | toTarget(LocalConfigActivity.class);
115 | break;
116 |
117 | }
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/adapter/NonViewAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.adapter;
2 |
3 | import android.content.Context;
4 | import android.view.LayoutInflater;
5 | import android.view.View;
6 | import android.view.ViewGroup;
7 | import android.widget.BaseAdapter;
8 | import android.widget.ImageView;
9 | import android.widget.ListView;
10 | import android.widget.TextView;
11 |
12 | import com.zhuangfei.android_timetableview.R;
13 | import com.zhuangfei.timetable.model.Schedule;
14 | import com.zhuangfei.timetable.model.ScheduleColorPool;
15 |
16 | import java.util.List;
17 |
18 | /**
19 | * Created by Liu ZhuangFei on 2018/6/18.
20 | */
21 |
22 | public class NonViewAdapter extends BaseAdapter {
23 |
24 | List schedules;
25 | Context context;
26 | LayoutInflater inflater;
27 |
28 | public NonViewAdapter(Context context, List schedules) {
29 | this.context = context;
30 | this.schedules = schedules;
31 | inflater = LayoutInflater.from(context);
32 | }
33 |
34 | @Override
35 | public int getCount() {
36 | return schedules.size();
37 | }
38 |
39 | @Override
40 | public Object getItem(int i) {
41 | return schedules.get(i);
42 | }
43 |
44 | @Override
45 | public long getItemId(int i) {
46 | return i;
47 | }
48 |
49 | @Override
50 | public View getView(int i, View convertView, ViewGroup viewGroup) {
51 | View mView = null;
52 | ViewHolder holder;
53 | if (null == convertView) {
54 | holder = new ViewHolder();
55 | convertView = inflater.inflate(R.layout.item_nonview, null);
56 | holder.nameTextView = convertView.findViewById(R.id.id_nonview_name);
57 | holder.colorTextView = convertView.findViewById(R.id.id_nonview_color);
58 | convertView.setTag(holder);
59 | } else {
60 | holder = (ViewHolder) convertView.getTag();
61 | }
62 |
63 | Schedule schedule= (Schedule) getItem(i);
64 | ScheduleColorPool colorPool=new ScheduleColorPool(context);
65 | holder.nameTextView.setText(schedule.getName());
66 | holder.colorTextView.setBackgroundColor(colorPool.getColorAuto(schedule.getColorRandom()));
67 | return convertView;
68 | }
69 |
70 | class ViewHolder {
71 | TextView nameTextView;
72 | TextView colorTextView;
73 | }
74 | }
75 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/adapter/OnDateDelayAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.adapter;
2 |
3 | import android.text.TextUtils;
4 | import android.widget.LinearLayout;
5 | import com.zhuangfei.timetable.listener.OnDateBuildAapter;
6 | import com.zhuangfei.timetable.model.ScheduleSupport;
7 |
8 | import java.text.SimpleDateFormat;
9 | import java.util.List;
10 |
11 | /**
12 | * 自定义日期栏
13 | * Created by Liu ZhuangFei on 2018/8/24.
14 | */
15 | public class OnDateDelayAdapter extends OnDateBuildAapter {
16 |
17 | /**
18 | * 阈值,即超过这个时间戳后开始更新日期
19 | * 否则将一直显示initDates中的日期
20 | */
21 | protected long startTime;
22 | protected String startTimeStr;
23 |
24 | protected SimpleDateFormat sdf;
25 |
26 | /**
27 | * 日期集合,8个元素,当前时间小于等于阈值时使用
28 | */
29 | List initDates=null;
30 |
31 | public OnDateDelayAdapter(){
32 | sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");
33 | }
34 |
35 | /**
36 | * 设置日期集合
37 | * @param dates 元素个数必须大于等于8,第一个为月份数值,第2-8为周一至周日的日期数值(不带中文)
38 | */
39 | public void setDateList(List dates){
40 | if(dates.size()>=8){
41 | this.initDates=dates;
42 | }
43 | }
44 |
45 | public void setStartTime(long startTime) {
46 | this.startTime = startTime;
47 | this.startTimeStr=sdf.format(startTime);
48 | }
49 |
50 | @Override
51 | public void onInit(LinearLayout layout, float alpha) {
52 | super.onInit(layout, alpha);
53 |
54 | //增加的
55 | long curTime=System.currentTimeMillis();
56 | if(curTime<=startTime){
57 | weekDates=initDates;
58 | }
59 | }
60 |
61 | @Override
62 | public void onUpdateDate(int curWeek,int targetWeek) {
63 | if (textViews == null || textViews.length < 8) return;
64 |
65 | if(whenBeginSchool()<=0){
66 | weekDates = ScheduleSupport.getDateStringFromWeek(curWeek,targetWeek);
67 | }
68 |
69 | int month = Integer.parseInt(weekDates.get(0));
70 | textViews[0].setText(month + "\n月");
71 | for (int i = 1; i < 8; i++) {
72 | if(textViews[i]!=null){
73 | textViews[i].setText(weekDates.get(i) + "日");
74 | }
75 | }
76 | }
77 |
78 | //这段代码可以禁止在开学前自动更新日期栏上的星期高亮
79 | //它会使用开学那天的星期作为高亮
80 | //你可以根据自己的需求使用
81 | // @Override
82 | // public void onHighLight() {
83 | // if(whenBeginSchool()<=0){
84 | // super.onHighLight();
85 | // return;
86 | // }
87 | //
88 | // initDateBackground();
89 | // //获取周几,1->7
90 | // Calendar calendar = Calendar.getInstance();
91 | // calendar.setTime(new Date(startTime));
92 | // //一周第一天是否为星期天
93 | // boolean isFirstSunday = (calendar.getFirstDayOfWeek() == Calendar.SUNDAY);
94 | // int weekDay = calendar.get(Calendar.DAY_OF_WEEK);
95 | // //若一周第一天为星期天,则-1
96 | // if (isFirstSunday) {
97 | // weekDay = weekDay - 1;
98 | // if (weekDay == 0) {
99 | // weekDay = 7;
100 | // }
101 | // }
102 | // activeDateBackground(weekDay);
103 | // }
104 | //
105 | // private void activeDateBackground(int weekDay) {
106 | // layouts[weekDay].setBackgroundColor(
107 | // ColorUtils.alphaColor(Color.parseColor("#BFF6F4"), alpha));
108 | // }
109 |
110 | /**
111 | * 计算距离开学的天数
112 | *
113 | * @return 返回值2种类型,-1:没有开学时间,无法计算;0:已经开学;>0:天数
114 | */
115 | public long whenBeginSchool(){
116 | if(!TextUtils.isEmpty(startTimeStr)){
117 | int calWeek= ScheduleSupport.timeTransfrom(startTimeStr);
118 | if(calWeek>0){//开学
119 | return 0;
120 | }else {
121 | long seconds=(startTime-System.currentTimeMillis())/1000;
122 | long day = seconds / (24 * 3600);
123 | return day;
124 | }
125 | }
126 | return -1;
127 | }
128 | }
129 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/config/OnMyConfigHandleAdapter.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.config;
2 |
3 | import android.graphics.Color;
4 | import android.support.annotation.NonNull;
5 |
6 | import com.zhuangfei.timetable.TimetableView;
7 | import com.zhuangfei.timetable.listener.ISchedule;
8 |
9 | /**
10 | * Created by Liu ZhuangFei on 2018/12/22.
11 | */
12 | public class OnMyConfigHandleAdapter implements ISchedule.OnConfigHandleListener {
13 |
14 | public static final String CONFIG_SHOW_WEEKENDS="config_show_weekends";
15 | public static final String CONFIG_SHOW_NOT_CUR_WEEK="config_show_not_this_week";
16 | public static final String CONFIG_USERLESSS_COLOR="config_useless_color";
17 |
18 | public static final String VALUE_TRUE="config_value_true";
19 | public static final String VALUE_FALSE="config_value_false";
20 |
21 | @Override
22 | public void onParseConfig(String key, String value, TimetableView mView) {
23 | if(mView==null||key==null||value== null) return;
24 | switch (key){
25 | case CONFIG_SHOW_WEEKENDS:
26 | if(value.equals(VALUE_TRUE)) mView.isShowWeekends(true);
27 | else mView.isShowWeekends(false);
28 | break;
29 | case CONFIG_SHOW_NOT_CUR_WEEK:
30 | if(value.equals(VALUE_TRUE)) mView.isShowNotCurWeek(true);
31 | else mView.isShowNotCurWeek(false);
32 | break;
33 | case CONFIG_USERLESSS_COLOR:
34 | mView.colorPool().setUselessColor(Color.parseColor(value));
35 | break;
36 |
37 | default:break;
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/custom/CustomOperater.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.custom;
2 |
3 | import android.content.Context;
4 | import android.content.res.TypedArray;
5 | import android.graphics.Color;
6 | import android.graphics.drawable.GradientDrawable;
7 | import android.util.AttributeSet;
8 | import android.util.Log;
9 | import android.view.LayoutInflater;
10 | import android.view.MotionEvent;
11 | import android.view.View;
12 | import android.widget.FrameLayout;
13 | import android.widget.LinearLayout;
14 | import android.widget.TextView;
15 |
16 | import com.zhuangfei.android_timetableview.sample.R;
17 | import com.zhuangfei.timetable.TimetableView;
18 | import com.zhuangfei.timetable.listener.ISchedule;
19 | import com.zhuangfei.timetable.model.Schedule;
20 | import com.zhuangfei.timetable.model.ScheduleSupport;
21 | import com.zhuangfei.timetable.operater.AbsOperater;
22 | import com.zhuangfei.timetable.operater.SimpleOperater;
23 | import com.zhuangfei.timetable.utils.ScreenUtils;
24 |
25 | import java.util.ArrayList;
26 | import java.util.List;
27 |
28 | /**
29 | * 自定义的课表业务操作者,以实现列宽设置。
30 | *
31 | * @version 2.0.6
32 | * Created by Liu ZhuangFei on 2018/9/1.
33 | */
34 | public class CustomOperater extends SimpleOperater{
35 | private static final String TAG = "CustomOperater";
36 | private float[] weights;//宽度权重
37 |
38 | public CustomOperater(){
39 | weights=new float[7];
40 | for(int i=0;i weekList;
42 |
43 | /**
44 | * 开始上课的节次
45 | */
46 | private int start;
47 |
48 | /**
49 | * 上课节数
50 | */
51 | private int step;
52 |
53 | /**
54 | * 周几上
55 | */
56 | private int day;
57 |
58 | private String term;
59 |
60 | /**
61 | * 一个随机数,用于对应课程的颜色
62 | */
63 | private int colorRandom = 0;
64 |
65 | private String url;
66 |
67 | public void setUrl(String url) {
68 | this.url = url;
69 | }
70 |
71 | public String getUrl() {
72 | return url;
73 | }
74 |
75 | public MySubject() {
76 | // TODO Auto-generated constructor stub
77 | }
78 |
79 | public void setTime(String time) {
80 | this.time = time;
81 | }
82 |
83 | public String getTime() {
84 | return time;
85 | }
86 |
87 | public void setTerm(String term) {
88 | this.term = term;
89 | }
90 |
91 | public String getTerm() {
92 | return term;
93 | }
94 |
95 | public MySubject(String term,String name, String room, String teacher, List weekList, int start, int step, int day, int colorRandom,String time) {
96 | super();
97 | this.term=term;
98 | this.name = name;
99 | this.room = room;
100 | this.teacher = teacher;
101 | this.weekList=weekList;
102 | this.start = start;
103 | this.step = step;
104 | this.day = day;
105 | this.colorRandom = colorRandom;
106 | this.time=time;
107 | }
108 |
109 | public String getName() {
110 | return name;
111 | }
112 |
113 | public void setName(String name) {
114 | this.name = name;
115 | }
116 |
117 | public String getRoom() {
118 | return room;
119 | }
120 |
121 | public void setRoom(String room) {
122 | this.room = room;
123 | }
124 |
125 | public String getTeacher() {
126 | return teacher;
127 | }
128 |
129 | public void setTeacher(String teacher) {
130 | this.teacher = teacher;
131 | }
132 |
133 | public void setWeekList(List weekList) {
134 | this.weekList = weekList;
135 | }
136 |
137 | public List getWeekList() {
138 | return weekList;
139 | }
140 |
141 | public int getStart() {
142 | return start;
143 | }
144 |
145 | public void setStart(int start) {
146 | this.start = start;
147 | }
148 |
149 | public int getStep() {
150 | return step;
151 | }
152 |
153 | public void setStep(int step) {
154 | this.step = step;
155 | }
156 |
157 | public int getDay() {
158 | return day;
159 | }
160 |
161 | public void setDay(int day) {
162 | this.day = day;
163 | }
164 |
165 | public int getColorRandom() {
166 | return colorRandom;
167 | }
168 |
169 | public void setColorRandom(int colorRandom) {
170 | this.colorRandom = colorRandom;
171 | }
172 |
173 | @Override
174 | public Schedule getSchedule() {
175 | Schedule schedule=new Schedule();
176 | schedule.setDay(getDay());
177 | schedule.setName(getName());
178 | schedule.setRoom(getRoom());
179 | schedule.setStart(getStart());
180 | schedule.setStep(getStep());
181 | schedule.setTeacher(getTeacher());
182 | schedule.setWeekList(getWeekList());
183 | schedule.setColorRandom(2);
184 | schedule.putExtras(EXTRAS_ID,getId());
185 | schedule.putExtras(EXTRAS_AD_URL,getUrl());
186 | return schedule;
187 | }
188 |
189 | public void setId(int id) {
190 | this.id = id;
191 | }
192 |
193 | public int getId() {
194 | return id;
195 | }
196 | }
197 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/model/SubjectExtras.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.model;
2 |
3 | import com.zhuangfei.timetable.model.Schedule;
4 | import com.zhuangfei.timetable.model.ScheduleEnable;
5 |
6 | import java.util.List;
7 |
8 | /**
9 | * 自定义实体类需要实现ScheduleEnable接口并实现getSchedule()
10 | *
11 | * @see ScheduleEnable#getSchedule()
12 | */
13 | public class SubjectExtras implements ScheduleEnable {
14 |
15 | public static final String EXTRAS_ID="extras_id";
16 |
17 | private int id;
18 |
19 | /**
20 | * 课程名
21 | */
22 | private String name;
23 |
24 | private String time;
25 |
26 | /**
27 | * 教室
28 | */
29 | private String room;
30 |
31 | /**
32 | * 教师
33 | */
34 | private String teacher;
35 |
36 | /**
37 | * 第几周至第几周上
38 | */
39 | private List weekList;
40 |
41 | /**
42 | * 开始上课的节次
43 | */
44 | private int start;
45 |
46 | /**
47 | * 上课节数
48 | */
49 | private int step;
50 |
51 | /**
52 | * 周几上
53 | */
54 | private int day;
55 |
56 | private String term;
57 |
58 | /**
59 | * 一个随机数,用于对应课程的颜色
60 | */
61 | private int colorRandom = 0;
62 |
63 | public SubjectExtras() {
64 | // TODO Auto-generated constructor stub
65 | }
66 |
67 | public void setTime(String time) {
68 | this.time = time;
69 | }
70 |
71 | public String getTime() {
72 | return time;
73 | }
74 |
75 | public void setTerm(String term) {
76 | this.term = term;
77 | }
78 |
79 | public String getTerm() {
80 | return term;
81 | }
82 |
83 | public SubjectExtras(String term, String name, String room, String teacher, List weekList, int start, int step, int day, int colorRandom, String time) {
84 | super();
85 | this.term=term;
86 | this.name = name;
87 | this.room = room;
88 | this.teacher = teacher;
89 | this.weekList=weekList;
90 | this.start = start;
91 | this.step = step;
92 | this.day = day;
93 | this.colorRandom = colorRandom;
94 | this.time=time;
95 | }
96 |
97 | public String getName() {
98 | return name;
99 | }
100 |
101 | public void setName(String name) {
102 | this.name = name;
103 | }
104 |
105 | public String getRoom() {
106 | return room;
107 | }
108 |
109 | public void setRoom(String room) {
110 | this.room = room;
111 | }
112 |
113 | public String getTeacher() {
114 | return teacher;
115 | }
116 |
117 | public void setTeacher(String teacher) {
118 | this.teacher = teacher;
119 | }
120 |
121 | public void setWeekList(List weekList) {
122 | this.weekList = weekList;
123 | }
124 |
125 | public List getWeekList() {
126 | return weekList;
127 | }
128 |
129 | public int getStart() {
130 | return start;
131 | }
132 |
133 | public void setStart(int start) {
134 | this.start = start;
135 | }
136 |
137 | public int getStep() {
138 | return step;
139 | }
140 |
141 | public void setStep(int step) {
142 | this.step = step;
143 | }
144 |
145 | public int getDay() {
146 | return day;
147 | }
148 |
149 | public void setDay(int day) {
150 | this.day = day;
151 | }
152 |
153 | public int getColorRandom() {
154 | return colorRandom;
155 | }
156 |
157 | public void setColorRandom(int colorRandom) {
158 | this.colorRandom = colorRandom;
159 | }
160 |
161 | @Override
162 | public Schedule getSchedule() {
163 | Schedule schedule=new Schedule();
164 | schedule.setDay(getDay());
165 | schedule.setName(getName());
166 | schedule.setRoom(getRoom());
167 | schedule.setStart(getStart());
168 | schedule.setStep(getStep());
169 | schedule.setTeacher(getTeacher());
170 | schedule.setWeekList(getWeekList());
171 | schedule.setColorRandom(2);
172 | schedule.putExtras(EXTRAS_ID,getId());
173 | return schedule;
174 | }
175 |
176 | public void setId(int id) {
177 | this.id = id;
178 | }
179 |
180 | public int getId() {
181 | return id;
182 | }
183 | }
184 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/template/wakeup/WakeupActivity.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.template.wakeup;
2 |
3 | import android.content.DialogInterface;
4 | import android.graphics.drawable.GradientDrawable;
5 | import android.os.Bundle;
6 | import android.os.Handler;
7 | import android.os.Message;
8 | import android.support.v7.app.AlertDialog;
9 | import android.support.v7.app.AppCompatActivity;
10 | import android.view.View;
11 | import android.widget.FrameLayout;
12 | import android.widget.ImageView;
13 | import android.widget.LinearLayout;
14 | import android.widget.TextView;
15 | import android.widget.Toast;
16 |
17 | import com.bumptech.glide.Glide;
18 | import com.zhuangfei.android_timetableview.R;
19 | import com.zhuangfei.android_timetableview.model.MySubject;
20 | import com.zhuangfei.android_timetableview.model.SubjectRepertory;
21 | import com.zhuangfei.timetable.TimetableView;
22 | import com.zhuangfei.timetable.listener.ISchedule;
23 | import com.zhuangfei.timetable.listener.IWeekView;
24 | import com.zhuangfei.timetable.listener.OnItemBuildAdapter;
25 | import com.zhuangfei.timetable.model.Schedule;
26 | import com.zhuangfei.timetable.view.WeekView;
27 |
28 | import java.util.ArrayList;
29 | import java.util.List;
30 |
31 | public class WakeupActivity extends AppCompatActivity{
32 |
33 | @Override
34 | protected void onCreate(Bundle savedInstanceState) {
35 | super.onCreate(savedInstanceState);
36 | setContentView(R.layout.activity_wakeup);
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/template/wakeup/WakeupFragment.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.template.wakeup;
2 |
3 | import android.content.Context;
4 | import android.os.Bundle;
5 | import android.support.annotation.Nullable;
6 | import android.support.v4.app.Fragment;
7 | import android.view.LayoutInflater;
8 | import android.view.View;
9 | import android.view.ViewGroup;
10 | import android.widget.Toast;
11 |
12 | import com.zhuangfei.android_timetableview.R;
13 | import com.zhuangfei.android_timetableview.model.MySubject;
14 | import com.zhuangfei.android_timetableview.model.SubjectRepertory;
15 | import com.zhuangfei.timetable.TimetableView;
16 | import com.zhuangfei.timetable.listener.ISchedule;
17 | import com.zhuangfei.timetable.listener.IWeekView;
18 | import com.zhuangfei.timetable.view.WeekView;
19 |
20 | import java.util.List;
21 |
22 | /**
23 | * Created by Liu ZhuangFei on 2018/12/27.
24 | */
25 | public class WakeupFragment extends Fragment {
26 |
27 | //控件
28 | TimetableView mTimetableView;
29 | WeekView mWeekView;
30 | List mySubjects;
31 |
32 | @Nullable
33 | @Override
34 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
35 | View v=inflater.inflate(R.layout.fragment_wakeup,container,false);
36 | initView(v);
37 | return v;
38 | }
39 |
40 | private void initView(View v) {
41 | mySubjects = SubjectRepertory.loadDefaultSubjects2();
42 | mySubjects.addAll(SubjectRepertory.loadDefaultSubjects());
43 | initTimetableView(v);
44 | }
45 |
46 | /**
47 | * 初始化课程控件
48 | */
49 | private void initTimetableView(View v) {
50 | //获取控件
51 | mWeekView = v.findViewById(R.id.id_weekview);
52 | mTimetableView = v.findViewById(R.id.id_timetableView);
53 |
54 | //设置周次选择属性
55 | mWeekView.source(mySubjects)
56 | .curWeek(1)
57 | .callback(new IWeekView.OnWeekItemClickedListener() {
58 | @Override
59 | public void onWeekClicked(int week) {
60 | int cur = mTimetableView.curWeek();
61 | //更新切换后的日期,从当前周cur->切换的周week
62 | mTimetableView.onDateBuildListener()
63 | .onUpdateDate(cur, week);
64 | mTimetableView.changeWeekOnly(week);
65 | }
66 | })
67 | .isShow(false)//设置隐藏,默认显示
68 | .showView();
69 |
70 | mTimetableView.source(mySubjects)
71 | .curWeek(1)
72 | .curTerm("大三下学期")
73 | .maxSlideItem(10)
74 | .monthWidthDp(30)
75 | //旗标布局点击监听
76 | .callback(new ISchedule.OnFlaglayoutClickListener() {
77 | @Override
78 | public void onFlaglayoutClick(int day, int start) {
79 | mTimetableView.hideFlaglayout();
80 | Toast.makeText(getContext(),
81 | "点击了旗标:周" + (day + 1) + ",第" + start + "节",
82 | Toast.LENGTH_SHORT).show();
83 | }
84 | })
85 | .showView();
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/views/AttrActivity.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.views;
2 |
3 | import android.support.v7.app.AppCompatActivity;
4 | import android.os.Bundle;
5 | import android.view.View;
6 | import android.widget.TextView;
7 | import android.widget.Toast;
8 |
9 | import com.zhuangfei.android_timetableview.R;
10 | import com.zhuangfei.android_timetableview.model.MySubject;
11 | import com.zhuangfei.android_timetableview.model.SubjectRepertory;
12 | import com.zhuangfei.timetable.TimetableView;
13 | import com.zhuangfei.timetable.listener.ISchedule;
14 | import com.zhuangfei.timetable.model.Schedule;
15 |
16 | import java.util.List;
17 |
18 | /**
19 | * 使用自定义属性对TimetableView进行配置
20 | * xml中只能配置部分属性,知道有这个东西即可,
21 | * 建议使用代码进行配置更加灵活
22 | */
23 | public class AttrActivity extends AppCompatActivity {
24 |
25 | private static final String TAG = "AttrActivity";
26 |
27 | TimetableView mTimetableView;
28 |
29 | TextView titleTextView;
30 | List mySubjects;
31 |
32 | @Override
33 | protected void onCreate(Bundle savedInstanceState) {
34 | super.onCreate(savedInstanceState);
35 | setContentView(R.layout.activity_attr);
36 | mySubjects=SubjectRepertory.loadDefaultSubjects();
37 |
38 | initTimetableView();
39 | }
40 |
41 | /**
42 | * 初始化课程控件
43 | */
44 | private void initTimetableView() {
45 | //获取控件
46 | mTimetableView = findViewById(R.id.id_timetableView);
47 | mTimetableView.source(mySubjects)
48 | .callback(new ISchedule.OnItemClickListener() {
49 | @Override
50 | public void onItemClick(View v, List scheduleList) {
51 | display(scheduleList);
52 | }
53 | })
54 | .callback(new ISchedule.OnWeekChangedListener() {
55 | @Override
56 | public void onWeekChanged(int curWeek) {
57 | Toast.makeText(AttrActivity.this,"第" + curWeek + "周",Toast.LENGTH_SHORT).show();
58 | }
59 | })
60 | .showView();
61 | }
62 |
63 | /**
64 | * 显示内容
65 | *
66 | * @param beans
67 | */
68 | protected void display(List beans) {
69 | String str = "";
70 | for (Schedule bean : beans) {
71 | str += bean.getName() + "、";
72 | }
73 | Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/views/ColorPoolActivity.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.views;
2 |
3 | import android.graphics.Color;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.os.Bundle;
6 | import android.view.MenuItem;
7 | import android.view.View;
8 | import android.widget.Button;
9 | import android.widget.PopupMenu;
10 |
11 | import com.zhuangfei.android_timetableview.R;
12 | import com.zhuangfei.android_timetableview.model.MySubject;
13 | import com.zhuangfei.android_timetableview.model.SubjectRepertory;
14 | import com.zhuangfei.timetable.TimetableView;
15 |
16 | import java.util.HashMap;
17 | import java.util.List;
18 | import java.util.Map;
19 |
20 | /**
21 | * 颜色池示例,展示颜色池的相关用法
22 | */
23 | public class ColorPoolActivity extends AppCompatActivity {
24 |
25 | TimetableView mTimetableView;
26 |
27 | Button moreButton;
28 |
29 | @Override
30 | protected void onCreate(Bundle savedInstanceState) {
31 | super.onCreate(savedInstanceState);
32 | setContentView(R.layout.activity_color_pool);
33 | moreButton = findViewById(R.id.id_more);
34 | moreButton.setOnClickListener(new View.OnClickListener() {
35 | @Override
36 | public void onClick(View view) {
37 | showPopmenu();
38 | }
39 | });
40 |
41 | initTimetableView();
42 | }
43 |
44 | /**
45 | * 初始化课程控件
46 | */
47 | private void initTimetableView() {
48 | mTimetableView = findViewById(R.id.id_timetableView);
49 |
50 | List mySubjects = SubjectRepertory.loadDefaultSubjects();
51 | mTimetableView.source(mySubjects)
52 | .curWeek(1)
53 | .curTerm("大三下学期")
54 | .showView();
55 | }
56 |
57 | /**
58 | * 显示弹出菜单
59 | */
60 | public void showPopmenu() {
61 | PopupMenu popup = new PopupMenu(this, moreButton);
62 | popup.getMenuInflater().inflate(R.menu.popmenu_colorpool, popup.getMenu());
63 | popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
64 | public boolean onMenuItemClick(MenuItem item) {
65 | switch (item.getItemId()) {
66 | case R.id.top1:
67 | setColor(Color.BLUE,Color.YELLOW,Color.CYAN);
68 | break;
69 | case R.id.top2:
70 | resetColor();
71 | break;
72 | case R.id.top3:
73 | addColor(Color.BLUE,Color.YELLOW,Color.CYAN);
74 | break;
75 | case R.id.top4:
76 | forColor();
77 | break;
78 | default:
79 | break;
80 | }
81 | return true;
82 | }
83 | });
84 |
85 | popup.show();
86 | }
87 |
88 | /**
89 | * 设置指定的颜色,默认情况下颜色池中有一些颜色
90 | * 所以这里需要先清空一下颜色池
91 | * @param colors
92 | */
93 | public void setColor(int... colors){
94 | mTimetableView.colorPool().clear().add(colors);
95 | mTimetableView.updateView();
96 | }
97 |
98 | /**
99 | * 重置颜色池
100 | */
101 | public void resetColor(){
102 | mTimetableView.colorPool().reset();
103 | mTimetableView.updateView();
104 | }
105 |
106 | /**
107 | * 追加颜色
108 | * @param colors
109 | */
110 | public void addColor(int... colors){
111 | mTimetableView.colorPool().add(colors);
112 | mTimetableView.updateView();
113 | }
114 |
115 | /**
116 | * 指定课程的颜色,未指定的课程自动分配
117 | */
118 | public void forColor(){
119 | Map colorMap=new HashMap<>();
120 | colorMap.put("数字图像处理",Color.RED);
121 | colorMap.put("算法分析与设计",Color.BLUE);
122 | mTimetableView.colorPool().setIgnoreUserlessColor(false).setColorMap(colorMap);
123 | mTimetableView.updateView();
124 | }
125 | }
126 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/views/DateActivity.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.views;
2 |
3 | import android.graphics.Color;
4 | import android.support.v7.app.AppCompatActivity;
5 | import android.os.Bundle;
6 | import android.view.LayoutInflater;
7 | import android.view.MenuItem;
8 | import android.view.View;
9 | import android.widget.Button;
10 | import android.widget.LinearLayout;
11 | import android.widget.PopupMenu;
12 | import android.widget.TextView;
13 |
14 | import com.zhuangfei.android_timetableview.R;
15 | import com.zhuangfei.android_timetableview.model.MySubject;
16 | import com.zhuangfei.android_timetableview.model.SubjectRepertory;
17 | import com.zhuangfei.timetable.TimetableView;
18 | import com.zhuangfei.timetable.listener.ISchedule;
19 | import com.zhuangfei.timetable.listener.OnDateBuildAapter;
20 | import com.zhuangfei.timetable.utils.ScreenUtils;
21 |
22 | import java.util.Calendar;
23 | import java.util.Date;
24 | import java.util.List;
25 |
26 | public class DateActivity extends AppCompatActivity {
27 |
28 | TimetableView mTimetableView;
29 | Button moreButton;
30 |
31 | @Override
32 | protected void onCreate(Bundle savedInstanceState) {
33 | super.onCreate(savedInstanceState);
34 | setContentView(R.layout.activity_date);
35 | moreButton = findViewById(R.id.id_more);
36 | moreButton.setOnClickListener(new View.OnClickListener() {
37 | @Override
38 | public void onClick(View view) {
39 | showPopmenu();
40 | }
41 | });
42 |
43 | initTimetableView();
44 | }
45 |
46 | /**
47 | * 初始化课程控件
48 | */
49 | private void initTimetableView() {
50 | mTimetableView = findViewById(R.id.id_timetableView);
51 |
52 | List mySubjects = SubjectRepertory.loadDefaultSubjects();
53 | mTimetableView.source(mySubjects)
54 | .curWeek(1)
55 | .showView();
56 | }
57 |
58 | /**
59 | * 显示弹出菜单
60 | */
61 | public void showPopmenu() {
62 | PopupMenu popup = new PopupMenu(this, moreButton);
63 | popup.getMenuInflater().inflate(R.menu.popmenu_date, popup.getMenu());
64 | popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
65 | public boolean onMenuItemClick(MenuItem item) {
66 | switch (item.getItemId()) {
67 | case R.id.top1:
68 | hideDateView();
69 | break;
70 | case R.id.top2:
71 | showDateView();
72 | break;
73 | case R.id.top3:
74 | customDateView();
75 | break;
76 | case R.id.top4:
77 | cancelCustomDateView();
78 | break;
79 | default:
80 | break;
81 | }
82 | return true;
83 | }
84 | });
85 | popup.show();
86 | }
87 |
88 | /**
89 | * 隐藏日期栏
90 | */
91 | protected void hideDateView() {
92 | mTimetableView.hideDateView();
93 | }
94 |
95 | /**
96 | * 显示日期栏
97 | */
98 | protected void showDateView() {
99 | mTimetableView.showDateView();
100 | }
101 |
102 | /**
103 | * 自定义日期栏
104 | * 该段代码有点长,但是很好懂,仔细看看会有收获的,嘻嘻
105 | */
106 | protected void customDateView() {
107 | mTimetableView.callback(
108 | new OnDateBuildAapter() {
109 | @Override
110 | public View onBuildDayLayout(LayoutInflater mInflate, int pos, int width, int height) {
111 | int newHeight=ScreenUtils.dip2px(DateActivity.this,30);
112 | View v = mInflate.inflate(R.layout.item_custom_dateview, null, false);
113 | TextView dayTextView = v.findViewById(R.id.id_week_day);
114 | dayTextView.setText(dateArray[pos]);
115 | layouts[pos] = v.findViewById(R.id.id_week_layout);
116 |
117 | LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, newHeight);
118 | layouts[pos].setLayoutParams(lp);
119 |
120 | return v;
121 | }
122 |
123 | @Override
124 | public View onBuildMonthLayout(LayoutInflater mInflate, int width, int height) {
125 | int newHeight=ScreenUtils.dip2px(DateActivity.this,30);
126 | View first = mInflate.inflate(R.layout.item_custom_dateview_first, null, false);
127 | //月份设置
128 | textViews[0] = first.findViewById(R.id.id_week_month);
129 | layouts[0] = null;
130 |
131 | LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(width, newHeight);
132 |
133 | int month = Integer.parseInt(weekDates.get(0));
134 | first.setLayoutParams(lp);
135 | textViews[0].setText(month + "\n月");
136 | return first;
137 |
138 | }
139 | })
140 | .updateDateView();
141 | }
142 |
143 | /**
144 | * 恢复默认日期栏
145 | */
146 | protected void cancelCustomDateView() {
147 | mTimetableView.callback((ISchedule.OnDateBuildListener) null)
148 | .updateDateView();
149 | }
150 | }
151 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/views/DateDelayActivity.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.views;
2 |
3 | import android.content.DialogInterface;
4 | import android.support.v7.app.AlertDialog;
5 | import android.support.v7.app.AppCompatActivity;
6 | import android.os.Bundle;
7 | import android.view.View;
8 | import android.widget.TextView;
9 | import android.widget.Toast;
10 |
11 | import com.zhuangfei.android_timetableview.R;
12 | import com.zhuangfei.android_timetableview.adapter.OnDateDelayAdapter;
13 | import com.zhuangfei.android_timetableview.model.MySubject;
14 | import com.zhuangfei.android_timetableview.model.SubjectRepertory;
15 | import com.zhuangfei.timetable.TimetableView;
16 | import com.zhuangfei.timetable.listener.ISchedule;
17 | import com.zhuangfei.timetable.listener.IWeekView;
18 | import com.zhuangfei.timetable.listener.OnDateBuildAapter;
19 | import com.zhuangfei.timetable.listener.OnSpaceItemClickAdapter;
20 | import com.zhuangfei.timetable.model.Schedule;
21 | import com.zhuangfei.timetable.model.ScheduleSupport;
22 | import com.zhuangfei.timetable.view.WeekView;
23 |
24 | import java.text.ParseException;
25 | import java.text.SimpleDateFormat;
26 | import java.util.ArrayList;
27 | import java.util.Arrays;
28 | import java.util.Calendar;
29 | import java.util.Date;
30 | import java.util.List;
31 |
32 | /**
33 | * 日期延迟案例:
34 | * 需求:设定一个开学时间,在开学时间到来之前,一直显示开学时的第一周的日期
35 | */
36 | public class DateDelayActivity extends AppCompatActivity {
37 |
38 | //控件
39 | TimetableView mTimetableView;
40 |
41 | TextView titleTextView;
42 | List mySubjects;
43 |
44 | @Override
45 | protected void onCreate(Bundle savedInstanceState) {
46 | super.onCreate(savedInstanceState);
47 | setContentView(R.layout.activity_date_delay);
48 | mySubjects = SubjectRepertory.loadDefaultSubjects();
49 | titleTextView = findViewById(R.id.id_title);
50 | initTimetableView();
51 | }
52 |
53 | @Override
54 | protected void onStart() {
55 | super.onStart();
56 |
57 | //用于更正日期的显示
58 | int cur=mTimetableView.curWeek();
59 | mTimetableView.onDateBuildListener().onUpdateDate(cur,cur);
60 |
61 | //更新文本
62 | OnDateDelayAdapter adapter= (OnDateDelayAdapter) mTimetableView.onDateBuildListener();
63 | long when=adapter.whenBeginSchool();
64 | if(when>0){
65 | titleTextView.setText("距离开学还有"+when+"天");
66 | }
67 | }
68 |
69 | /**
70 | * 初始化课程控件
71 | */
72 | private void initTimetableView() {
73 | mTimetableView = findViewById(R.id.id_timetableView);
74 |
75 | mTimetableView.source(mySubjects)
76 | .curWeek(1)
77 | .curTerm("大三下学期")
78 | .maxSlideItem(10)
79 | .callback(getDateDelayAdapter())//这行要放在下行的前边
80 | .callback(new ISchedule.OnWeekChangedListener() {
81 | @Override
82 | public void onWeekChanged(int curWeek) {
83 | if(mTimetableView.onDateBuildListener() instanceof OnDateDelayAdapter){
84 | OnDateDelayAdapter adapter= (OnDateDelayAdapter) mTimetableView.onDateBuildListener();
85 | long when=adapter.whenBeginSchool();
86 | if(when>0){
87 | titleTextView.setText("距离开学还有"+when+"天");
88 | }else{
89 | titleTextView.setText("第" + curWeek + "周");
90 | }
91 | }
92 | }
93 | })
94 | .showView();
95 | }
96 |
97 | /**
98 | * 配置OnDateDelayAdapter
99 | */
100 | public OnDateDelayAdapter getDateDelayAdapter(){
101 | OnDateDelayAdapter onDateDelayAdapter=new OnDateDelayAdapter();
102 |
103 | //计算开学时间戳
104 | SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm");
105 | long startTime=0;
106 | try {
107 | startTime=sdf.parse("2018-09-03 00:00").getTime();
108 | } catch (ParseException e) {
109 | e.printStackTrace();
110 | }
111 |
112 | //计算开学时的一周日期,我这里模拟一下
113 | List dateList= Arrays.asList("9","03","04","05","06","07","08","09");
114 |
115 | //设置
116 | onDateDelayAdapter.setStartTime(startTime);
117 | onDateDelayAdapter.setDateList(dateList);
118 | return onDateDelayAdapter;
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/views/ElasticActivity.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.views;
2 |
3 | import android.support.v7.app.AppCompatActivity;
4 | import android.os.Bundle;
5 | import android.view.LayoutInflater;
6 | import android.view.View;
7 |
8 | import com.zhuangfei.android_timetableview.R;
9 | import com.zhuangfei.android_timetableview.model.MySubject;
10 | import com.zhuangfei.android_timetableview.model.SubjectRepertory;
11 | import com.zhuangfei.timetable.TimetableView;
12 | import com.zhuangfei.timetable.listener.ISchedule;
13 |
14 | import java.util.List;
15 |
16 | /**
17 | * 展示如何使用自定义的滚动控件
18 | * 应用场景:滑动冲突解决、下拉刷新、其他滚动效果
19 | * 效果由用户定义,自定义ScrollView需要继承自SimpleScrollView
20 | * 本例实现反弹的效果
21 | */
22 | public class ElasticActivity extends AppCompatActivity {
23 |
24 | TimetableView mTimetableView;
25 |
26 | @Override
27 | protected void onCreate(Bundle savedInstanceState) {
28 | super.onCreate(savedInstanceState);
29 | setContentView(R.layout.activity_custom_scroll_view);
30 |
31 | mTimetableView = findViewById(R.id.id_timetableView);
32 | List mySubjects = SubjectRepertory.loadDefaultSubjects();
33 |
34 | /**
35 | * 过程很简单,步骤如下:
36 | * 1.创建一个xml文件,命名为custom_myscrollview.xml
37 | * 2.拷贝一段代码至该文件中,具体内容可以参见custom_myscrollview.xml
38 | * 3.将根布局控件修改为自定义的控件,其他内容无需修改
39 | * 4.设置滚动布局构建监听并实现其方法,将自定义的xml转换为View返回即可
40 | *
41 | */
42 | mTimetableView.source(mySubjects)
43 | .callback(new ISchedule.OnScrollViewBuildListener() {
44 | @Override
45 | public View getScrollView(LayoutInflater mInflate) {
46 | return mInflate.inflate(R.layout.custom_myscrollview, null, false);
47 | }
48 | })
49 | .showView();
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/views/ElasticScrollView.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.views;
2 |
3 | import android.content.Context;
4 | import android.graphics.Rect;
5 | import android.util.AttributeSet;
6 | import android.view.MotionEvent;
7 | import android.view.View;
8 | import android.view.animation.Animation;
9 | import android.view.animation.Animation.AnimationListener;
10 | import android.view.animation.TranslateAnimation;
11 | import android.widget.ScrollView;
12 |
13 | /**
14 | * 弹性滚动布局,下拉时会反弹
15 | */
16 | public class ElasticScrollView extends ScrollView {
17 | private View inner;
18 | private float y;
19 | private Rect normal = new Rect();
20 | private boolean animationFinish = true;
21 |
22 | public ElasticScrollView(Context context) {
23 | super(context);
24 | }
25 |
26 | public ElasticScrollView(Context context, AttributeSet attrs) {
27 | super(context, attrs);
28 | }
29 |
30 | @Override
31 | protected void onFinishInflate() {
32 | super.onFinishInflate();
33 | if (getChildCount() > 0) {
34 | inner = getChildAt(0);
35 | }
36 | }
37 |
38 | @Override
39 | public boolean onInterceptTouchEvent(MotionEvent ev) {
40 | return super.onInterceptTouchEvent(ev);
41 | }
42 |
43 | @Override
44 | public boolean onTouchEvent(MotionEvent ev) {
45 | if (inner == null) {
46 | return super.onTouchEvent(ev);
47 | } else {
48 | commOnTouchEvent(ev);
49 | }
50 | return super.onTouchEvent(ev);
51 | }
52 |
53 | public void commOnTouchEvent(MotionEvent ev) {
54 | if (animationFinish) {
55 | int action = ev.getAction();
56 | switch (action) {
57 | case MotionEvent.ACTION_DOWN:
58 | y = ev.getY();
59 | super.onTouchEvent(ev);
60 | break;
61 | case MotionEvent.ACTION_UP:
62 | y = 0;
63 | if (isNeedAnimation()) {
64 | animation();
65 | }
66 | super.onTouchEvent(ev);
67 | break;
68 | case MotionEvent.ACTION_MOVE:
69 | final float preY = y == 0 ? ev.getY() : y;
70 | float nowY = ev.getY();
71 | int deltaY = (int) (preY - nowY);
72 |
73 | y = nowY;
74 | // 当滚动到最上或者最下时就不会再滚动,这时移动布局
75 | if (isNeedMove()) {
76 | if (normal.isEmpty()) {
77 | // 保存正常的布局位置
78 | normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom());
79 | }
80 | // 移动布局
81 | inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2, inner.getRight(), inner.getBottom() - deltaY / 2);
82 | } else {
83 | super.onTouchEvent(ev);
84 | }
85 | break;
86 | default:
87 | break;
88 | }
89 | }
90 | }
91 |
92 | // 开启动画移动
93 | public void animation() {
94 | // 开启移动动画
95 | TranslateAnimation ta = new TranslateAnimation(0, 0, 0, normal.top - inner.getTop());
96 | ta.setDuration(200);
97 | ta.setAnimationListener(new AnimationListener() {
98 | @Override
99 | public void onAnimationStart(Animation animation) {
100 | animationFinish = false;
101 | }
102 |
103 | @Override
104 | public void onAnimationRepeat(Animation animation) {
105 | }
106 |
107 | @Override
108 | public void onAnimationEnd(Animation animation) {
109 | inner.clearAnimation();
110 | inner.layout(normal.left, normal.top, normal.right, normal.bottom);
111 | normal.setEmpty();
112 | animationFinish = true;
113 | }
114 | });
115 | inner.startAnimation(ta);
116 | }
117 |
118 | // 是否需要开启动画
119 | public boolean isNeedAnimation() {
120 | return !normal.isEmpty();
121 | }
122 |
123 | // 是否需要移动布局
124 | public boolean isNeedMove() {
125 | int offset = inner.getMeasuredHeight() - getHeight();
126 | int scrollY = getScrollY();
127 | if (scrollY == 0 || scrollY == offset) {
128 | return true;
129 | }
130 | return false;
131 | }
132 |
133 | }
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/views/ExtrasActivity.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.views;
2 |
3 | import android.content.DialogInterface;
4 | import android.graphics.Color;
5 | import android.os.Bundle;
6 | import android.support.v7.app.AlertDialog;
7 | import android.support.v7.app.AppCompatActivity;
8 | import android.view.MenuItem;
9 | import android.view.View;
10 | import android.widget.Button;
11 | import android.widget.PopupMenu;
12 | import android.widget.TextView;
13 | import android.widget.Toast;
14 |
15 | import com.zhuangfei.android_timetableview.R;
16 | import com.zhuangfei.android_timetableview.model.MySubject;
17 | import com.zhuangfei.android_timetableview.model.SubjectRepertory;
18 | import com.zhuangfei.timetable.TimetableView;
19 | import com.zhuangfei.timetable.listener.ISchedule;
20 | import com.zhuangfei.timetable.listener.IWeekView;
21 | import com.zhuangfei.timetable.listener.OnSlideBuildAdapter;
22 | import com.zhuangfei.timetable.model.Schedule;
23 | import com.zhuangfei.timetable.view.WeekView;
24 |
25 | import java.util.List;
26 |
27 | /**
28 | * 本例子展示如何在Schedule中放入一些额外的信息
29 | */
30 | public class ExtrasActivity extends AppCompatActivity {
31 |
32 | private static final String TAG = "ExtrasActivity";
33 |
34 | //控件
35 | TimetableView mTimetableView;
36 | List mySubjects;
37 |
38 | @Override
39 | protected void onCreate(Bundle savedInstanceState) {
40 | super.onCreate(savedInstanceState);
41 | setContentView(R.layout.activity_extras);
42 | mySubjects = SubjectRepertory.loadDefaultSubjects();
43 | initTimetableView();
44 | }
45 |
46 | /**
47 | * 初始化课程控件
48 | */
49 | private void initTimetableView() {
50 | //获取控件
51 | mTimetableView = findViewById(R.id.id_timetableView);
52 |
53 | mTimetableView.source(mySubjects)
54 | .curWeek(1)
55 | .curTerm("大三下学期")
56 | .maxSlideItem(10)
57 | .callback(new ISchedule.OnItemClickListener() {
58 | @Override
59 | public void onItemClick(View v, List scheduleList) {
60 | display(scheduleList);
61 | }
62 | })
63 | .showView();
64 | }
65 |
66 | /**
67 | * 显示内容
68 | *
69 | * @param beans
70 | */
71 | protected void display(List beans) {
72 | String str = "";
73 | for (Schedule bean : beans) {
74 | str += "["+bean.getName() + "]的id:"+bean.getExtras().get(MySubject.EXTRAS_ID)+"\n";
75 | }
76 | Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/java/com/zhuangfei/android_timetableview/views/NonViewActivity.java:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview.views;
2 |
3 | import android.support.v7.app.AppCompatActivity;
4 | import android.os.Bundle;
5 | import android.view.MenuItem;
6 | import android.view.View;
7 | import android.widget.Button;
8 | import android.widget.ListView;
9 | import android.widget.PopupMenu;
10 |
11 | import com.zhuangfei.android_timetableview.R;
12 | import com.zhuangfei.android_timetableview.adapter.NonViewAdapter;
13 | import com.zhuangfei.android_timetableview.model.SubjectRepertory;
14 | import com.zhuangfei.timetable.model.Schedule;
15 | import com.zhuangfei.timetable.model.ScheduleSupport;
16 |
17 | import java.util.ArrayList;
18 | import java.util.List;
19 |
20 | /**
21 | * 使用工具操作
22 | * 实现课程的罗列以及颜色的显示
23 | * 显示的颜色使用的默认的颜色池中的颜色
24 | */
25 | public class NonViewActivity extends AppCompatActivity {
26 |
27 | Button moreButton;
28 | List schedules;
29 | ListView listView;
30 | NonViewAdapter adapter;
31 |
32 | @Override
33 | protected void onCreate(Bundle savedInstanceState) {
34 | super.onCreate(savedInstanceState);
35 | setContentView(R.layout.activity_non_view);
36 | moreButton = findViewById(R.id.id_more);
37 | moreButton.setOnClickListener(new View.OnClickListener() {
38 | @Override
39 | public void onClick(View view) {
40 | showPopmenu();
41 | }
42 | });
43 |
44 | schedules = new ArrayList<>();
45 | listView = findViewById(R.id.id_listview);
46 | adapter = new NonViewAdapter(this, schedules);
47 | listView.setAdapter(adapter);
48 | all();
49 | }
50 |
51 | /**
52 | * 显示弹出菜单
53 | */
54 | public void showPopmenu() {
55 | PopupMenu popup = new PopupMenu(this, moreButton);
56 | popup.getMenuInflater().inflate(R.menu.popmenu_nonview, popup.getMenu());
57 | popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
58 | public boolean onMenuItemClick(MenuItem item) {
59 | switch (item.getItemId()) {
60 | case R.id.top1:
61 | all();
62 | break;
63 | case R.id.top2:
64 | haveTime();
65 | break;
66 | case R.id.top3:
67 | haveTimeWithMonday();
68 | break;
69 | default:
70 | break;
71 | }
72 | return true;
73 | }
74 | });
75 |
76 | popup.show();
77 | }
78 |
79 | public List getData() {
80 | List list = ScheduleSupport.transform(SubjectRepertory.loadDefaultSubjects());
81 | list = ScheduleSupport.getColorReflect(list);//分配颜色
82 | return list;
83 | }
84 |
85 | /**
86 | * 获取所有课程
87 | */
88 | protected void all() {
89 | schedules.clear();
90 | schedules.addAll(getData());
91 | adapter.notifyDataSetChanged();
92 | }
93 |
94 | /**
95 | * 获取第一周有课的课程并显示出来
96 | */
97 | protected void haveTime() {
98 | List result = new ArrayList<>();
99 | List[] arr = ScheduleSupport.splitSubjectWithDay(getData());
100 | for (int i = 0; i < arr.length; i++) {
101 | List tmpList = arr[i];
102 | for (Schedule schedule : tmpList) {
103 | if (ScheduleSupport.isThisWeek(schedule, 1)) {
104 | result.add(schedule);
105 | }
106 | }
107 | }
108 | schedules.clear();
109 | schedules.addAll(result);
110 | adapter.notifyDataSetChanged();
111 | }
112 |
113 | /**
114 | * 显示第一周周一有课的课程
115 | */
116 | protected void haveTimeWithMonday() {
117 | List tmpList = ScheduleSupport.getHaveSubjectsWithDay(
118 | getData(), 1, 0);
119 | schedules.clear();
120 | schedules.addAll(tmpList);
121 | adapter.notifyDataSetChanged();
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/drawable-hdpi/bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/drawable-hdpi/bg.jpg
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/drawable-hdpi/bg2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/drawable-hdpi/bg2.jpg
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/drawable-hdpi/bg3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/drawable-hdpi/bg3.jpg
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/drawable-hdpi/bg4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/drawable-hdpi/bg4.jpg
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/drawable/ic_back.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/drawable/ic_back.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/drawable/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/drawable/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/drawable/more.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/drawable/more.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_attr.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
18 |
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_base_func.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
14 |
15 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_color_pool.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_custom_item_style.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_custom_scroll_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
13 |
14 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_custom_width.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_date.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_date_delay.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_extras.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_flaglayout.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_local_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
17 |
18 |
23 |
24 |
29 |
30 |
35 |
36 |
41 |
42 |
47 |
48 |
53 |
54 |
59 |
60 |
65 |
70 |
71 |
76 |
77 |
82 |
87 |
88 |
93 |
94 |
95 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_new_feature.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
19 |
20 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_non_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
20 |
27 |
28 |
29 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_slide1.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/activity_wakeup.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/custom_myscrollview.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/fragment_wakeup.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
13 |
14 |
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/header_base_func.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
14 |
21 |
27 |
28 |
29 |
37 |
38 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/header_simple.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
15 |
16 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/item_custom_dateview.xml:
--------------------------------------------------------------------------------
1 |
2 |
9 |
10 |
16 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/item_custom_dateview_first.xml:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/item_custom_slide.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
13 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/layout/item_nonview.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
19 |
20 |
27 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/menu/popmenu_base_func.xml:
--------------------------------------------------------------------------------
1 |
2 |
38 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/menu/popmenu_colorpool.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/menu/popmenu_date.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/menu/popmenu_flaglayout.xml:
--------------------------------------------------------------------------------
1 |
2 |
15 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/menu/popmenu_itemstyle.xml:
--------------------------------------------------------------------------------
1 |
2 |
23 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/menu/popmenu_local_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
12 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/menu/popmenu_nonview.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/menu/popmenu_slide1.xml:
--------------------------------------------------------------------------------
1 |
2 |
21 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/menu/popmenu_subject.xml:
--------------------------------------------------------------------------------
1 |
2 |
13 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FF7A59
4 | #FBFBFB
5 |
6 | #dc7e2c
7 | #dc7e2c
8 | #dc7e2c
9 |
10 | #2A3033
11 | #787C7E
12 | #ffffff
13 |
14 | #000000
15 |
16 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | 课表Demo
3 |
4 |
5 | Hello blank fragment
6 |
7 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/AndroidTimetableView/app/src/test/java/com/zhuangfei/android_timetableview/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.zhuangfei.android_timetableview
2 |
3 | import org.junit.Test
4 |
5 | import org.junit.Assert.*
6 |
7 | /**
8 | * Example local unit test, which will execute on the development machine (host).
9 | *
10 | * See [testing documentation](http://d.android.com/tools/testing).
11 | */
12 | class ExampleUnitTest {
13 | @Test
14 | fun addition_isCorrect() {
15 | assertEquals(4, 2 + 2)
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/AndroidTimetableView/build.gradle:
--------------------------------------------------------------------------------
1 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
2 |
3 | buildscript {
4 | ext.kotlin_version = '1.1.51'
5 | repositories {
6 | google()
7 | jcenter()
8 | }
9 | dependencies {
10 | classpath 'com.android.tools.build:gradle:3.0.0'
11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
12 |
13 | //使用0.3.4版本会失败
14 | classpath 'com.novoda:bintray-release:0.5.0'
15 |
16 | // NOTE: Do not place your application dependencies here; they belong
17 | // in the individual module build.gradle files
18 | }
19 | }
20 |
21 | allprojects {
22 | repositories {
23 | google()
24 | jcenter()
25 | }
26 |
27 | //字体问题
28 | tasks.withType(Javadoc) {
29 | options.addStringOption('Xdoclint:none', '-quiet')
30 | options.addStringOption('encoding', 'UTF-8')
31 | }
32 | }
33 |
34 | task clean(type: Delete) {
35 | delete rootProject.buildDir
36 | }
37 |
38 | //非常重要要不它不认识你的项目.kt文件名 其中airpurgeview是你的library名
39 | tasks.getByPath(":TimetableView:releaseAndroidJavadocs").enabled = false
40 |
41 |
--------------------------------------------------------------------------------
/AndroidTimetableView/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | org.gradle.jvmargs=-Xmx1536m
13 |
14 | # When configured, Gradle will run in incubating parallel mode.
15 | # This option should only be used with decoupled projects. More details, visit
16 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
17 | # org.gradle.parallel=true
18 |
--------------------------------------------------------------------------------
/AndroidTimetableView/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/AndroidTimetableView/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/AndroidTimetableView/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sun Jan 28 18:21:23 CST 2018
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
7 |
--------------------------------------------------------------------------------
/AndroidTimetableView/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
12 | set DEFAULT_JVM_OPTS=
13 |
14 | set DIRNAME=%~dp0
15 | if "%DIRNAME%" == "" set DIRNAME=.
16 | set APP_BASE_NAME=%~n0
17 | set APP_HOME=%DIRNAME%
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windowz variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/AndroidTimetableView/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':TimetableView'
2 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 壮飞
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### TimetableView
2 | > [TimetableView](https://github.com/zfman/TimetableView)是一款开源的Android课程表控件,你可以在 [ChangeLog](https://github.com/zfman/TimetableView/wiki/版本说明) 查看本控件的开发进展,作者联系方式`1193600556@qq.com`
3 |
4 | [TimetableView](https://github.com/zfman/TimetableView)是一款开源的、完善、高效的Android课程表控件。
5 |
6 | - 支持xml设置属性
7 | - 丰富的课程工具包
8 | - 支持多种自定义
9 | - 课程颜色管理
10 | - ScrollView可替换
11 | - 调用简洁、性能高效
12 | - 可设置背景以及透明度
13 | - 数据源可添加额外信息
14 | - 空白格子可点击,课程项可长按
15 | - 月份宽度可设置
16 | - 周末可设置隐藏
17 | - 课表具体逻辑可自定义
18 | - 本地配置:配置隔离、加载、导出至文本
19 | - 课程颜色可指定
20 |
21 |
22 |
23 | ## 最新文档
24 |
25 | 文档请参见:[https://www.yuque.com/zhuangfei/timetableview/summary](https://www.yuque.com/zhuangfei/timetableview/summary)
26 |
27 | 完整案例-怪兽课表请参见:[https://github.com/zfman/hputimetable](https://github.com/zfman/hputimetable)
28 |
29 | ## 感谢贡献者
30 | > 感谢所有参与本项目以及帮助我一起完善这个项目的开发者~~
31 |
32 | |用户 | Issues | pull request|
33 | | - | :-: | -: |
34 | |[Mystery00](https://github.com/Mystery00)|[#6.WeekView数组越界](https://github.com/zfman/TimetableView/issues/6) |[修复#6,并添加新功能](https://github.com/zfman/TimetableView/pull/7)|
35 |
36 | ## 关于作者
37 |
38 | - 刘壮飞,目前大四
39 | - 目前学习方向:Android,php和网页也会一点
40 | - 欢迎大家找我交流技术,共同学习进步
41 | - QQ:1193600556
42 | - 酷安ID:@zhuangfei
43 | - [掘金博客:@壮飞](https://juejin.im/user/5ae25aa65188256717760523/posts)
44 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/apk/app-release.apk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/apk/app-release.apk
--------------------------------------------------------------------------------
/images/guaishou.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/guaishou.jpeg
--------------------------------------------------------------------------------
/images/v1.x/1.0.3之前的模式分析图.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v1.x/1.0.3之前的模式分析图.jpg
--------------------------------------------------------------------------------
/images/v1.x/1.0.4模式分析图.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v1.x/1.0.4模式分析图.jpg
--------------------------------------------------------------------------------
/images/v1.x/img1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v1.x/img1.png
--------------------------------------------------------------------------------
/images/v1.x/img2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v1.x/img2.png
--------------------------------------------------------------------------------
/images/v1.x/img3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v1.x/img3.png
--------------------------------------------------------------------------------
/images/v1.x/img4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v1.x/img4.png
--------------------------------------------------------------------------------
/images/v1.x/img5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v1.x/img5.png
--------------------------------------------------------------------------------
/images/v2.0.3/img1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.0.3/img1.jpg
--------------------------------------------------------------------------------
/images/v2.0.3/img2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.0.3/img2.jpg
--------------------------------------------------------------------------------
/images/v2.0.6/img1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.0.6/img1.jpg
--------------------------------------------------------------------------------
/images/v2.x/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/bg.png
--------------------------------------------------------------------------------
/images/v2.x/img1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/img1.png
--------------------------------------------------------------------------------
/images/v2.x/img2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/img2.png
--------------------------------------------------------------------------------
/images/v2.x/img3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/img3.png
--------------------------------------------------------------------------------
/images/v2.x/img4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/img4.png
--------------------------------------------------------------------------------
/images/v2.x/img5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/img5.png
--------------------------------------------------------------------------------
/images/v2.x/img6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/img6.png
--------------------------------------------------------------------------------
/images/v2.x/img7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/img7.png
--------------------------------------------------------------------------------
/images/v2.x/img8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/img8.png
--------------------------------------------------------------------------------
/images/v2.x/img9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/img9.png
--------------------------------------------------------------------------------
/images/v2.x/v2img1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/v2img1.jpg
--------------------------------------------------------------------------------
/images/v2.x/v2img2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/v2img2.jpg
--------------------------------------------------------------------------------
/images/v2.x/v2img3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zfman/TimetableView/dfaf1acd5c2fded7de1319bca45428c14964288c/images/v2.x/v2img3.jpg
--------------------------------------------------------------------------------