├── .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 | 15 | 16 | 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 | 36 | 37 | 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 | 11 | 12 | -------------------------------------------------------------------------------- /AndroidTimetableView/.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /AndroidTimetableView/TimetableView/.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /AndroidTimetableView/TimetableView/.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | -------------------------------------------------------------------------------- /AndroidTimetableView/TimetableView/.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /AndroidTimetableView/TimetableView/.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 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 | 4 | 5 | 10 | 11 | 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 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 |