From e1e503f9f47898f6c203b58148e3f52922e0d621 Mon Sep 17 00:00:00 2001 From: zhoulei <1090447721@qq.com> Date: Thu, 13 May 2021 14:35:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E9=A1=B9=E7=9B=AE=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 11 +- .idea/compiler.xml | 22 - .idea/copyright/profiles_settings.xml | 3 - .idea/gradle.xml | 20 - .idea/misc.xml | 46 - .idea/modules.xml | 10 - .idea/runConfigurations.xml | 12 - .idea/vcs.xml | 6 - AdvancedPagerSlidingTabStrip.iml | 19 - CHANGELOG.md | 8 + ChangLog.md | 9 - LICENSE | 201 +++ {app => Library}/.gitignore | 0 Library/AndroidManifest.xml | 7 - Library/Library.iml | 99 -- Library/build.gradle | 39 +- Library/proguard-rules.pro | 1 + Library/res/drawable/apsts_tips.xml | 19 - Library/res/drawable/psts_background_tab.xml | 8 - Library/res/values/attrs.xml | 24 - Library/res/values/colors.xml | 6 - Library/res/values/dimens.xml | 11 - Library/res/values/ids.xml | 5 - .../library/AdvancedPagerSlidingTabStrip.java | 1091 --------------- .../src/com/lhh/apst/library/ViewHolder.java | 25 - Library/src/main/config.json | 27 + .../library/AdvancedPagerSlidingTabStrip.java | 1193 +++++++++++++++++ .../library/CustomPagerSlidingTabStrip.java | 621 ++++----- .../java}/com/lhh/apst/library/Margins.java | 28 +- .../apst/library/utils/TypedAttrUtils.java | 196 +++ .../main/resources/base/element/color.json | 12 + .../main/resources/base/element/float.json | 32 + .../main/resources/base/element/string.json | 16 + .../resources/base/graphic/apsts_tips.xml | 16 + .../base/graphic/psts_background_tab.xml | 16 + .../com/lhh/apst/library/ExampleTest.java | 9 + Pic/Screen_20160216163404.png | Bin 30900 -> 0 bytes Pic/Screen_20160216163428.png | Bin 29537 -> 0 bytes Pic/Screen_20160216163452.png | Bin 28828 -> 0 bytes Pic/Screen_20160411141706.png | Bin 31539 -> 0 bytes Pic/categry_icon_n.png | Bin 1353 -> 0 bytes Pic/categry_icon_p.png | Bin 1303 -> 0 bytes Pic/classify_icon_n.png | Bin 1286 -> 0 bytes Pic/classify_icon_p.png | Bin 1242 -> 0 bytes Pic/mine_icon_n.png | Bin 2185 -> 0 bytes Pic/mine_icon_p.png | Bin 1813 -> 0 bytes Pic/update_dynamic_n.png | Bin 2569 -> 0 bytes Pic/update_dynamic_p.png | Bin 2136 -> 0 bytes README.md | 251 ++-- app/app.iml | 128 -- app/build.gradle | 35 - app/proguard-rules.pro | 17 - .../ApplicationTest.java | 13 - app/src/main/AndroidManifest.xml | 47 - .../APSTSViewPager.java | 30 - .../advancedpagerslidingtabstrip/App.java | 22 - .../CustomTabActivity.java | 178 --- .../IconTabActivity.java | 183 --- .../MainActivity.java | 71 - .../NormalTabActivity.java | 160 --- .../ViewTabActivity.java | 200 --- .../WeiboTabActivity.java | 303 ----- .../com/lhh/apst/fragments/FirstFragment.java | 28 - .../lhh/apst/fragments/FourthFragment.java | 28 - .../lhh/apst/fragments/SecondFragment.java | 28 - .../com/lhh/apst/fragments/ThirdFragment.java | 28 - app/src/main/res/drawable/sub_background.xml | 15 - app/src/main/res/drawable/tab_bg_normal.xml | 4 - .../main/res/drawable/tab_bg_transparent.xml | 4 - app/src/main/res/drawable/tab_bg_white.xml | 4 - .../main/res/drawable/tab_color_select.xml | 8 - .../main/res/drawable/weibo_tab_bg_normal.xml | 4 - .../main/res/layout/activity_custom_tab.xml | 17 - app/src/main/res/layout/activity_icon_tab.xml | 18 - app/src/main/res/layout/activity_main.xml | 37 - .../main/res/layout/activity_normal_tab.xml | 17 - .../main/res/layout/activity_weibo_tab.xml | 32 - .../main/res/layout/custom_disselect_tab.xml | 19 - app/src/main/res/layout/custom_select_tab.xml | 20 - app/src/main/res/layout/first_fragment.xml | 11 - app/src/main/res/layout/fourth_fragment.xml | 11 - app/src/main/res/layout/second_fragment.xml | 11 - app/src/main/res/layout/third_fragment.xml | 11 - app/src/main/res/menu/menu_main.xml | 6 - app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 3418 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 2206 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 4842 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 7718 -> 0 bytes app/src/main/res/values-w820dp/dimens.xml | 6 - app/src/main/res/values/colors.xml | 9 - app/src/main/res/values/dimens.xml | 9 - app/src/main/res/values/strings.xml | 6 - app/src/main/res/values/styles.xml | 58 - build.gradle | 35 +- entry/.gitignore | 1 + entry/build.gradle | 31 + entry/proguard-rules.pro | 1 + entry/src/main/config.json | 99 ++ .../advancedpagerslidingtabstrip/App.java | 30 + .../CustomTabAbility.java | 33 + .../IconTabAbility.java | 33 + .../MainAbility.java | 33 + .../NormalTabAbility.java | 33 + .../ViewTabAbility.java | 33 + .../WeiboTabAbility.java | 33 + .../fragments/BaseFragment.java | 52 + .../fragments/FirstFragment.java | 40 + .../fragments/FourthFragment.java | 40 + .../fragments/SecondFragment.java | 40 + .../fragments/ThirdFragment.java | 40 + .../slice/CustomTabSlice.java | 197 +++ .../slice/IconTabSlice.java | 220 +++ .../slice/MainAbilitySlice.java | 105 ++ .../slice/NormalTabSlice.java | 177 +++ .../slice/ViewTabSlice.java | 265 ++++ .../slice/WeiboTabSlice.java | 352 +++++ .../main/resources/base/element/color.json | 24 + .../main/resources/base/element/float.json | 24 + .../main/resources/base/element/string.json | 12 + .../base/graphic/background_ability_main.xml | 6 + .../base/graphic/background_button.xml | 8 + .../resources/base/graphic/sub_background.xml | 11 + .../resources/base/graphic/sub_bg_normal.xml | 9 + .../resources/base/graphic/sub_bg_pressed.xml | 10 + .../resources/base/graphic/tab_bg_normal.xml | 7 + .../base/graphic/tab_bg_transparent.xml | 7 + .../resources/base/graphic/tab_bg_white.xml | 7 + .../base/graphic/tab_color_select.xml | 24 + .../main/resources/base/graphic/toast_bg.xml | 10 + .../base/graphic/weibo_tab_bg_normal.xml | 7 + .../base/layout/ability_custom_tab.xml | 27 + .../base/layout/ability_icon_tab.xml | 31 + .../resources/base/layout/ability_main.xml | 53 + .../base/layout/ability_normal_tab.xml | 31 + .../base/layout/ability_weibo_tab.xml | 46 + .../base/layout/custom_disselect_tab.xml | 21 + .../base/layout/custom_select_tab.xml | 20 + .../resources/base/layout/first_fragment.xml | 15 + .../resources/base/layout/fourth_fragment.xml | 16 + .../resources/base/layout/layout_toast.xml | 22 + .../resources/base/layout/second_fragment.xml | 16 + .../resources/base/layout/third_fragment.xml | 16 + .../base/media}/home_auther_icon_f_n.png | Bin .../base/media}/home_auther_icon_f_p.png | Bin .../base/media}/home_categry_icon_f_n.png | Bin .../base/media}/home_categry_icon_n.png | Bin .../base/media}/home_live_icon_f_n.png | Bin .../base/media}/home_live_icon_n.png | Bin .../base/media}/home_main_icon_f_n.png | Bin .../base/media}/home_main_icon_n.png | Bin .../base/media}/home_mine_icon_f_n.png | Bin .../base/media}/home_mine_icon_n.png | Bin entry/src/main/resources/base/media/icon.png | Bin 0 -> 6790 bytes .../tabbar_compose_icon_add_highlighted.png | Bin .../resources/base/media}/tabbar_discover.png | Bin .../media}/tabbar_discover_highlighted.png | Bin .../resources/base/media}/tabbar_home.png | Bin .../base/media}/tabbar_home_highlighted.png | Bin .../base/media}/tabbar_home_selected.png | Bin .../base/media}/tabbar_message_center.png | Bin .../tabbar_message_center_highlighted.png | Bin .../resources/base/media}/tabbar_profile.png | Bin .../media}/tabbar_profile_highlighted.png | Bin entry/src/ohosTest/config.json | 41 + .../ExampleOhosTest.java | 14 + .../ExampleTest.java | 9 + gradle.properties | 26 +- gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 58694 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 109 +- gradlew.bat | 33 +- img/page1.png | Bin 0 -> 46534 bytes img/page2.png | Bin 0 -> 53173 bytes img/page3.png | Bin 0 -> 48308 bytes img/page4.png | Bin 0 -> 51560 bytes img/page5.png | Bin 0 -> 54363 bytes local.properties | 13 + settings.gradle | 2 +- 178 files changed, 4799 insertions(+), 3809 deletions(-) delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/copyright/profiles_settings.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 .idea/vcs.xml delete mode 100644 AdvancedPagerSlidingTabStrip.iml create mode 100644 CHANGELOG.md delete mode 100644 ChangLog.md create mode 100644 LICENSE rename {app => Library}/.gitignore (100%) delete mode 100644 Library/AndroidManifest.xml delete mode 100644 Library/Library.iml create mode 100644 Library/proguard-rules.pro delete mode 100644 Library/res/drawable/apsts_tips.xml delete mode 100644 Library/res/drawable/psts_background_tab.xml delete mode 100644 Library/res/values/attrs.xml delete mode 100644 Library/res/values/colors.xml delete mode 100644 Library/res/values/dimens.xml delete mode 100644 Library/res/values/ids.xml delete mode 100644 Library/src/com/lhh/apst/library/AdvancedPagerSlidingTabStrip.java delete mode 100644 Library/src/com/lhh/apst/library/ViewHolder.java create mode 100644 Library/src/main/config.json create mode 100644 Library/src/main/java/com/lhh/apst/library/AdvancedPagerSlidingTabStrip.java rename Library/src/{ => main/java}/com/lhh/apst/library/CustomPagerSlidingTabStrip.java (36%) rename Library/src/{ => main/java}/com/lhh/apst/library/Margins.java (40%) create mode 100644 Library/src/main/java/com/lhh/apst/library/utils/TypedAttrUtils.java create mode 100644 Library/src/main/resources/base/element/color.json create mode 100644 Library/src/main/resources/base/element/float.json create mode 100644 Library/src/main/resources/base/element/string.json create mode 100644 Library/src/main/resources/base/graphic/apsts_tips.xml create mode 100644 Library/src/main/resources/base/graphic/psts_background_tab.xml create mode 100644 Library/src/test/java/com/lhh/apst/library/ExampleTest.java delete mode 100644 Pic/Screen_20160216163404.png delete mode 100644 Pic/Screen_20160216163428.png delete mode 100644 Pic/Screen_20160216163452.png delete mode 100644 Pic/Screen_20160411141706.png delete mode 100755 Pic/categry_icon_n.png delete mode 100755 Pic/categry_icon_p.png delete mode 100755 Pic/classify_icon_n.png delete mode 100755 Pic/classify_icon_p.png delete mode 100755 Pic/mine_icon_n.png delete mode 100755 Pic/mine_icon_p.png delete mode 100755 Pic/update_dynamic_n.png delete mode 100755 Pic/update_dynamic_p.png delete mode 100644 app/app.iml delete mode 100644 app/build.gradle delete mode 100644 app/proguard-rules.pro delete mode 100644 app/src/androidTest/java/com/lhh/apst/advancedpagerslidingtabstrip/ApplicationTest.java delete mode 100644 app/src/main/AndroidManifest.xml delete mode 100644 app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/APSTSViewPager.java delete mode 100644 app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/App.java delete mode 100644 app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/CustomTabActivity.java delete mode 100644 app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/IconTabActivity.java delete mode 100644 app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/MainActivity.java delete mode 100644 app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/NormalTabActivity.java delete mode 100644 app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/ViewTabActivity.java delete mode 100644 app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/WeiboTabActivity.java delete mode 100644 app/src/main/java/com/lhh/apst/fragments/FirstFragment.java delete mode 100644 app/src/main/java/com/lhh/apst/fragments/FourthFragment.java delete mode 100644 app/src/main/java/com/lhh/apst/fragments/SecondFragment.java delete mode 100644 app/src/main/java/com/lhh/apst/fragments/ThirdFragment.java delete mode 100644 app/src/main/res/drawable/sub_background.xml delete mode 100644 app/src/main/res/drawable/tab_bg_normal.xml delete mode 100644 app/src/main/res/drawable/tab_bg_transparent.xml delete mode 100644 app/src/main/res/drawable/tab_bg_white.xml delete mode 100644 app/src/main/res/drawable/tab_color_select.xml delete mode 100644 app/src/main/res/drawable/weibo_tab_bg_normal.xml delete mode 100644 app/src/main/res/layout/activity_custom_tab.xml delete mode 100644 app/src/main/res/layout/activity_icon_tab.xml delete mode 100644 app/src/main/res/layout/activity_main.xml delete mode 100644 app/src/main/res/layout/activity_normal_tab.xml delete mode 100644 app/src/main/res/layout/activity_weibo_tab.xml delete mode 100644 app/src/main/res/layout/custom_disselect_tab.xml delete mode 100644 app/src/main/res/layout/custom_select_tab.xml delete mode 100644 app/src/main/res/layout/first_fragment.xml delete mode 100644 app/src/main/res/layout/fourth_fragment.xml delete mode 100644 app/src/main/res/layout/second_fragment.xml delete mode 100644 app/src/main/res/layout/third_fragment.xml delete mode 100644 app/src/main/res/menu/menu_main.xml delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/values-w820dp/dimens.xml delete mode 100644 app/src/main/res/values/colors.xml delete mode 100644 app/src/main/res/values/dimens.xml delete mode 100644 app/src/main/res/values/strings.xml delete mode 100644 app/src/main/res/values/styles.xml create mode 100644 entry/.gitignore create mode 100644 entry/build.gradle create mode 100644 entry/proguard-rules.pro create mode 100644 entry/src/main/config.json create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/App.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/CustomTabAbility.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/IconTabAbility.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/MainAbility.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/NormalTabAbility.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/ViewTabAbility.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/WeiboTabAbility.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/fragments/BaseFragment.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/fragments/FirstFragment.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/fragments/FourthFragment.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/fragments/SecondFragment.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/fragments/ThirdFragment.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/slice/CustomTabSlice.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/slice/IconTabSlice.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/slice/MainAbilitySlice.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/slice/NormalTabSlice.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/slice/ViewTabSlice.java create mode 100644 entry/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/slice/WeiboTabSlice.java create mode 100644 entry/src/main/resources/base/element/color.json create mode 100644 entry/src/main/resources/base/element/float.json create mode 100644 entry/src/main/resources/base/element/string.json create mode 100644 entry/src/main/resources/base/graphic/background_ability_main.xml create mode 100644 entry/src/main/resources/base/graphic/background_button.xml create mode 100644 entry/src/main/resources/base/graphic/sub_background.xml create mode 100644 entry/src/main/resources/base/graphic/sub_bg_normal.xml create mode 100644 entry/src/main/resources/base/graphic/sub_bg_pressed.xml create mode 100644 entry/src/main/resources/base/graphic/tab_bg_normal.xml create mode 100644 entry/src/main/resources/base/graphic/tab_bg_transparent.xml create mode 100644 entry/src/main/resources/base/graphic/tab_bg_white.xml create mode 100644 entry/src/main/resources/base/graphic/tab_color_select.xml create mode 100644 entry/src/main/resources/base/graphic/toast_bg.xml create mode 100644 entry/src/main/resources/base/graphic/weibo_tab_bg_normal.xml create mode 100644 entry/src/main/resources/base/layout/ability_custom_tab.xml create mode 100644 entry/src/main/resources/base/layout/ability_icon_tab.xml create mode 100644 entry/src/main/resources/base/layout/ability_main.xml create mode 100644 entry/src/main/resources/base/layout/ability_normal_tab.xml create mode 100644 entry/src/main/resources/base/layout/ability_weibo_tab.xml create mode 100644 entry/src/main/resources/base/layout/custom_disselect_tab.xml create mode 100644 entry/src/main/resources/base/layout/custom_select_tab.xml create mode 100644 entry/src/main/resources/base/layout/first_fragment.xml create mode 100644 entry/src/main/resources/base/layout/fourth_fragment.xml create mode 100644 entry/src/main/resources/base/layout/layout_toast.xml create mode 100644 entry/src/main/resources/base/layout/second_fragment.xml create mode 100644 entry/src/main/resources/base/layout/third_fragment.xml rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_auther_icon_f_n.png (100%) rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_auther_icon_f_p.png (100%) rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_categry_icon_f_n.png (100%) rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_categry_icon_n.png (100%) rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_live_icon_f_n.png (100%) rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_live_icon_n.png (100%) rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_main_icon_f_n.png (100%) rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_main_icon_n.png (100%) rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_mine_icon_f_n.png (100%) rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/home_mine_icon_n.png (100%) create mode 100644 entry/src/main/resources/base/media/icon.png rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_compose_icon_add_highlighted.png (100%) mode change 100755 => 100644 rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_discover.png (100%) mode change 100755 => 100644 rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_discover_highlighted.png (100%) mode change 100755 => 100644 rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_home.png (100%) mode change 100755 => 100644 rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_home_highlighted.png (100%) mode change 100755 => 100644 rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_home_selected.png (100%) mode change 100755 => 100644 rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_message_center.png (100%) mode change 100755 => 100644 rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_message_center_highlighted.png (100%) mode change 100755 => 100644 rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_profile.png (100%) mode change 100755 => 100644 rename {app/src/main/res/mipmap-xhdpi => entry/src/main/resources/base/media}/tabbar_profile_highlighted.png (100%) mode change 100755 => 100644 create mode 100644 entry/src/ohosTest/config.json create mode 100644 entry/src/ohosTest/java/com/lhh/apst/advancedpagerslidingtabstrip/ExampleOhosTest.java create mode 100644 entry/src/test/java/com/lhh/apst/advancedpagerslidingtabstrip/ExampleTest.java create mode 100644 img/page1.png create mode 100644 img/page2.png create mode 100644 img/page3.png create mode 100644 img/page4.png create mode 100644 img/page5.png create mode 100644 local.properties diff --git a/.gitignore b/.gitignore index afbdab3..37a4eb8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,15 @@ +*.iml .gradle /local.properties -/.idea/workspace.xml +/.idea/caches /.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml .DS_Store /build +/captures +.externalNativeBuild +/entry/.preview +.cxx diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 96cc43e..0000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf3..0000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index b02ee6e..0000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index fbb6828..0000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 8905d9e..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460..0000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/AdvancedPagerSlidingTabStrip.iml b/AdvancedPagerSlidingTabStrip.iml deleted file mode 100644 index 668b6fb..0000000 --- a/AdvancedPagerSlidingTabStrip.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..245e84a --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +## 0.0.1-SNAPSHOT +* refactor: For module library Android-to-OpenHarmony + +## 1.4.0 +* 添加新的provider以及tab等新的设置。 + +## 1.3.0 +* 修改参数属性,将tab标签换为apTab开头标签,避免与support包冲突。 \ No newline at end of file diff --git a/ChangLog.md b/ChangLog.md deleted file mode 100644 index 4b3da4a..0000000 --- a/ChangLog.md +++ /dev/null @@ -1,9 +0,0 @@ -##更新日志 - -v1.4.0 - -添加新的provider以及tab等新的设置。 - -v1.3.0 - -修改参数属性,将tab标签换为apTab开头标签,避免与support包冲突。 \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/app/.gitignore b/Library/.gitignore similarity index 100% rename from app/.gitignore rename to Library/.gitignore diff --git a/Library/AndroidManifest.xml b/Library/AndroidManifest.xml deleted file mode 100644 index 4824669..0000000 --- a/Library/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - \ No newline at end of file diff --git a/Library/Library.iml b/Library/Library.iml deleted file mode 100644 index ea7bea3..0000000 --- a/Library/Library.iml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Library/build.gradle b/Library/build.gradle index 4e22795..da08760 100644 --- a/Library/build.gradle +++ b/Library/build.gradle @@ -1,27 +1,22 @@ -apply plugin: 'com.android.library' - -dependencies { - compile 'com.android.support:appcompat-v7:23.1.0' -} - -android { - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - resources.srcDirs = ['src'] - aidl.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - res.srcDirs = ['res'] - assets.srcDirs = ['assets'] - } - } +apply plugin: 'com.huawei.ohos.library' +ohos { + compileSdkVersion 5 defaultConfig { - minSdkVersion 9 - compileSdkVersion 23 - buildToolsVersion "23.0.1" + compatibleSdkVersion 4 + } + buildTypes { + release { + proguardOpt { + proguardEnabled false + rulesFiles 'proguard-rules.pro' + } + } } + } -apply from: 'https://raw.githubusercontent.com/HomHomLin/Gradle-Publish/master/bintray.gradle' \ No newline at end of file +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + testImplementation 'junit:junit:4.13' +} diff --git a/Library/proguard-rules.pro b/Library/proguard-rules.pro new file mode 100644 index 0000000..f7666e4 --- /dev/null +++ b/Library/proguard-rules.pro @@ -0,0 +1 @@ +# config module specific ProGuard rules here. \ No newline at end of file diff --git a/Library/res/drawable/apsts_tips.xml b/Library/res/drawable/apsts_tips.xml deleted file mode 100644 index e0439d4..0000000 --- a/Library/res/drawable/apsts_tips.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/Library/res/drawable/psts_background_tab.xml b/Library/res/drawable/psts_background_tab.xml deleted file mode 100644 index 885cf03..0000000 --- a/Library/res/drawable/psts_background_tab.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/Library/res/values/attrs.xml b/Library/res/values/attrs.xml deleted file mode 100644 index 936c28b..0000000 --- a/Library/res/values/attrs.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Library/res/values/colors.xml b/Library/res/values/colors.xml deleted file mode 100644 index 2dea27c..0000000 --- a/Library/res/values/colors.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - #6633B5E5 - #E43F3E - \ No newline at end of file diff --git a/Library/res/values/dimens.xml b/Library/res/values/dimens.xml deleted file mode 100644 index 99a8db4..0000000 --- a/Library/res/values/dimens.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - 10dp - 4dp - 9dp - 8dp - 7dp - 23dp - 10sp - \ No newline at end of file diff --git a/Library/res/values/ids.xml b/Library/res/values/ids.xml deleted file mode 100644 index 56a4372..0000000 --- a/Library/res/values/ids.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - 888 - \ No newline at end of file diff --git a/Library/src/com/lhh/apst/library/AdvancedPagerSlidingTabStrip.java b/Library/src/com/lhh/apst/library/AdvancedPagerSlidingTabStrip.java deleted file mode 100644 index 105db22..0000000 --- a/Library/src/com/lhh/apst/library/AdvancedPagerSlidingTabStrip.java +++ /dev/null @@ -1,1091 +0,0 @@ -package com.lhh.apst.library; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.Paint; -import android.graphics.Paint.Style; -import android.graphics.Rect; -import android.graphics.Typeface; -import android.graphics.drawable.BitmapDrawable; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.v4.content.res.ResourcesCompat; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.util.DisplayMetrics; -import android.util.SparseArray; -import android.util.TypedValue; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.widget.HorizontalScrollView; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import java.util.Locale; - -/** - * Created by linhomhom on 2015/8/10. - */ -public class AdvancedPagerSlidingTabStrip extends HorizontalScrollView { - - public interface LayoutProvider { - public float getPageWeight(int position); - public int[] getPageRule(int position); - public Margins getPageMargins(int position); - } - - public interface TipsProvider { - public int[] getTipsRule(int position); - public Margins getTipsMargins(int position); - public Drawable getTipsDrawable(int position); - } - - public interface IconTabProvider { - public T getPageIcon(int position); - public T getPageSelectIcon(int position); - public Rect getPageIconBounds(int position); - } - - public interface ViewTabProvider{ -// public View onCreateIconView(int position, View view, ViewGroup parent); - public View onSelectIconView(int position, View view, ViewGroup parent); - public View onIconView(int position, View view, ViewGroup parent); - } - - // @formatter:off - private static final int[] ATTRS = new int[]{ - android.R.attr.textSize, - android.R.attr.textColor - }; - // @formatter:on - private LinearLayout.LayoutParams expandedTabLayoutParams; - - private final PageListener pageListener = new PageListener(); - public ViewPager.OnPageChangeListener delegatePageListener; - - private LinearLayout tabsContainer; - private ViewPager pager; - - private int tabCount; - - private int currentPosition = 0; - private float currentPositionOffset = 0f; - - private Paint rectPaint; - private Paint dividerPaint; - - private boolean checkedTabWidths = false; - - private int indicatorColor = 0xFF666666; - private int underlineColor = 0x1A000000; - private int dividerColor = 0x1A000000; - - private boolean shouldExpand = true; - private boolean textAllCaps = true; - - private int scrollOffset = 52; - private int indicatorHeight = 3; - private int underlineHeight = 2; - private int dividerPadding = 12; - private int tabPadding = 24; - private int tabPaddingTopBottom = 0; - private int dividerWidth = 1; - - private int tabTextSize = 15; - private int tabTextColor = 0xFF666666; - private int tabTextSelectColor = 0xFF666666; - private Typeface tabTypeface = null; - private int tabTypefaceStyle = Typeface.NORMAL; - private int tabDrawMode = DRAW_MODE_NORMAL; - - public static final int DRAW_MODE_NORMAL = 0; - public static final int DRAW_MODE_TEXT = 1; - - private int lastScrollX = 0; - - private int tabBackgroundResId = R.drawable.psts_background_tab; -// private int tabBackgroundResId; - - private Locale locale; - private OnTabClickListener mOnTabClickListener; - public interface OnTabClickListener{ - public void onClick(int pos); - } - - public AdvancedPagerSlidingTabStrip(Context context) { - this(context, null); - } - - public AdvancedPagerSlidingTabStrip(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public AdvancedPagerSlidingTabStrip(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - setFillViewport(true); - setWillNotDraw(false); - - tabsContainer = new LinearLayout(context); - tabsContainer.setOrientation(LinearLayout.HORIZONTAL); - tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - addView(tabsContainer); - - DisplayMetrics dm = getResources().getDisplayMetrics(); - - scrollOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, scrollOffset, dm); - indicatorHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, indicatorHeight, dm); - underlineHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, underlineHeight, dm); - dividerPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerPadding, dm); - tabPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, tabPadding, dm); - dividerWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerWidth, dm); - tabTextSize = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, tabTextSize, dm); - - // get system attrs (android:textSize and android:textColor) - - TypedArray a = context.obtainStyledAttributes(attrs, ATTRS); - - tabTextSize = a.getDimensionPixelSize(0, tabTextSize); - tabTextColor = a.getColor(1, tabTextColor); - - a.recycle(); - - // get custom attrs - - - a = context.obtainStyledAttributes(attrs, R.styleable.AdvancedPagerSlidingTabStrip); - - indicatorColor = a.getColor(R.styleable.AdvancedPagerSlidingTabStrip_apTabIndicatorColor, indicatorColor); - underlineColor = a.getColor(R.styleable.AdvancedPagerSlidingTabStrip_apTabUnderlineColor, underlineColor); - dividerColor = a.getColor(R.styleable.AdvancedPagerSlidingTabStrip_apTabDividerColor, dividerColor); - indicatorHeight = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabIndicatorHeight, indicatorHeight); - underlineHeight = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabUnderlineHeight, underlineHeight); - dividerPadding = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabDividerPadding, dividerPadding); - tabPadding = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabPaddingLeftRight, tabPadding); - tabPaddingTopBottom = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabPaddingTopBottom, tabPaddingTopBottom); - tabBackgroundResId = a.getResourceId(R.styleable.AdvancedPagerSlidingTabStrip_apTabBackground, tabBackgroundResId); - shouldExpand = a.getBoolean(R.styleable.AdvancedPagerSlidingTabStrip_apTabShouldExpand, shouldExpand); - scrollOffset = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabScrollOffset, scrollOffset); - textAllCaps = a.getBoolean(R.styleable.AdvancedPagerSlidingTabStrip_apTabTextAllCaps, textAllCaps); - tabTextSelectColor = a.getColor(R.styleable.AdvancedPagerSlidingTabStrip_apTabTextSelectColor, dividerColor); - tabDrawMode = a.getInteger(R.styleable.AdvancedPagerSlidingTabStrip_apTabDrawMode,DRAW_MODE_NORMAL); - - a.recycle(); - - rectPaint = new Paint(); - rectPaint.setAntiAlias(true); - rectPaint.setStyle(Style.FILL); - - dividerPaint = new Paint(); - dividerPaint.setAntiAlias(true); - dividerPaint.setStrokeWidth(dividerWidth); - -// defaultTabLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); - expandedTabLayoutParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f); - - if (locale == null) { - locale = getResources().getConfiguration().locale; - } - - if(mViewTabCache == null){ - mViewTabCache = new SparseArray<>(); - } - } - - public void setOnTabClickListener(OnTabClickListener onTabClickListener){ - mOnTabClickListener = onTabClickListener; - } - - public void setViewPager(ViewPager pager) { - this.pager = pager; - - if (pager.getAdapter() == null) { - throw new IllegalStateException("ViewPager does not have adapter instance."); - } - - pager.addOnPageChangeListener(pageListener); - - notifyDataSetChanged(); - } - - public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { - this.delegatePageListener = listener; - } - - public void notifyDataSetChanged() { - - tabsContainer.removeAllViews(); - - tabCount = pager.getAdapter().getCount(); - - for (int i = 0; i < tabCount; i++) { - - if (pager.getAdapter() instanceof IconTabProvider) { - addIconTab(i, ((IconTabProvider) pager.getAdapter()).getPageIcon(i), pager.getAdapter().getPageTitle(i).toString()); - } else if(pager.getAdapter() instanceof ViewTabProvider){ - addViewTab(i, ((ViewTabProvider) pager.getAdapter()),pager.getAdapter().getPageTitle(i).toString()); - } else { -// addIconTab(i, R.drawable.home_categry_icon_n, pager.getAdapter().getPageTitle(i).toString()); - - addTextTab(i, pager.getAdapter().getPageTitle(i).toString()); - } - - } - - updateTabStyles(); - - checkedTabWidths = false; - - getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { - - @SuppressWarnings("deprecation") - @SuppressLint("NewApi") - @Override - public void onGlobalLayout() { - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { - getViewTreeObserver().removeGlobalOnLayoutListener(this); - } else { - getViewTreeObserver().removeOnGlobalLayoutListener(this); - } - - currentPosition = pager.getCurrentItem(); - scrollToChild(currentPosition, 0); - } - }); - - pageListener.onPageSelected(0);//default - - } - - private void addTextTab(final int position, String title) { - - RelativeLayout tab = new RelativeLayout(getContext()); - tab.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if(mOnTabClickListener != null){ - mOnTabClickListener.onClick(position); - } - scrollToChild(position, 0); - pager.setCurrentItem(position); - } - }); - - TextView txt = new TextView(getContext()); - txt.setText(title); - txt.setFocusable(true); - txt.setGravity(Gravity.CENTER); - txt.setSingleLine(); - txt.setId(R.id.id_tab_txt); - RelativeLayout.LayoutParams txtParams = new RelativeLayout.LayoutParams( - RelativeLayout.LayoutParams.WRAP_CONTENT, - RelativeLayout.LayoutParams.WRAP_CONTENT); - txtParams.addRule(RelativeLayout.CENTER_IN_PARENT); - if(pager.getAdapter() instanceof LayoutProvider){ - LayoutProvider layoutProvider = (LayoutProvider)pager.getAdapter(); - for(Integer rule : layoutProvider.getPageRule(position)){ - txtParams.addRule(rule); - } - Margins margins = layoutProvider.getPageMargins(position); - if(margins != null) { - txtParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); - } - } -// txtParams.addRule(RelativeLayout.CENTER_IN_PARENT); - txt.setLayoutParams(txtParams); - - RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(getResources().getDimensionPixelSize(R.dimen.psts_dot_wh), getResources().getDimensionPixelSize(R.dimen.psts_dot_wh)); - TextView dot = new TextView(getContext()); - dot.setTextColor(Color.WHITE); - dot.setBackgroundColor(Color.BLUE); - dot.setGravity(Gravity.CENTER); - dot.setSingleLine(); - dot.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.psts_dot_txt_size)); - //16 new - Drawable dot_drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.apsts_tips, null); - - - boolean hasRule = false; - layoutParams.setMargins(0, 0, getResources().getDimensionPixelSize(R.dimen.psts_dot_m_right), 0); - if(pager.getAdapter() instanceof TipsProvider){ - TipsProvider tipsProvider = (TipsProvider)pager.getAdapter(); - for(Integer rule : tipsProvider.getTipsRule(position)){ - layoutParams.addRule(rule); - hasRule = true; - } - Margins margins = tipsProvider.getTipsMargins(position); - if(margins != null) { - layoutParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); - } - Drawable drawable = tipsProvider.getTipsDrawable(position); - if(drawable != null){ - dot_drawable = drawable; - - } - } - - if(!hasRule){ -// layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); - layoutParams.addRule(RelativeLayout.ALIGN_RIGHT, R.id.id_tab_txt); - layoutParams.addRule(RelativeLayout.ALIGN_TOP, R.id.id_tab_txt); - int halfSize = getResources().getDimensionPixelSize(R.dimen.psts_dot_m_tv_right); - layoutParams.setMargins(0, 0, -halfSize, 0); - } - - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - dot.setBackground(dot_drawable); - }else{ - dot.setBackgroundDrawable(dot_drawable); - } - dot.setLayoutParams(layoutParams); - - tab.addView(txt); - tab.addView(dot); - dot.setVisibility(View.GONE); - tabsContainer.addView(tab); - - } - - public void showDot(int index) { - RelativeLayout tab = (RelativeLayout) tabsContainer.getChildAt(index); - TextView dot_layout = (TextView) tab.getChildAt(tab.getChildCount() - 1); - dot_layout.setText(""); - RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)dot_layout.getLayoutParams(); - layoutParams.width = getResources().getDimensionPixelSize(R.dimen.psts_dot_wh); - layoutParams.height = getResources().getDimensionPixelSize(R.dimen.psts_dot_wh); - - dot_layout.setVisibility(View.VISIBLE); - } - - public void showDot(int index,String dotTxt) { - RelativeLayout tab = (RelativeLayout) tabsContainer.getChildAt(index); - TextView dot_layout = (TextView) tab.getChildAt(tab.getChildCount() - 1); - RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)dot_layout.getLayoutParams(); - layoutParams.width = RelativeLayout.LayoutParams.WRAP_CONTENT; - layoutParams.height = RelativeLayout.LayoutParams.WRAP_CONTENT; - dot_layout.setText(dotTxt); - dot_layout.setVisibility(View.VISIBLE); - } - - public void hideDot(int index) { - RelativeLayout tab = (RelativeLayout) tabsContainer.getChildAt(index); - TextView dot_layout = (TextView) tab.getChildAt(tab.getChildCount() - 1); - dot_layout.setVisibility(View.GONE); - } - - private SparseArray mViewTabCache;//缓存 - - private View getTabView(int position){ - return mViewTabCache.get(position); - } - - private void setTabView( int position ,View view){ - mViewTabCache.put(position, view); - } - - private void addViewTab(final int position, ViewTabProvider provider, String title) { - - RelativeLayout tab = new RelativeLayout(getContext()); - tab.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if(mOnTabClickListener != null){ - mOnTabClickListener.onClick(position); - } - scrollToChild(position, 0); - pager.setCurrentItem(position); - } - }); - - //文本和图 - TextView txt = new TextView(getContext()); - txt.setText(title); - txt.setFocusable(true); - txt.setGravity(Gravity.CENTER); - txt.setSingleLine(); - txt.setId(R.id.id_tab_txt); - RelativeLayout.LayoutParams txtParams = new RelativeLayout.LayoutParams( - RelativeLayout.LayoutParams.WRAP_CONTENT, - RelativeLayout.LayoutParams.WRAP_CONTENT); - txtParams.addRule(RelativeLayout.CENTER_HORIZONTAL); - txtParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - if(pager.getAdapter() instanceof LayoutProvider){ - LayoutProvider layoutProvider = (LayoutProvider)pager.getAdapter(); - for(Integer rule : layoutProvider.getPageRule(position)){ - txtParams.addRule(rule); - } - Margins margins = layoutProvider.getPageMargins(position); - if(margins != null) { - txtParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); - } - } - txtParams.addRule(RelativeLayout.CENTER_HORIZONTAL); - txtParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - txt.setLayoutParams(txtParams); - - //使用缓存 - View view = provider.onIconView(position, getTabView(position), tab); - setTabView(position, view);//保存view到缓存中 - RelativeLayout.LayoutParams viewLayoutParams - = (RelativeLayout.LayoutParams)view.getLayoutParams(); - viewLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL); - viewLayoutParams.addRule(RelativeLayout.ABOVE, R.id.id_tab_txt); - - - RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(getResources().getDimensionPixelSize(R.dimen.psts_dot_wh), getResources().getDimensionPixelSize(R.dimen.psts_dot_wh)); - TextView dot = new TextView(getContext()); - dot.setTextColor(Color.WHITE); - dot.setBackgroundColor(Color.BLUE); - dot.setGravity(Gravity.CENTER); - dot.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.psts_dot_txt_size)); - dot.setSingleLine(); - - Drawable dot_drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.apsts_tips, null); - - boolean hasRule = false; - layoutParams.setMargins(0, 0, getResources().getDimensionPixelSize(R.dimen.psts_dot_m_right), 0); - if(pager.getAdapter() instanceof TipsProvider){ - TipsProvider tipsProvider = (TipsProvider)pager.getAdapter(); - for(Integer rule : tipsProvider.getTipsRule(position)){ - layoutParams.addRule(rule); - hasRule = true; - } - Margins margins = tipsProvider.getTipsMargins(position); - if(margins != null) { - layoutParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); - } - Drawable drawable = tipsProvider.getTipsDrawable(position); - if(drawable != null){ - dot_drawable = drawable; - - } - } - - if(!hasRule){ - layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); - } - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - dot.setBackground(dot_drawable); - }else{ - dot.setBackgroundDrawable(dot_drawable); - } - dot.setLayoutParams(layoutParams); - - tab.addView(txt); - tab.addView(view); - tab.addView(dot); - dot.setVisibility(View.GONE); - tabsContainer.addView(tab); - - } - - private void addIconTab(final int position, Object res, String text) { - - RelativeLayout tab = new RelativeLayout(getContext()); - tab.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - if(mOnTabClickListener != null){ - mOnTabClickListener.onClick(position); - } - scrollToChild(position, 0); - pager.setCurrentItem(position); - } - }); - - //文本和图 - TextView txt = new TextView(getContext()); - txt.setText(text); - txt.setFocusable(true); - txt.setGravity(Gravity.CENTER); - txt.setSingleLine(); - txt.setId(R.id.id_tab_txt); - RelativeLayout.LayoutParams txtParams = new RelativeLayout.LayoutParams( - RelativeLayout.LayoutParams.WRAP_CONTENT, - RelativeLayout.LayoutParams.WRAP_CONTENT); - txtParams.addRule(RelativeLayout.CENTER_IN_PARENT); - if(pager.getAdapter() instanceof LayoutProvider){ - LayoutProvider layoutProvider = (LayoutProvider)pager.getAdapter(); - for(Integer rule : layoutProvider.getPageRule(position)){ - txtParams.addRule(rule); - - } - Margins margins = layoutProvider.getPageMargins(position); - if(margins != null) { - txtParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); - } - } -// txtParams.addRule(RelativeLayout.CENTER_IN_PARENT); - txt.setLayoutParams(txtParams); - - setViewResource(position,res, txt); - - RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(getResources().getDimensionPixelSize(R.dimen.psts_dot_wh), getResources().getDimensionPixelSize(R.dimen.psts_dot_wh)); - TextView dot = new TextView(getContext()); - dot.setTextColor(Color.WHITE); - dot.setBackgroundColor(Color.BLUE); - dot.setGravity(Gravity.CENTER); - dot.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimensionPixelSize(R.dimen.psts_dot_txt_size)); - dot.setSingleLine(); - Drawable dot_drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.apsts_tips, null); - - boolean hasRule = false; - layoutParams.setMargins(0, 0, getResources().getDimensionPixelSize(R.dimen.psts_dot_m_right), 0); - if(pager.getAdapter() instanceof TipsProvider){ - TipsProvider tipsProvider = (TipsProvider)pager.getAdapter(); - for(Integer rule : tipsProvider.getTipsRule(position)){ - layoutParams.addRule(rule); - hasRule = true; - } - Margins margins = tipsProvider.getTipsMargins(position); - if(margins != null) { - layoutParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); - } - Drawable drawable = tipsProvider.getTipsDrawable(position); - if(drawable != null){ - dot_drawable = drawable; - - } - } - - if(!hasRule){ - layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); - } - - if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - dot.setBackground(dot_drawable); - }else{ - dot.setBackgroundDrawable(dot_drawable); - } - dot.setLayoutParams(layoutParams); - - tab.addView(txt); - tab.addView(dot); - dot.setVisibility(View.GONE); - tabsContainer.addView(tab); - - } - - public View getTabAt(int pos) { - if (pos >= tabsContainer.getChildCount()) { - throw new IllegalStateException("pos is too big."); - } - return tabsContainer.getChildAt(pos); - } - - private void updateTabStyles() { - - for (int i = 0; i < tabCount; i++) { - - View v = tabsContainer.getChildAt(i); - - //v.setLayoutParams(defaultTabLayoutParams); - //my modify - v.setLayoutParams(expandedTabLayoutParams); - v.setBackgroundResource(tabBackgroundResId); - if (shouldExpand) { - v.setPadding(0, 0, 0, 0); - } else { - v.setPadding(tabPadding, tabPaddingTopBottom, tabPadding, tabPaddingTopBottom); - } - - if (v instanceof RelativeLayout) { - - RelativeLayout tab = (RelativeLayout) v; - TextView tv = (TextView)tab.getChildAt(0); - tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, tabTextSize); - tv.setTypeface(tabTypeface, tabTypefaceStyle); - tv.setTextColor(tabTextColor); - - // setAllCaps() is only available from API 14, so the upper case is made manually if we are on a - // pre-ICS-build - if (textAllCaps) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { - tv.setAllCaps(true); - } else { - tv.setText(tv.getText().toString().toUpperCase(locale)); - } - } - } - } - - } - - public boolean setTabLayoutParams(){ - if(pager.getAdapter() instanceof LayoutProvider){ - LayoutProvider weightProvider = (LayoutProvider)pager.getAdapter(); - if(weightProvider == null){ - return false; - } - for (int i = 0; i < tabCount; i++) { - float weight = weightProvider.getPageWeight(i); - if(weight != 0.0f){ - LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, weight == 0.0f ? 1.0f : weight); - tabsContainer.getChildAt(i).setLayoutParams(layoutParams); - }else{ - tabsContainer.getChildAt(i).setLayoutParams(expandedTabLayoutParams); - } - - } - } - return false; - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - if (!shouldExpand || MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED) { - setTabLayoutParams(); - return; - } - - int myWidth = getMeasuredWidth(); - int childWidth = 0; - for (int i = 0; i < tabCount; i++) { - childWidth += tabsContainer.getChildAt(i).getMeasuredWidth(); - } - - if (!checkedTabWidths && childWidth > 0 && myWidth > 0) { - - if (childWidth <= myWidth) { - if(!setTabLayoutParams()){ - for (int i = 0; i < tabCount; i++) { - tabsContainer.getChildAt(i).setLayoutParams(expandedTabLayoutParams); - } - } - } - - checkedTabWidths = true; - } - } - - private void scrollToChild(int position, int offset) { - - if (tabCount == 0) { - return; - } - - int newScrollX = tabsContainer.getChildAt(position).getLeft() + offset; - - if (position > 0 || offset > 0) { - newScrollX -= scrollOffset; - } - - if (newScrollX != lastScrollX) { - lastScrollX = newScrollX; - scrollTo(newScrollX, 0); - } - - } - - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - if (isInEditMode() || tabCount == 0) { - return; - } - - if(tabDrawMode == DRAW_MODE_NORMAL) { - drawTabNormalMode(canvas); - }else { - drawTabTextMode(canvas); - } - } - - private void drawTabNormalMode(Canvas canvas){ - final int height = getHeight(); - - // 设置提示下划线的颜色 - - rectPaint.setColor(indicatorColor); - - View currentTab = tabsContainer.getChildAt(currentPosition); - float lineLeft = currentTab.getLeft(); - float lineRight = currentTab.getRight(); - - if (currentPositionOffset > 0f && currentPosition < tabCount - 1) { - - View nextTab = tabsContainer.getChildAt(currentPosition + 1); - final float nextTabLeft = nextTab.getLeft(); - final float nextTabRight = nextTab.getRight(); - - lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft); - lineRight = (currentPositionOffset * nextTabRight + (1f - currentPositionOffset) * lineRight); - - } - - //绘制提示下划线 - canvas.drawRect(lineLeft , height - indicatorHeight, lineRight , height, rectPaint); - - // 绘制下划线 - - rectPaint.setColor(underlineColor); - canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint); - - // 绘制分割线 - - dividerPaint.setColor(dividerColor); - for (int i = 0; i < tabCount - 1; i++) { - View tab = tabsContainer.getChildAt(i); - canvas.drawLine(tab.getRight(), dividerPadding, tab.getRight(), height - dividerPadding, dividerPaint); - } - } - - private void drawTabTextMode(Canvas canvas){ - - final int height = getHeight(); - - // 设置提示下划线的颜色 - - rectPaint.setColor(indicatorColor); - - View currentTab = tabsContainer.getChildAt(currentPosition); - float lineLeft = currentTab.getLeft(); - - View currentTextView = ((RelativeLayout)currentTab).getChildAt(0); - float currentTextViewLeft = currentTextView.getLeft(); - float currentTextViewRight = currentTextView.getRight(); - - // if there is an offset, start interpolating left and right coordinates between current and next tab - if (currentPositionOffset > 0f && currentPosition < tabCount - 1) { - - View nextTab = tabsContainer.getChildAt(currentPosition + 1); - final float nextTabLeft = nextTab.getLeft(); - - lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft); - - View nextTextView = ((RelativeLayout)nextTab).getChildAt(0); - float nextTextViewLeft = nextTextView.getLeft(); - float nextTextViewRight = nextTextView.getRight(); - - currentTextViewLeft = (currentPositionOffset * nextTextViewLeft + (1f - currentPositionOffset) * currentTextViewLeft); - currentTextViewRight = (currentPositionOffset * nextTextViewRight + (1f - currentPositionOffset) * currentTextViewRight); - } - - //绘制提示下划线 - float r = ((float)indicatorHeight) / 2; - canvas.drawCircle(lineLeft + currentTextViewLeft + r,height - indicatorHeight + r,r,rectPaint); - canvas.drawCircle(lineLeft + currentTextViewRight - r,height - indicatorHeight + r,r,rectPaint); - - canvas.drawRect(lineLeft + currentTextViewLeft + r, height - indicatorHeight, lineLeft + currentTextViewRight-r , height, rectPaint); - - // 分割线paint - - dividerPaint.setColor(dividerColor); - - // 下划线paint - rectPaint.setColor(underlineColor); - - for (int i = 0; i < tabCount; i++) { - View tab = tabsContainer.getChildAt(i); - //绘制分割线 - if(i < tabCount - 1) { - canvas.drawLine(tab.getRight(), dividerPadding, tab.getRight(), height - dividerPadding, dividerPaint); - } - View tabTextView = ((RelativeLayout)tab).getChildAt(0); - canvas.drawRect(tab.getLeft() + tabTextView.getLeft(), height - underlineHeight, tab.getLeft() + tabTextView.getRight(), height, rectPaint); - } - } - - private class PageListener implements ViewPager.OnPageChangeListener { - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - currentPosition = position; - currentPositionOffset = positionOffset; - - if (tabsContainer != null && tabsContainer.getChildAt(position) != null) { - scrollToChild(position, (int) (positionOffset * tabsContainer.getChildAt(position).getWidth())); - } - - invalidate(); - - if (delegatePageListener != null) { - delegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels); - } - } - - @Override - public void onPageScrollStateChanged(int state) { - if (state == ViewPager.SCROLL_STATE_IDLE) { - scrollToChild(pager.getCurrentItem(), 0); - } - - if (delegatePageListener != null) { - delegatePageListener.onPageScrollStateChanged(state); - } - } - - @Override - public void onPageSelected(int position) { - - setSelectItem(position); - - if (delegatePageListener != null) { - delegatePageListener.onPageSelected(position); - } - } - - } - - private void setViewResource(int position ,Object obj , TextView view){ - IconTabProvider iconTabProvider = (IconTabProvider)pager.getAdapter(); - Rect rect = iconTabProvider.getPageIconBounds(position); - Drawable drawable = null; - if(obj instanceof Integer) { - int resId = (int) obj; - if (resId != 0) { - drawable = ResourcesCompat.getDrawable(getResources(),resId,null); - } - }else if(obj instanceof Bitmap){ - Bitmap bitmap = (Bitmap) obj; - if (bitmap != null) { - drawable = new BitmapDrawable(getResources(),bitmap); - } - }else if(obj instanceof Drawable){ - drawable = (Drawable) obj; - - } - - if (drawable != null) { - if(rect != null){ - drawable.setBounds(rect); - view.setCompoundDrawables(null, drawable, null, null); - }else{ - view.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null); - } - } - } - - public void setSelectItem(int position){ - for (int i = 0; i < tabsContainer.getChildCount(); i++) { - RelativeLayout linearLayout = ((RelativeLayout) tabsContainer.getChildAt(i)); - if (i == position) { - ((TextView) linearLayout.getChildAt(0)).setTextColor(tabTextSelectColor); - if (pager.getAdapter() instanceof IconTabProvider) { - Object obj = ((IconTabProvider) pager.getAdapter()).getPageSelectIcon(i); - setViewResource(position, obj, (TextView) linearLayout.getChildAt(0)); -// ().setCompoundDrawablesWithIntrinsicBounds(0, ((IconTabProvider) pager.getAdapter()).getPageIconSelectResId(i), 0, 0); - }else if(pager.getAdapter() instanceof ViewTabProvider){ - View view = ((ViewTabProvider) pager.getAdapter()).onSelectIconView(i,getTabView(i),linearLayout); - setTabView(i,view); - } -// ((TextView) linearLayout.getChildAt(0)).setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.home_categry_icon_f_n, 0, 0); - } else { - ((TextView) linearLayout.getChildAt(0)).setTextColor(tabTextColor); - if (pager.getAdapter() instanceof IconTabProvider) { - Object obj = ((IconTabProvider) pager.getAdapter()).getPageIcon(i); - setViewResource(position, obj, (TextView) linearLayout.getChildAt(0)); -// ((TextView) linearLayout.getChildAt(0)).setCompoundDrawablesWithIntrinsicBounds(0, ((IconTabProvider) pager.getAdapter()).getPageIconResId(i), 0, 0); - }else if(pager.getAdapter() instanceof ViewTabProvider){ - View view = ((ViewTabProvider) pager.getAdapter()).onIconView(i, getTabView(i), linearLayout); - setTabView(i,view); - } -// ((TextView) linearLayout.getChildAt(0)).setCompoundDrawablesWithIntrinsicBounds(0, R.drawable.home_categry_icon_n, 0, 0); - - } - } - } - - public void setIndicatorColor(int indicatorColor) { - this.indicatorColor = indicatorColor; - invalidate(); - } - - public void setIndicatorColorResource(int resId) { - this.indicatorColor = getResources().getColor(resId); - invalidate(); - } - - public int getIndicatorColor() { - return this.indicatorColor; - } - - public void setIndicatorHeight(int indicatorLineHeightPx) { - this.indicatorHeight = indicatorLineHeightPx; - invalidate(); - } - - public int getIndicatorHeight() { - return indicatorHeight; - } - - public void setUnderlineColor(int underlineColor) { - this.underlineColor = underlineColor; - invalidate(); - } - - public void setUnderlineColorResource(int resId) { - this.underlineColor = getResources().getColor(resId); - invalidate(); - } - - public int getUnderlineColor() { - return underlineColor; - } - - public void setDividerColor(int dividerColor) { - this.dividerColor = dividerColor; - invalidate(); - } - - public void setDividerColorResource(int resId) { - this.dividerColor = getResources().getColor(resId); - invalidate(); - } - - public int getDividerColor() { - return dividerColor; - } - - public void setUnderlineHeight(int underlineHeightPx) { - this.underlineHeight = underlineHeightPx; - invalidate(); - } - - public int getUnderlineHeight() { - return underlineHeight; - } - - public void setDividerPadding(int dividerPaddingPx) { - this.dividerPadding = dividerPaddingPx; - invalidate(); - } - - public int getDividerPadding() { - return dividerPadding; - } - - public void setScrollOffset(int scrollOffsetPx) { - this.scrollOffset = scrollOffsetPx; - invalidate(); - } - - public int getScrollOffset() { - return scrollOffset; - } - - public void setShouldExpand(boolean shouldExpand) { - this.shouldExpand = shouldExpand; - requestLayout(); - } - - public boolean getShouldExpand() { - return shouldExpand; - } - - public boolean isTextAllCaps() { - return textAllCaps; - } - - public void setAllCaps(boolean textAllCaps) { - this.textAllCaps = textAllCaps; - } - - public void setTextSize(int textSizePx) { - this.tabTextSize = textSizePx; - updateTabStyles(); - } - - public int getTextSize() { - return tabTextSize; - } - - public void setTextColor(int textColor) { - this.tabTextColor = textColor; - updateTabStyles(); - } - - public void setTextColorResource(int resId) { - this.tabTextColor = getResources().getColor(resId); - updateTabStyles(); - } - - public int getTextColor() { - return tabTextColor; - } - - public void setTypeface(Typeface typeface, int style) { - this.tabTypeface = typeface; - this.tabTypefaceStyle = style; - updateTabStyles(); - } - - public void setTabBackground(int resId) { - this.tabBackgroundResId = resId; - } - - public int getTabBackground() { - return tabBackgroundResId; - } - - public void setTabPaddingLeftRight(int paddingPx) { - this.tabPadding = paddingPx; - updateTabStyles(); - } - - public int getTabPaddingLeftRight() { - return tabPadding; - } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState savedState = (SavedState) state; - super.onRestoreInstanceState(savedState.getSuperState()); - currentPosition = savedState.currentPosition; - requestLayout(); - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState savedState = new SavedState(superState); - savedState.currentPosition = currentPosition; - return savedState; - } - - static class SavedState extends BaseSavedState { - int currentPosition; - - public SavedState(Parcelable superState) { - super(superState); - } - - private SavedState(Parcel in) { - super(in); - currentPosition = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(currentPosition); - } - - public static final Creator CREATOR = new Creator() { - @Override - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - -} diff --git a/Library/src/com/lhh/apst/library/ViewHolder.java b/Library/src/com/lhh/apst/library/ViewHolder.java deleted file mode 100644 index 5acd780..0000000 --- a/Library/src/com/lhh/apst/library/ViewHolder.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.lhh.apst.library; - -import android.util.SparseArray; -import android.view.View; - -/** - * Created by linhongong on 2015/9/22. - */ -public class ViewHolder { - - public static T get(View view, int id) { - @SuppressWarnings("unchecked") - SparseArray viewHolder = (SparseArray) view.getTag(); - if (viewHolder == null) { - viewHolder = new SparseArray(); - view.setTag(viewHolder); - } - View childView = viewHolder.get(id); - if (childView == null) { - childView = view.findViewById(id); - viewHolder.put(id, childView); - } - return (T) childView; - } -} diff --git a/Library/src/main/config.json b/Library/src/main/config.json new file mode 100644 index 0000000..a54b698 --- /dev/null +++ b/Library/src/main/config.json @@ -0,0 +1,27 @@ +{ + "app": { + "bundleName": "com.lhh.apst.advancedpagerslidingtabstrip", + "vendor": "lhh", + "version": { + "code": 1, + "name": "1.0" + }, + "apiVersion": { + "compatible": 4, + "target": 5, + "releaseType": "Beta1" + } + }, + "deviceConfig": {}, + "module": { + "package": "com.lhh.apst.library", + "deviceType": [ + "phone" + ], + "distro": { + "deliveryWithInstall": true, + "moduleName": "Library", + "moduleType": "har" + } + } +} \ No newline at end of file diff --git a/Library/src/main/java/com/lhh/apst/library/AdvancedPagerSlidingTabStrip.java b/Library/src/main/java/com/lhh/apst/library/AdvancedPagerSlidingTabStrip.java new file mode 100644 index 0000000..96612fb --- /dev/null +++ b/Library/src/main/java/com/lhh/apst/library/AdvancedPagerSlidingTabStrip.java @@ -0,0 +1,1193 @@ +package com.lhh.apst.library; + +import com.lhh.apst.library.utils.TypedAttrUtils; +import ohos.agp.colors.RgbColor; +import ohos.agp.components.*; +import ohos.agp.components.element.Element; +import ohos.agp.components.element.PixelMapElement; +import ohos.agp.components.element.ShapeElement; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.text.Font; +import ohos.agp.utils.Color; +import ohos.agp.utils.Rect; +import ohos.agp.utils.TextAlignment; +import ohos.app.Context; +import ohos.global.resource.NotExistException; +import ohos.global.resource.ResourceManager; +import ohos.global.resource.WrongTypeException; +import ohos.media.image.PixelMap; +import ohos.utils.PlainArray; + +import java.io.IOException; +import java.util.Locale; + +/** + * Created by linhomhom on 2015/8/10. + */ +public class AdvancedPagerSlidingTabStrip extends ScrollView implements Component.DrawTask, + Component.EstimateSizeListener { + /** + * 布局属性接口 + * + * @since 2021-04-30 + */ + public interface LayoutProvider { + /** + * 比重 + * + * @param position tab位置 + * @return 比重值 + */ + float getPageWeight(int position); + + /** + * 布局规则 + * + * @param position tab位置 + * @return 规则数组 + */ + int[] getPageRule(int position); + + /** + * 获取margin属性 + * + * @param position tab位置 + * @return Margins + */ + Margins getPageMargins(int position); + } + + /** + * Tips属性接口 + * + * @since 2021-04-30 + */ + public interface TipsProvider { + /** + * Tips Rule + * + * @param position tab位置 + * @return 布局集合 + */ + int[] getTipsRule(int position); + + /** + * TipsMargins + * + * @param position tab位置 + * @return Margins + */ + Margins getTipsMargins(int position); + + /** + * TipsDrawable + * + * @param position tab位置 + * @return Element + */ + Element getTipsDrawable(int position); + } + + /** + * IconTab接口 + * + * @since 2021-04-30 + */ + public interface IconTabProvider { + /** + * 获取PageIcon + * + * @param position tab位置 + * @param Icon泛型 + * @return Icon + */ + T getPageIcon(int position); + + /** + * 获取选中icon + * + * @param position tab位置 + * @param Icon泛型 + * @return Icon + */ + T getPageSelectIcon(int position); + + /** + * 获取icon Bounds + * + * @param position tab位置 + * @return Icon + */ + Rect getPageIconBounds(int position); + } + + /** + * ViewTabProvider + * + * @since 2021-04-30 + */ + public interface ViewTabProvider { + /** + * 选中的IconView + * + * @param position tab位置 + * @param view Component + * @param parent ComponentContainer + * @return Component + */ + Component onSelectIconView(int position, Component view, ComponentContainer parent); + + /** + * IconView + * + * @param position tab位置 + * @param view Component + * @param parent ComponentContainer + * @return Component + */ + Component onIconView(int position, Component view, ComponentContainer parent); + + /** + * 获取布局属性 + * + * @return 布局属性 + */ + DependentLayout.LayoutConfig getLayoutConfig(); + } + + // @formatter:on + private DirectionalLayout.LayoutConfig expandedTabLayoutParams; + + private final PageListener pageListener = new PageListener(); + + /** + * PageSlider页面切换监听 + */ + public PageSlider.PageChangedListener delegatePageListener; + + private DirectionalLayout tabsContainer; + private PageSlider pager; + + private int tabCount; + + private int currentPosition = 0; + private float currentPositionOffset = 0f; + + private Paint rectPaint; + private Paint dividerPaint; + + private boolean checkedTabWidths = false; + + private int indicatorColor = 0xFF666666; + private int underlineColor = 0x1A000000; + private int dividerColor = 0x1A000000; + + private boolean shouldExpand = true; + private boolean textAllCaps = true; + + private int scrollOffset = 52; + private int indicatorHeight = 0; + private int underlineHeight = 2; + private int dividerPadding = 12; + private int tabPadding = 24; + private int tabPaddingTopBottom = 0; + private int dividerWidth = 1; + + private int tabTextSize = 15; + private int tabTextColor = 0xFF666666; + private int tabTextSelectColor = 0xFF666666; + + private Font tabTypefaceStyle = Font.DEFAULT; + private int tabDrawMode = DRAW_MODE_NORMAL; + + /** + * 绘制模式NORMAL + */ + public static final int DRAW_MODE_NORMAL = 0; + + /** + * 绘制模式TEXT + */ + public static final int DRAW_MODE_TEXT = 1; + + private int lastScrollX = 0; + + private Locale locale; + private OnTabClickListener mOnTabClickListener; + + /** + * OnTabClickListener + * + * @since 2021-04-30 + */ + public interface OnTabClickListener { + /** + * 点击接口 + * + * @param pos 位置 + */ + void onClick(int pos); + } + + /** + * 构造函数 + * + * @param context 上下文 + */ + public AdvancedPagerSlidingTabStrip(Context context) { + this(context, null); + } + + /** + * 构造函数 + * + * @param context 上下文 + * @param attrSet AttrSet + */ + public AdvancedPagerSlidingTabStrip(Context context, AttrSet attrSet) { + this(context, attrSet, null); + } + + /** + * 构造函数 + * + * @param context 上下文 + * @param attrSet AttrSet + * @param styleName String + */ + public AdvancedPagerSlidingTabStrip(Context context, AttrSet attrSet, String styleName) { + super(context, attrSet, styleName); + setMatchViewportEnabled(true); + + tabsContainer = new DirectionalLayout(context); + tabsContainer.setOrientation(DirectionalLayout.HORIZONTAL); + LayoutConfig layoutConfig = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT); + tabsContainer.setLayoutConfig(layoutConfig); + addComponent(tabsContainer); + + indicatorColor = TypedAttrUtils.getIntColor(attrSet, "apTabIndicatorColor", indicatorColor); + underlineColor = TypedAttrUtils.getIntColor(attrSet, "apTabUnderlineColor", underlineColor); + dividerColor = TypedAttrUtils.getIntColor(attrSet, "apTabDividerColor", dividerColor); + indicatorHeight = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabIndicatorHeight", indicatorHeight); + underlineHeight = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabUnderlineHeight", underlineHeight); + dividerPadding = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabDividerPadding", dividerPadding); + tabPadding = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabPaddingLeftRight", tabPadding); + tabPaddingTopBottom = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabPaddingTopBottom", tabPaddingTopBottom); + shouldExpand = TypedAttrUtils.getBoolean(attrSet, "apTabShouldExpand", shouldExpand); + scrollOffset = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabScrollOffset", scrollOffset); + textAllCaps = TypedAttrUtils.getBoolean(attrSet, "apTabTextAllCaps", textAllCaps); + tabTextSelectColor = TypedAttrUtils.getIntColor(attrSet, "apTabTextSelectColor", dividerColor); + tabDrawMode = TypedAttrUtils.getInt(attrSet, "apTabDrawMode", DRAW_MODE_NORMAL); + tabTextSize = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabTextSize", tabTextSize); + tabTextColor = TypedAttrUtils.getIntColor(attrSet, "apTabTextColor", tabTextColor); + + rectPaint = new Paint(); + rectPaint.setAntiAlias(true); + rectPaint.setStyle(Paint.Style.FILL_STYLE); + + dividerPaint = new Paint(); + dividerPaint.setAntiAlias(true); + dividerPaint.setStrokeWidth(dividerWidth); + + expandedTabLayoutParams = new DirectionalLayout.LayoutConfig(0, LayoutConfig.MATCH_PARENT, + TableLayout.Alignment.ALIGNMENT_FILL, 1.0f); + + if (locale == null) { + locale = getResourceManager().getConfiguration().getFirstLocale(); + } + + if (mViewTabCache == null) { + mViewTabCache = new PlainArray<>(); + } + + addDrawTask(this); + setEstimateSizeListener(this); + } + + public void setOnTabClickListener(OnTabClickListener onTabClickListener) { + mOnTabClickListener = onTabClickListener; + } + + /** + * 设置PageSlider + * + * @param pager PageSlider + */ + public void setViewPager(PageSlider pager) { + this.pager = pager; + + if (pager.getProvider() == null) { + throw new IllegalStateException("ViewPager does not have adapter instance."); + } + + pager.addPageChangedListener(pageListener); + + notifyDataSetChanged(); + } + + public void setOnPageChangeListener(PageSlider.PageChangedListener listener) { + this.delegatePageListener = listener; + } + + /** + * 更新数据 + */ + public void notifyDataSetChanged() { + tabsContainer.removeAllComponents(); + tabCount = pager.getProvider().getCount(); + + for (int i = 0; i < tabCount; i++) { + if (pager.getProvider() instanceof IconTabProvider) { + addIconTab(i, ((IconTabProvider) pager.getProvider()).getPageIcon(i), pager.getProvider().getPageTitle(i)); + } else if (pager.getProvider() instanceof ViewTabProvider) { + addViewTab(i, ((ViewTabProvider) pager.getProvider()), pager.getProvider().getPageTitle(i)); + } else { + addTextTab(i, pager.getProvider().getPageTitle(i)); + } + } + + updateTabStyles(); + checkedTabWidths = false; + pageListener.onPageChosen(0); + } + + private void addTextTab(final int position, String title) { + DependentLayout tab = new DependentLayout(getContext()); + tab.setClickedListener(v -> { + if (mOnTabClickListener != null) { + mOnTabClickListener.onClick(position); + } + scrollToChild(position, 0); + pager.setCurrentPage(position); + }); + + Text txt = new Text(getContext()); + txt.setText(title); + txt.setFocusable(Text.FOCUS_ENABLE); + txt.setTextAlignment(TextAlignment.CENTER); + txt.setMaxTextLines(1); + txt.setId(ResourceTable.String_id_tab_txt); + DependentLayout.LayoutConfig txtParams = new DependentLayout.LayoutConfig(LayoutConfig.MATCH_CONTENT, LayoutConfig.MATCH_CONTENT); + txtParams.addRule(DependentLayout.LayoutConfig.CENTER_IN_PARENT); + if (pager.getProvider() instanceof LayoutProvider) { + LayoutProvider layoutProvider = (LayoutProvider) pager.getProvider(); + for (Integer rule : layoutProvider.getPageRule(position)) { + txtParams.addRule(rule); + } + Margins margins = layoutProvider.getPageMargins(position); + if (margins != null) { + txtParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); + } + } + txt.setLayoutConfig(txtParams); + + int result = getResValue(ResourceTable.Float_psts_dot_wh); + DependentLayout.LayoutConfig layoutParams = new DependentLayout.LayoutConfig(result, result); + Text dot = new Text(getContext()); + dot.setTextColor(Color.WHITE); + ShapeElement shapeElement = new ShapeElement(); + shapeElement.setRgbColor(new RgbColor(Color.BLUE.getValue())); + dot.setBackground(shapeElement); + dot.setTextAlignment(TextAlignment.CENTER); + dot.setMaxTextLines(1); + dot.setTextSize(getResValue(ResourceTable.Float_psts_dot_txt_size)); + + Element dot_drawable = new ShapeElement(this.mContext, ResourceTable.Graphic_apsts_tips); + + boolean hasRule = false; + layoutParams.setMargins(0, 0, getResValue(ResourceTable.Float_psts_dot_m_right), 0); + if (pager.getProvider() instanceof TipsProvider) { + TipsProvider tipsProvider = (TipsProvider) pager.getProvider(); + for (Integer rule : tipsProvider.getTipsRule(position)) { + layoutParams.addRule(rule); + hasRule = true; + } + Margins margins = tipsProvider.getTipsMargins(position); + if (margins != null) { + layoutParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); + } + + Element drawable = tipsProvider.getTipsDrawable(position); + if (drawable != null) { + dot_drawable = drawable; + } + } + + if (!hasRule) { + layoutParams.addRule(DependentLayout.LayoutConfig.ALIGN_RIGHT, ResourceTable.String_id_tab_txt); + layoutParams.addRule(DependentLayout.LayoutConfig.ALIGN_TOP, ResourceTable.String_id_tab_txt); + int halfSize = getResValue(ResourceTable.Float_psts_dot_m_tv_right); + layoutParams.setMargins(0, 0, -halfSize, 0); + } + + dot.setBackground(dot_drawable); + dot.setLayoutConfig(layoutParams); + + tab.addComponent(txt, 0); + tab.addComponent(dot, 1); + dot.setVisibility(Component.INVISIBLE); + tabsContainer.addComponent(tab); + } + + /** + * 展示红点 + * + * @param index 当前位置 + */ + public void showDot(int index) { + DependentLayout tab = (DependentLayout) tabsContainer.getComponentAt(index); + Text dot_layout = (Text) tab.getComponentAt(tab.getChildCount() - 1); + dot_layout.setText(""); + dot_layout.setVisibility(Component.VISIBLE); + } + + /** + * 展示红点 + * + * @param index 当前位置 + * @param dotTxt 红点文字 + */ + public void showDot(int index, String dotTxt) { + DependentLayout tab = (DependentLayout) tabsContainer.getComponentAt(index); + Text dot_layout = (Text) tab.getComponentAt(tab.getChildCount() - 1); + dot_layout.setText(dotTxt); + dot_layout.setPaddingLeft(10); + dot_layout.setPaddingRight(10); + dot_layout.setVisibility(Component.VISIBLE); + } + + /** + * 隐藏红点 + * + * @param index 当前位置 + */ + public void hideDot(int index) { + DependentLayout tab = (DependentLayout) tabsContainer.getComponentAt(index); + Text dot_layout = (Text) tab.getComponentAt(tab.getChildCount() - 1); + dot_layout.setVisibility(Component.INVISIBLE); + } + + private PlainArray mViewTabCache; + + private Component getTabView(int position) { + return mViewTabCache.get(position).get(); + } + + private void setTabView(int position, Component view) { + mViewTabCache.put(position, view); + } + + private void addViewTab(final int position, ViewTabProvider provider, String title) { + DependentLayout tab = new DependentLayout(getContext()); + tab.setClickedListener(v -> { + if (mOnTabClickListener != null) { + mOnTabClickListener.onClick(position); + } + scrollToChild(position, 0); + pager.setCurrentPage(position); + }); + + // 文本和图 + Text txt = new Text(getContext()); + txt.setText(title); + txt.setFocusable(Text.FOCUS_ENABLE); + txt.setTextAlignment(TextAlignment.CENTER); + txt.setMaxTextLines(1); + txt.setId(ResourceTable.String_id_tab_txt); + DependentLayout.LayoutConfig txtParams = new DependentLayout.LayoutConfig( + DependentLayout.LayoutConfig.MATCH_CONTENT, + DependentLayout.LayoutConfig.MATCH_CONTENT); + txtParams.addRule(DependentLayout.LayoutConfig.HORIZONTAL_CENTER); + txtParams.addRule(DependentLayout.LayoutConfig.ALIGN_PARENT_BOTTOM); + if (pager.getProvider() instanceof LayoutProvider) { + LayoutProvider layoutProvider = (LayoutProvider) pager.getProvider(); + for (Integer rule : layoutProvider.getPageRule(position)) { + txtParams.addRule(rule); + } + Margins margins = layoutProvider.getPageMargins(position); + if (margins != null) { + txtParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); + } + } + txtParams.addRule(DependentLayout.LayoutConfig.HORIZONTAL_CENTER); + txtParams.addRule(DependentLayout.LayoutConfig.ALIGN_PARENT_BOTTOM); + txt.setLayoutConfig(txtParams); + + // 使用缓存 + Component view = provider.onIconView(position, null, tab); + + // 保存view到缓存中 + setTabView(position, view); + + DependentLayout.LayoutConfig viewLayoutParams + = provider.getLayoutConfig(); + viewLayoutParams.addRule(DependentLayout.LayoutConfig.HORIZONTAL_CENTER); + viewLayoutParams.addRule(DependentLayout.LayoutConfig.ABOVE, ResourceTable.String_id_tab_txt); + view.setLayoutConfig(viewLayoutParams); + + DependentLayout.LayoutConfig layoutParams = + new DependentLayout.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_CONTENT, + ComponentContainer.LayoutConfig.MATCH_CONTENT); + Text dot = new Text(getContext()); + dot.setTextColor(Color.WHITE); + + ShapeElement shapeElement = new ShapeElement(); + shapeElement.setRgbColor(new RgbColor(Color.BLUE.getValue())); + dot.setBackground(shapeElement); + dot.setTextAlignment(TextAlignment.CENTER); + dot.setMaxTextLines(1); + dot.setTextSize(getResValue(ResourceTable.Float_psts_dot_txt_size)); + + Element dot_drawable = new ShapeElement(this.mContext, ResourceTable.Graphic_apsts_tips); + + boolean hasRule = false; + layoutParams.setMargins(0, 15, getResValue(ResourceTable.Float_psts_dot_m_right), 0); + if (pager.getProvider() instanceof TipsProvider) { + TipsProvider tipsProvider = (TipsProvider) pager.getProvider(); + for (Integer rule : tipsProvider.getTipsRule(position)) { + layoutParams.addRule(rule); + hasRule = true; + } + Margins margins = tipsProvider.getTipsMargins(position); + if (margins != null) { + layoutParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); + } + Element drawable = tipsProvider.getTipsDrawable(position); + if (drawable != null) { + dot_drawable = drawable; + } + } + + if (!hasRule) { + layoutParams.addRule(DependentLayout.LayoutConfig.ALIGN_PARENT_RIGHT); + } + + dot.setBackground(dot_drawable); + dot.setLayoutConfig(layoutParams); + + tab.addComponent(txt, 0); + tab.addComponent(view, 1); + tab.addComponent(dot, 2); + dot.setVisibility(Component.INVISIBLE); + tabsContainer.addComponent(tab); + } + + private void addIconTab(final int position, Object res, String text) { + DependentLayout tab = new DependentLayout(getContext()); + tab.setClickedListener(v -> { + if (mOnTabClickListener != null) { + mOnTabClickListener.onClick(position); + } + scrollToChild(position, 0); + pager.setCurrentPage(position); + }); + + // 文本和图 + Text txt = new Text(getContext()); + txt.setText(text); + txt.setFocusable(Text.FOCUS_ENABLE); + txt.setTextAlignment(TextAlignment.CENTER); + txt.setMaxTextLines(1); + txt.setId(ResourceTable.String_id_tab_txt); + DependentLayout.LayoutConfig txtParams = new DependentLayout.LayoutConfig( + DependentLayout.LayoutConfig.MATCH_CONTENT, + DependentLayout.LayoutConfig.MATCH_CONTENT); + txtParams.addRule(DependentLayout.LayoutConfig.CENTER_IN_PARENT); + if (pager.getProvider() instanceof LayoutProvider) { + LayoutProvider layoutProvider = (LayoutProvider) pager.getProvider(); + for (Integer rule : layoutProvider.getPageRule(position)) { + txtParams.addRule(rule); + } + Margins margins = layoutProvider.getPageMargins(position); + if (margins != null) { + txtParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); + } + } + txt.setLayoutConfig(txtParams); + + setViewResource(position, res, txt); + + DependentLayout.LayoutConfig layoutParams = new DependentLayout.LayoutConfig(ComponentContainer.LayoutConfig.MATCH_CONTENT, ComponentContainer.LayoutConfig.MATCH_CONTENT); + Text dot = new Text(getContext()); + dot.setTextColor(Color.WHITE); + ShapeElement shapeElement = new ShapeElement(); + shapeElement.setRgbColor(new RgbColor(Color.BLUE.getValue())); + dot.setBackground(shapeElement); + dot.setTextAlignment(TextAlignment.CENTER); + dot.setMaxTextLines(1); + dot.setTextSize(getResValue(ResourceTable.Float_psts_dot_txt_size)); + + Element dot_drawable = new ShapeElement(this.mContext, ResourceTable.Graphic_apsts_tips); + + boolean hasRule = false; + layoutParams.setMargins(0, 15, getResValue(ResourceTable.Float_psts_dot_m_right), 0); + if (pager.getProvider() instanceof TipsProvider) { + TipsProvider tipsProvider = (TipsProvider) pager.getProvider(); + for (Integer rule : tipsProvider.getTipsRule(position)) { + layoutParams.addRule(rule); + hasRule = true; + } + Margins margins = tipsProvider.getTipsMargins(position); + if (margins != null) { + layoutParams.setMargins(margins.mLeft, margins.mTop, margins.mRight, margins.mBottom); + } + Element drawable = tipsProvider.getTipsDrawable(position); + if (drawable != null) { + dot_drawable = drawable; + } + } + + if (!hasRule) { + layoutParams.addRule(DependentLayout.LayoutConfig.ALIGN_PARENT_RIGHT); + } + + dot.setBackground(dot_drawable); + dot.setLayoutConfig(layoutParams); + + tab.addComponent(txt, 0); + tab.addComponent(dot, 1); + dot.setVisibility(Component.INVISIBLE); + tabsContainer.addComponent(tab); + } + + /** + * 获取tab Component + * + * @param pos tab位置 + * @return Component tab元素 + */ + public Component getTabAt(int pos) { + if (pos >= tabsContainer.getChildCount()) { + throw new IllegalStateException("pos is too big."); + } + return tabsContainer.getComponentAt(pos); + } + + private void updateTabStyles() { + for (int i = 0; i < tabCount; i++) { + Component v = tabsContainer.getComponentAt(i); + v.setLayoutConfig(expandedTabLayoutParams); + + if (shouldExpand) { + v.setPadding(0, 0, 0, 0); + } else { + v.setPadding(tabPadding, tabPaddingTopBottom, tabPadding, tabPaddingTopBottom); + } + + if (v instanceof DependentLayout) { + DependentLayout tab = (DependentLayout) v; + Text tv = (Text) tab.getComponentAt(0); + tv.setTextSize(tabTextSize, Text.TextSizeType.FP); + tv.setFont(tabTypefaceStyle); + tv.setTextColor(new Color(tabTextColor)); + + // setAllCaps() is only available from API 14, so the upper case is made manually if we are on a + // pre-ICS-build + if (textAllCaps) { + tv.setText(tv.getText().toUpperCase(locale)); + } + } + } + } + + /** + * 设置布局属性 + * + * @return 是否设置成功 + */ + public boolean setTabLayoutParams() { + if (pager.getProvider() instanceof LayoutProvider) { + LayoutProvider weightProvider = (LayoutProvider) pager.getProvider(); + if (weightProvider == null) { + return false; + } + for (int i = 0; i < tabCount; i++) { + float weight = weightProvider.getPageWeight(i); + if (weight != 0.0f) { + DirectionalLayout.LayoutConfig layoutParams = new DirectionalLayout.LayoutConfig(0, DirectionalLayout.LayoutConfig.MATCH_PARENT, TableLayout.Alignment.ALIGNMENT_FILL, weight == 0.0f ? 1.0f : weight); + tabsContainer.getComponentAt(i).setLayoutConfig(layoutParams); + } else { + tabsContainer.getComponentAt(i).setLayoutConfig(expandedTabLayoutParams); + } + } + } + return false; + } + + @Override + public boolean onEstimateSize(int widthMeasureSpec, int heightMeasureSpec) { + if (!shouldExpand || EstimateSpec.getMode(widthMeasureSpec) == EstimateSpec.UNCONSTRAINT) { + setTabLayoutParams(); + return false; + } + + int myWidth = getEstimatedWidth(); + int childWidth = 0; + for (int i = 0; i < tabCount; i++) { + childWidth += tabsContainer.getComponentAt(i).getEstimatedWidth(); + } + + if (!checkedTabWidths && childWidth > 0 && myWidth > 0) { + if (childWidth <= myWidth) { + if (!setTabLayoutParams()) { + for (int i = 0; i < tabCount; i++) { + tabsContainer.getComponentAt(i).setLayoutConfig(expandedTabLayoutParams); + } + } + } + + checkedTabWidths = true; + } + return true; + } + + private void scrollToChild(int position, int offset) { + if (tabCount == 0) { + return; + } + + int newScrollX = tabsContainer.getComponentAt(position).getLeft() + offset; + + if (position > 0 || offset > 0) { + newScrollX -= scrollOffset; + } + + if (newScrollX != lastScrollX) { + lastScrollX = newScrollX; + scrollTo(newScrollX, 0); + } + } + + @Override + public void onDraw(Component component, Canvas canvas) { + if (tabCount == 0) { + return; + } + + if (tabDrawMode == DRAW_MODE_NORMAL) { + drawTabNormalMode(canvas); + } else { + drawTabTextMode(canvas); + } + } + + private void drawTabNormalMode(Canvas canvas) { + final int height = getHeight(); + // 设置提示下划线的颜色 + rectPaint.setColor(new Color(indicatorColor)); + + Component currentTab = tabsContainer.getComponentAt(currentPosition); + float lineLeft = currentTab.getLeft(); + float lineRight = currentTab.getRight(); + + // 绘制提示下划线 + canvas.drawRect(lineLeft, height - indicatorHeight, lineRight, height, rectPaint); + + // 绘制下划线 + rectPaint.setColor(new Color(underlineColor)); + canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint); + + // 绘制分割线 + dividerPaint.setColor(new Color(dividerColor)); + for (int i = 0; i < tabCount - 1; i++) { + Component tab = tabsContainer.getComponentAt(i); + canvas.drawLine(tab.getRight(), dividerPadding, tab.getRight(), height - dividerPadding, dividerPaint); + } + } + + private void drawTabTextMode(Canvas canvas) { + final int height = getHeight(); + + // 设置提示下划线的颜色 + rectPaint.setColor(new Color(indicatorColor)); + + Component currentTab = tabsContainer.getComponentAt(currentPosition); + float lineLeft = currentTab.getLeft(); + + Component currentTextView = ((DependentLayout) currentTab).getComponentAt(0); + float currentTextViewLeft = currentTextView.getLeft(); + float currentTextViewRight = currentTextView.getRight(); + + // 绘制提示下划线 + float r = ((float) indicatorHeight) / 2; + canvas.drawCircle(lineLeft + currentTextViewLeft + r, height - indicatorHeight + r, r, rectPaint); + canvas.drawCircle(lineLeft + currentTextViewRight - r, height - indicatorHeight + r, r, rectPaint); + + canvas.drawRect(lineLeft + currentTextViewLeft + r, height - indicatorHeight, lineLeft + currentTextViewRight - r, height, rectPaint); + + // 分割线paint + dividerPaint.setColor(new Color(dividerColor)); + + // 下划线paint + rectPaint.setColor(new Color(underlineColor)); + + for (int i = 0; i < tabCount; i++) { + Component tab = tabsContainer.getComponentAt(i); + //绘制分割线 + if (i < tabCount - 1) { + canvas.drawLine(tab.getRight(), dividerPadding, tab.getRight(), height - dividerPadding, dividerPaint); + } + Component tabTextView = ((DependentLayout) tab).getComponentAt(0); + canvas.drawRect(tab.getLeft() + tabTextView.getLeft(), height - underlineHeight, tab.getLeft() + tabTextView.getRight(), height, rectPaint); + } + } + + /** + * PageListener + * + * @since 2021-04-30 + */ + private class PageListener implements PageSlider.PageChangedListener { + @Override + public void onPageSliding(int position, float positionOffset, int positionOffsetPixels) { + currentPositionOffset = positionOffset; + + if (tabsContainer != null && tabsContainer.getComponentAt(position) != null) { + scrollToChild(position, (int) (positionOffset * tabsContainer.getComponentAt(position).getWidth())); + } + + invalidate(); + + if (delegatePageListener != null) { + delegatePageListener.onPageSliding(position, positionOffset, positionOffsetPixels); + } + } + + @Override + public void onPageSlideStateChanged(int state) { + if (state == PageSlider.SCROLL_IDLE_STAGE) { + scrollToChild(pager.getCurrentPage(), 0); + } + + if (delegatePageListener != null) { + delegatePageListener.onPageSlideStateChanged(state); + } + } + + @Override + public void onPageChosen(int position) { + setSelectItem(position); + + if (delegatePageListener != null) { + delegatePageListener.onPageChosen(position); + } + currentPosition = position; + invalidate(); + } + } + + private void setViewResource(int position, Object obj, Text view) { + IconTabProvider iconTabProvider = (IconTabProvider) pager.getProvider(); + Rect rect = iconTabProvider.getPageIconBounds(position); + Element drawable = null; + if (obj instanceof Integer) { + int resId = (int) obj; + if (resId != 0) { + drawable = getResElement(resId); + } + } else if (obj instanceof PixelMap) { + PixelMap bitmap = (PixelMap) obj; + if (bitmap != null) { + drawable = new PixelMapElement(bitmap); + } + } else if (obj instanceof Element) { + drawable = (Element) obj; + } + + if (drawable != null) { + if (rect != null) { + drawable.setBounds(rect); + view.setAroundElements(null, drawable, null, null); + } else { + view.setAroundElements(null, drawable, null, null); + } + } + } + + /** + * 选中item刷新状态 + * + * @param position item位置 + */ + public void setSelectItem(int position) { + for (int i = 0; i < tabsContainer.getChildCount(); i++) { + DependentLayout linearLayout = (DependentLayout) tabsContainer.getComponentAt(i); + if (i == position) { + ((Text) linearLayout.getComponentAt(0)).setTextColor(new Color(tabTextSelectColor)); + if (pager.getProvider() instanceof IconTabProvider) { + Object obj = ((IconTabProvider) pager.getProvider()).getPageSelectIcon(i); + setViewResource(position, obj, (Text) linearLayout.getComponentAt(0)); + } else if (pager.getProvider() instanceof ViewTabProvider) { + Component view = ((ViewTabProvider) pager.getProvider()).onSelectIconView(i, getTabView(i), linearLayout); + setTabView(i, view); + changeIconView(linearLayout, view); + } + } else { + ((Text) linearLayout.getComponentAt(0)).setTextColor(new Color(tabTextColor)); + if (pager.getProvider() instanceof IconTabProvider) { + Object obj = ((IconTabProvider) pager.getProvider()).getPageIcon(i); + setViewResource(position, obj, (Text) linearLayout.getComponentAt(0)); + } else if (pager.getProvider() instanceof ViewTabProvider) { + Component view = ((ViewTabProvider) pager.getProvider()).onIconView(i, getTabView(i), linearLayout); + setTabView(i, view); + changeIconView(linearLayout, view); + } + } + } + } + + private void changeIconView(DependentLayout linearLayout, Component view) { + DependentLayout.LayoutConfig viewLayoutParams + = ((ViewTabProvider) pager.getProvider()).getLayoutConfig(); + viewLayoutParams.addRule(DependentLayout.LayoutConfig.HORIZONTAL_CENTER); + viewLayoutParams.addRule(DependentLayout.LayoutConfig.ABOVE, ResourceTable.String_id_tab_txt); + view.setLayoutConfig(viewLayoutParams); + linearLayout.removeComponentAt(1); + linearLayout.addComponent(view, 1); + } + + /** + * 设置指标颜色 + * + * @param indicatorColor 颜色值 + */ + public void setIndicatorColor(int indicatorColor) { + this.indicatorColor = indicatorColor; + invalidate(); + } + + /** + * 设置指标颜色资源 + * + * @param resId 资源id + */ + public void setIndicatorColorResource(int resId) { + this.indicatorColor = getColorValue(resId); + invalidate(); + } + + public int getIndicatorColor() { + return this.indicatorColor; + } + + /** + * 设置指标高度 + * + * @param indicatorLineHeightPx 指标高度 + */ + public void setIndicatorHeight(int indicatorLineHeightPx) { + this.indicatorHeight = indicatorLineHeightPx; + invalidate(); + } + + public int getIndicatorHeight() { + return indicatorHeight; + } + + /** + * 设置下划线颜色 + * + * @param underlineColor 下划线颜色 + */ + public void setUnderlineColor(int underlineColor) { + this.underlineColor = underlineColor; + invalidate(); + } + + /** + * 设置下划线颜色资源 + * + * @param resId 资源id + */ + public void setUnderlineColorResource(int resId) { + this.underlineColor = getColorValue(resId); + invalidate(); + } + + public int getUnderlineColor() { + return underlineColor; + } + + /** + * 设置风格线颜色 + * + * @param dividerColor 分割线颜色 + */ + public void setDividerColor(int dividerColor) { + this.dividerColor = dividerColor; + invalidate(); + } + + /** + * 设置风格线颜色资源 + * + * @param resId 分割线颜色资源id + */ + public void setDividerColorResource(int resId) { + this.dividerColor = getColorValue(resId); + invalidate(); + } + + public int getDividerColor() { + return dividerColor; + } + + /** + * 设置下划线高度 + * + * @param underlineHeightPx 下划线高度值 + */ + public void setUnderlineHeight(int underlineHeightPx) { + this.underlineHeight = underlineHeightPx; + invalidate(); + } + + public int getUnderlineHeight() { + return underlineHeight; + } + + /** + * 设置分割线间距 + * + * @param dividerPaddingPx 分割线间距值 + */ + public void setDividerPadding(int dividerPaddingPx) { + this.dividerPadding = dividerPaddingPx; + invalidate(); + } + + public int getDividerPadding() { + return dividerPadding; + } + + /** + * 设置滚动偏移量 + * + * @param scrollOffsetPx 滚动偏移量 + */ + public void setScrollOffset(int scrollOffsetPx) { + this.scrollOffset = scrollOffsetPx; + invalidate(); + } + + public int getScrollOffset() { + return scrollOffset; + } + + /** + * 设置是否平铺展开 + * + * @param shouldExpand 是否展开 + */ + public void setShouldExpand(boolean shouldExpand) { + this.shouldExpand = shouldExpand; + postLayout(); + } + + public boolean getShouldExpand() { + return shouldExpand; + } + + public boolean isTextAllCaps() { + return textAllCaps; + } + + public void setAllCaps(boolean textAllCaps) { + this.textAllCaps = textAllCaps; + } + + /** + * 设置字体大小 + * + * @param textSizePx 字体大小 + */ + public void setTextSize(int textSizePx) { + this.tabTextSize = textSizePx; + updateTabStyles(); + } + + public int getTextSize() { + return tabTextSize; + } + + /** + * 设置文字颜色 + * + * @param textColor 文字颜色 + */ + public void setTextColor(int textColor) { + this.tabTextColor = textColor; + updateTabStyles(); + } + + /** + * 设置字体颜色资源 + * + * @param resId 资源id + */ + public void setTextColorResource(int resId) { + this.tabTextColor = getColorValue(resId); + updateTabStyles(); + } + + public int getTextColor() { + return tabTextColor; + } + + /** + * 设置字体类型 + * + * @param style 字体类型 + */ + public void setTypeface(Font style) { + this.tabTypefaceStyle = style; + updateTabStyles(); + } + + /** + * 设置tab左右padding + * + * @param paddingPx padding值 + */ + public void setTabPaddingLeftRight(int paddingPx) { + this.tabPadding = paddingPx; + updateTabStyles(); + } + + public int getTabPaddingLeftRight() { + return tabPadding; + } + + private int getResValue(int resId) { + ResourceManager resManager = this.getResourceManager(); + int result = 0; + try { + result = (int) resManager.getElement(resId).getFloat(); + } catch (IOException | NotExistException | WrongTypeException e) { + e.fillInStackTrace(); + } + return result; + } + + private int getColorValue(int resId) { + ResourceManager resManager = this.getResourceManager(); + int color = 0; + try { + color = resManager.getElement(resId).getColor(); + } catch (IOException | NotExistException | WrongTypeException e) { + e.fillInStackTrace(); + } + return color; + } + + private Element getResElement(int resId) { + Element element = null; + try { + element = new PixelMapElement(this.getResourceManager().getResource(resId)); + } catch (IOException | NotExistException e) { + e.fillInStackTrace(); + } + return element; + } +} diff --git a/Library/src/com/lhh/apst/library/CustomPagerSlidingTabStrip.java b/Library/src/main/java/com/lhh/apst/library/CustomPagerSlidingTabStrip.java similarity index 36% rename from Library/src/com/lhh/apst/library/CustomPagerSlidingTabStrip.java rename to Library/src/main/java/com/lhh/apst/library/CustomPagerSlidingTabStrip.java index e304b7c..4eeeaf7 100644 --- a/Library/src/com/lhh/apst/library/CustomPagerSlidingTabStrip.java +++ b/Library/src/main/java/com/lhh/apst/library/CustomPagerSlidingTabStrip.java @@ -1,47 +1,32 @@ package com.lhh.apst.library; -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.Paint.Style; -import android.os.Build; -import android.os.Parcel; -import android.os.Parcelable; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.util.DisplayMetrics; -import android.util.SparseArray; -import android.util.TypedValue; -import android.view.View; -import android.view.ViewTreeObserver.OnGlobalLayoutListener; -import android.widget.HorizontalScrollView; -import android.widget.LinearLayout; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Locale; +import com.lhh.apst.library.utils.TypedAttrUtils; +import ohos.agp.components.*; +import ohos.agp.render.Canvas; +import ohos.agp.render.Paint; +import ohos.agp.utils.Color; +import ohos.app.Context; +import ohos.global.resource.NotExistException; +import ohos.global.resource.WrongTypeException; +import ohos.utils.PlainArray; + +import java.io.IOException; /** * Created by linhomhom on 2015/9/22. */ -public class CustomPagerSlidingTabStrip extends HorizontalScrollView { - - public interface CustomTabProvider{ - public View getSelectTabView(int position, View convertView); - public View getDisSelectTabView(int position, View convertView); - } - // @formatter:on - - private LinearLayout.LayoutParams defaultTabLayoutParams; - private LinearLayout.LayoutParams expandedTabLayoutParams; +public class CustomPagerSlidingTabStrip extends ScrollView implements Component.DrawTask, Component.EstimateSizeListener { + private DirectionalLayout.LayoutConfig expandedTabLayoutParams; private final PageListener pageListener = new PageListener(); - public ViewPager.OnPageChangeListener delegatePageListener; - private LinearLayout tabsContainer; - private ViewPager pager; + /** + * PageSlider页面切换监听 + */ + public PageSlider.PageChangedListener delegatePageListener; + + private DirectionalLayout tabsContainer; + private PageSlider pager; private int tabCount; @@ -60,8 +45,8 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { private boolean shouldExpand = true; private int scrollOffset = 52; - private int indicatorHeight = 3; - private int underlineHeight = 2; + private int indicatorHeight = 10; + private int underlineHeight = 10; private int dividerPadding = 12; private int tabPadding = 24; private int tabPaddingTopBottom = 0; @@ -69,186 +54,215 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { private int lastScrollX = 0; - private int tabBackgroundResId = R.drawable.psts_background_tab; -// private int tabBackgroundResId; - - private Locale locale; private OnTabClickListener mOnTabClickListener; - public interface OnTabClickListener{ - public void onClick(int pos); - } + /** + * Tab点击接口 + * + * @since 2021-04-30 + */ + public interface OnTabClickListener { + /** + * 点击方法 + * + * @param pos 点击位置 + */ + void onClick(int pos); + } + + /** + * CustomTabProvider + * + * @since 2021-04-30 + */ + public interface CustomTabProvider { + /** + * 获取选中tabView + * + * @param position 选中位置 + * @param convertView Component + * @return Component + */ + Component getSelectTabView(int position, Component convertView); + + /** + * 获取未选中tabView + * + * @param position 选中位置 + * @param convertView Component + * @return Component + */ + Component getDisSelectTabView(int position, Component convertView); + } + + /** + * 构造函数 + * + * @param context 上下文 + */ public CustomPagerSlidingTabStrip(Context context) { this(context, null); } - public CustomPagerSlidingTabStrip(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public CustomPagerSlidingTabStrip(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - - setFillViewport(true); - setWillNotDraw(false); - - tabsContainer = new LinearLayout(context); - tabsContainer.setOrientation(LinearLayout.HORIZONTAL); - tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - addView(tabsContainer); - - DisplayMetrics dm = getResources().getDisplayMetrics(); - - scrollOffset = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, scrollOffset, dm); - indicatorHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, indicatorHeight, dm); - underlineHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, underlineHeight, dm); - dividerPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerPadding, dm); - tabPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, tabPadding, dm); - dividerWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dividerWidth, dm); - - // get system attrs (android:textSize and android:textColor) - - TypedArray a = null; - - // get custom attrs - - - a = context.obtainStyledAttributes(attrs, R.styleable.AdvancedPagerSlidingTabStrip); - - indicatorColor = a.getColor(R.styleable.AdvancedPagerSlidingTabStrip_apTabIndicatorColor, indicatorColor); - underlineColor = a.getColor(R.styleable.AdvancedPagerSlidingTabStrip_apTabUnderlineColor, underlineColor); - dividerColor = a.getColor(R.styleable.AdvancedPagerSlidingTabStrip_apTabDividerColor, dividerColor); - indicatorHeight = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabIndicatorHeight, indicatorHeight); - underlineHeight = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabUnderlineHeight, underlineHeight); - dividerPadding = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabDividerPadding, dividerPadding); - tabPadding = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabPaddingLeftRight, tabPadding); - tabPaddingTopBottom = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabPaddingTopBottom, tabPaddingTopBottom); - tabBackgroundResId = a.getResourceId(R.styleable.AdvancedPagerSlidingTabStrip_apTabBackground, tabBackgroundResId); - shouldExpand = a.getBoolean(R.styleable.AdvancedPagerSlidingTabStrip_apTabShouldExpand, shouldExpand); - scrollOffset = a.getDimensionPixelSize(R.styleable.AdvancedPagerSlidingTabStrip_apTabScrollOffset, scrollOffset); - - a.recycle(); + /** + * 构造函数 + * + * @param context 上下文 + * @param attrSet AttrSet + */ + public CustomPagerSlidingTabStrip(Context context, AttrSet attrSet) { + this(context, attrSet, null); + } + + /** + * 构造函数 + * + * @param context 上下文 + * @param attrSet AttrSet + * @param styleName String + */ + public CustomPagerSlidingTabStrip(Context context, AttrSet attrSet, String styleName) { + super(context, attrSet, styleName); + setMatchViewportEnabled(true); + + tabsContainer = new DirectionalLayout(context); + tabsContainer.setOrientation(DirectionalLayout.HORIZONTAL); + LayoutConfig layoutConfig = new LayoutConfig(LayoutConfig.MATCH_PARENT, LayoutConfig.MATCH_PARENT); + tabsContainer.setLayoutConfig(layoutConfig); + addComponent(tabsContainer); + + indicatorColor = TypedAttrUtils.getIntColor(attrSet, "apTabIndicatorColor", indicatorColor); + underlineColor = TypedAttrUtils.getIntColor(attrSet, "apTabUnderlineColor", underlineColor); + dividerColor = TypedAttrUtils.getIntColor(attrSet, "apTabDividerColor", dividerColor); + indicatorHeight = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabIndicatorHeight", indicatorHeight); + underlineHeight = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabUnderlineHeight", underlineHeight); + dividerPadding = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabDividerPadding", dividerPadding); + tabPadding = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabPaddingLeftRight", tabPadding); + tabPaddingTopBottom = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabPaddingTopBottom", tabPaddingTopBottom); + shouldExpand = TypedAttrUtils.getBoolean(attrSet, "apTabShouldExpand", shouldExpand); + scrollOffset = TypedAttrUtils.getDimensionPixelSize(attrSet, "apTabScrollOffset", scrollOffset); rectPaint = new Paint(); rectPaint.setAntiAlias(true); - rectPaint.setStyle(Style.FILL); + rectPaint.setStyle(Paint.Style.FILL_STYLE); dividerPaint = new Paint(); dividerPaint.setAntiAlias(true); dividerPaint.setStrokeWidth(dividerWidth); - defaultTabLayoutParams = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); - expandedTabLayoutParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f); + expandedTabLayoutParams = new DirectionalLayout.LayoutConfig(0, LayoutConfig.MATCH_PARENT, TableLayout.Alignment.ALIGNMENT_FILL, 1.0f); - if (locale == null) { - locale = getResources().getConfiguration().locale; + if (mDisSelectTabViewCache == null) { + mDisSelectTabViewCache = new PlainArray<>(); } - - if(mDisSelectTabViewCache == null){ - mDisSelectTabViewCache = new SparseArray<>(); - } - if(mSelectTabViewCache == null){ - mSelectTabViewCache = new SparseArray<>(); + if (mSelectTabViewCache == null) { + mSelectTabViewCache = new PlainArray<>(); } + + addDrawTask(this); + setEstimateSizeListener(this); } - public void setOnTabClickListener(OnTabClickListener onTabClickListener){ + public void setOnTabClickListener(OnTabClickListener onTabClickListener) { mOnTabClickListener = onTabClickListener; } - public void setViewPager(ViewPager pager) { + /** + * 设置PageSlider + * + * @param pager PageSlider + */ + public void setViewPager(PageSlider pager) { this.pager = pager; - if (pager.getAdapter() == null) { - throw new IllegalStateException("ViewPager does not have adapter instance."); + if (pager.getProvider() == null) { + throw new IllegalStateException("PageSlider does not have Provider instance."); } - pager.addOnPageChangeListener(pageListener); + pager.addPageChangedListener(pageListener); notifyDataSetChanged(); } - public void setOnPageChangeListener(ViewPager.OnPageChangeListener listener) { + public void setOnPageChangeListener(PageSlider.PageChangedListener listener) { this.delegatePageListener = listener; } + /** + * 更新数据 + */ public void notifyDataSetChanged() { - - tabsContainer.removeAllViews(); - - tabCount = pager.getAdapter().getCount(); + tabsContainer.removeAllComponents(); + tabCount = pager.getProvider().getCount(); for (int i = 0; i < tabCount; i++) { - - if (pager.getAdapter() instanceof CustomTabProvider) { - View view = ((CustomTabProvider) pager.getAdapter()).getSelectTabView(i, getSelectTabView(i)); + if (pager.getProvider() instanceof CustomTabProvider) { + Component view = ((CustomTabProvider) pager.getProvider()).getSelectTabView(i, null); setSelectTabView(i, view); updateViewStyle(view); addTab(i, view); } - } -// updateTabStyles(); - checkedTabWidths = false; - - getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { - - @SuppressWarnings("deprecation") - @SuppressLint("NewApi") - @Override - public void onGlobalLayout() { - - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { - getViewTreeObserver().removeGlobalOnLayoutListener(this); - } else { - getViewTreeObserver().removeOnGlobalLayoutListener(this); - } - - currentPosition = pager.getCurrentItem(); - scrollToChild(currentPosition, 0); - } - }); - - pageListener.onPageSelected(0);//default - + pageListener.onPageChosen(0); } private PageOnClickListener mPageOnClickListener; - private void addTab(final int position, View view){ - if(mPageOnClickListener == null){ - mPageOnClickListener = new PageOnClickListener(); + /** + * PageOnClickListener + * + * @since 2021-04-30 + */ + class PageOnClickListener implements ClickedListener { + @Override + public void onClick(Component component) { + int tag = (int) component.getTag(); + if (mOnTabClickListener != null) { + mOnTabClickListener.onClick(tag); + } + scrollToChild(tag, 0); + pager.setCurrentPage(tag); } - view.setTag(R.id.tag_position, position); - view.setOnClickListener(mPageOnClickListener); - tabsContainer.addView(view); } - public View getTabAt(int pos) { + private void addTab(final int position, Component view) { + if (mPageOnClickListener == null) { + mPageOnClickListener = new PageOnClickListener(); + } + view.setTag(position); + view.setClickedListener(mPageOnClickListener); + tabsContainer.addComponent(view, position); + } + + /** + * 获取tab Component + * + * @param pos 选中位置 + * @return Component + */ + public Component getTabAt(int pos) { if (pos >= tabsContainer.getChildCount()) { throw new IllegalStateException("pos is too big."); } - return tabsContainer.getChildAt(pos); + return tabsContainer.getComponentAt(pos); } private void updateTabStyles() { - for (int i = 0; i < tabCount; i++) { - - View v = tabsContainer.getChildAt(i); - - //v.setLayoutParams(defaultTabLayoutParams); - //my modify + Component v = tabsContainer.getComponentAt(i); updateViewStyle(v); } - } - public void updateViewStyle(View v){ - v.setLayoutParams(expandedTabLayoutParams); - v.setBackgroundResource(tabBackgroundResId); + /** + * 更新view样式 + * + * @param v Component + */ + public void updateViewStyle(Component v) { + v.setLayoutConfig(expandedTabLayoutParams); if (shouldExpand) { v.setPadding(0, 0, 0, 0); } else { @@ -257,38 +271,39 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { } @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); + public boolean onEstimateSize(int widthMeasureSpec, int heightMeasureSpec) { + if (!shouldExpand || EstimateSpec.getMode(widthMeasureSpec) == EstimateSpec.UNCONSTRAINT) { + return false; + } - if (!shouldExpand || MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED) { - return; + if (tabsContainer.getChildCount() == 0) { + return false; } - int myWidth = getMeasuredWidth(); + int myWidth = getEstimatedWidth(); int childWidth = 0; for (int i = 0; i < tabCount; i++) { - childWidth += tabsContainer.getChildAt(i).getMeasuredWidth(); + childWidth += tabsContainer.getComponentAt(i).getEstimatedWidth(); } if (!checkedTabWidths && childWidth > 0 && myWidth > 0) { - if (childWidth <= myWidth) { for (int i = 0; i < tabCount; i++) { - tabsContainer.getChildAt(i).setLayoutParams(expandedTabLayoutParams); + tabsContainer.getComponentAt(i).setLayoutConfig(expandedTabLayoutParams); } } - checkedTabWidths = true; } + + return true; } private void scrollToChild(int position, int offset) { - if (tabCount == 0) { return; } - int newScrollX = tabsContainer.getChildAt(position).getLeft() + offset; + int newScrollX = tabsContainer.getComponentAt(position).getLeft() + offset; if (position > 0 || offset > 0) { newScrollX -= scrollOffset; @@ -298,175 +313,163 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { lastScrollX = newScrollX; scrollTo(newScrollX, 0); } - } @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - - if (isInEditMode() || tabCount == 0) { + public void onDraw(Component component, Canvas canvas) { + if (tabCount == 0) { return; } - drawTabNormalMode(canvas); } - private void drawTabNormalMode(Canvas canvas){ + private void drawTabNormalMode(Canvas canvas) { final int height = getHeight(); // 设置提示下划线的颜色 - - rectPaint.setColor(indicatorColor); + rectPaint.setColor(new Color(indicatorColor)); // default: line below current tab - View currentTab = tabsContainer.getChildAt(currentPosition); + Component currentTab = tabsContainer.getComponentAt(currentPosition); + if (currentTab == null) { + return; + } float lineLeft = currentTab.getLeft(); float lineRight = currentTab.getRight(); - // if there is an offset, start interpolating left and right coordinates between current and next tab - if (currentPositionOffset > 0f && currentPosition < tabCount - 1) { - - View nextTab = tabsContainer.getChildAt(currentPosition + 1); - final float nextTabLeft = nextTab.getLeft(); - final float nextTabRight = nextTab.getRight(); - - lineLeft = (currentPositionOffset * nextTabLeft + (1f - currentPositionOffset) * lineLeft); - lineRight = (currentPositionOffset * nextTabRight + (1f - currentPositionOffset) * lineRight); - - } - //绘制提示下划线 - canvas.drawRect(lineLeft , height - indicatorHeight, lineRight , height, rectPaint); + canvas.drawRect(lineLeft, height - indicatorHeight, lineRight, height, rectPaint); // 绘制下划线 - - rectPaint.setColor(underlineColor); + rectPaint.setColor(new Color(underlineColor)); canvas.drawRect(0, height - underlineHeight, tabsContainer.getWidth(), height, rectPaint); // 绘制分割线 - - dividerPaint.setColor(dividerColor); + dividerPaint.setColor(new Color(dividerColor)); for (int i = 0; i < tabCount - 1; i++) { - View tab = tabsContainer.getChildAt(i); + Component tab = tabsContainer.getComponentAt(i); canvas.drawLine(tab.getRight(), dividerPadding, tab.getRight(), height - dividerPadding, dividerPaint); } } - private class PageListener implements ViewPager.OnPageChangeListener { - + /** + * PageListener + * + * @since 2021-04-30 + */ + private class PageListener implements PageSlider.PageChangedListener { @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - currentPosition = position; + public void onPageSliding(int position, float positionOffset, int positionOffsetPixels) { currentPositionOffset = positionOffset; - - scrollToChild(position, (int) (positionOffset * tabsContainer.getChildAt(position).getWidth())); - + scrollToChild(position, (int) (positionOffset * tabsContainer.getComponentAt(position).getWidth())); invalidate(); if (delegatePageListener != null) { - delegatePageListener.onPageScrolled(position, positionOffset, positionOffsetPixels); + delegatePageListener.onPageSliding(position, positionOffset, positionOffsetPixels); } } @Override - public void onPageScrollStateChanged(int state) { - if (state == ViewPager.SCROLL_STATE_IDLE) { - scrollToChild(pager.getCurrentItem(), 0); + public void onPageSlideStateChanged(int state) { + if (state == PageSlider.SLIDING_STATE_IDLE) { + scrollToChild(pager.getCurrentPage(), 0); } if (delegatePageListener != null) { - delegatePageListener.onPageScrollStateChanged(state); + delegatePageListener.onPageSlideStateChanged(state); } } @Override - public void onPageSelected(int position) { - + public void onPageChosen(int position) { setSelectItem(position); - if (delegatePageListener != null) { - delegatePageListener.onPageSelected(position); + delegatePageListener.onPageChosen(position); } + currentPosition = position; + invalidate(); } - } - private SparseArray mDisSelectTabViewCache;//缓存 + private PlainArray mDisSelectTabViewCache; - private View getDisSelectTabView(int position){ - return mDisSelectTabViewCache.get(position); + private Component getDisSelectTabView(int position) { + return mDisSelectTabViewCache.get(position).get(); } - private void setDisSelectTabView(int position , View view){ - mDisSelectTabViewCache.put(position,view); + private void setDisSelectTabView(int position, Component view) { + mDisSelectTabViewCache.put(position, view); } - private SparseArray mSelectTabViewCache;//缓存 + private PlainArray mSelectTabViewCache; - private View getSelectTabView(int position){ - return mSelectTabViewCache.get(position); + private Component getSelectTabView(int position) { + return mSelectTabViewCache.get(position).get(); } - private void setSelectTabView( int position ,View view){ - mSelectTabViewCache.put(position,view); - } - - class PageOnClickListener implements View.OnClickListener{ - - @Override - public void onClick(View view) { - int tag = (int)view.getTag(R.id.tag_position); - if(mOnTabClickListener != null){ - mOnTabClickListener.onClick(tag); - } - scrollToChild(tag, 0); - pager.setCurrentItem(tag); - } + private void setSelectTabView(int position, Component view) { + mSelectTabViewCache.put(position, view); } - public void setSelectItem(int position){ - if (!(pager.getAdapter() instanceof CustomTabProvider)) { + /** + * 设置选中item + * + * @param position 当前位置 + */ + public void setSelectItem(int position) { + if (!(pager.getProvider() instanceof CustomTabProvider)) { return; } - for (int i = 0; i < tabsContainer.getChildCount(); i++) { - tabsContainer.removeViewAt(i); + for (int i = 0; i < tabsContainer.getChildCount(); i++) { + tabsContainer.removeComponentAt(i); - View view = null; + Component view; if (i == position) { - view = ((CustomTabProvider) pager.getAdapter()).getSelectTabView(i, getSelectTabView(i)); + view = ((CustomTabProvider) pager.getProvider()).getSelectTabView(i, null); setSelectTabView(i, view); - } else { - view = ((CustomTabProvider) pager.getAdapter()).getDisSelectTabView(i, getDisSelectTabView(i)); + view = ((CustomTabProvider) pager.getProvider()).getDisSelectTabView(i, null); setDisSelectTabView(i, view); } - view.setTag(R.id.tag_position, i); + view.setTag(i); - if(mPageOnClickListener == null){ + if (mPageOnClickListener == null) { mPageOnClickListener = new PageOnClickListener(); } - view.setOnClickListener(mPageOnClickListener); + view.setClickedListener(mPageOnClickListener); - tabsContainer.addView(view, i); + tabsContainer.addComponent(view, i); updateViewStyle(view); } } + /** + * 设置下标颜色值 + * + * @param indicatorColor 下标颜色值 + */ public void setIndicatorColor(int indicatorColor) { this.indicatorColor = indicatorColor; invalidate(); } + /** + * 设置下标颜色值 + * + * @param resId 下标颜色值资源id + */ public void setIndicatorColorResource(int resId) { - this.indicatorColor = getResources().getColor(resId); + try { + this.indicatorColor = getResourceManager().getElement(resId).getColor(); + } catch (IOException | NotExistException | WrongTypeException e) { + e.fillInStackTrace(); + } invalidate(); } @@ -474,6 +477,11 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { return this.indicatorColor; } + /** + * 设置下标线高度 + * + * @param indicatorLineHeightPx 下标线高度 + */ public void setIndicatorHeight(int indicatorLineHeightPx) { this.indicatorHeight = indicatorLineHeightPx; invalidate(); @@ -483,13 +491,27 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { return indicatorHeight; } + /** + * 设置下边线颜色值 + * + * @param underlineColor 下边线颜色值 + */ public void setUnderlineColor(int underlineColor) { this.underlineColor = underlineColor; invalidate(); } + /** + * 设置下边线颜色值 + * + * @param resId 资源id + */ public void setUnderlineColorResource(int resId) { - this.underlineColor = getResources().getColor(resId); + try { + this.underlineColor = getResourceManager().getElement(resId).getColor(); + } catch (IOException | NotExistException | WrongTypeException e) { + e.fillInStackTrace(); + } invalidate(); } @@ -497,13 +519,27 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { return underlineColor; } + /** + * 设置分割线颜色值 + * + * @param dividerColor 资源id + */ public void setDividerColor(int dividerColor) { this.dividerColor = dividerColor; invalidate(); } + /** + * 设置分割线颜色值 + * + * @param resId 资源id + */ public void setDividerColorResource(int resId) { - this.dividerColor = getResources().getColor(resId); + try { + this.dividerColor = getResourceManager().getElement(resId).getColor(); + } catch (IOException | NotExistException | WrongTypeException e) { + e.fillInStackTrace(); + } invalidate(); } @@ -511,6 +547,11 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { return dividerColor; } + /** + * 设置下标线高度 + * + * @param underlineHeightPx 下标线高度 + */ public void setUnderlineHeight(int underlineHeightPx) { this.underlineHeight = underlineHeightPx; invalidate(); @@ -520,6 +561,11 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { return underlineHeight; } + /** + * 设置分割线padding + * + * @param dividerPaddingPx 分割线padding + */ public void setDividerPadding(int dividerPaddingPx) { this.dividerPadding = dividerPaddingPx; invalidate(); @@ -529,6 +575,11 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { return dividerPadding; } + /** + * 设置滚动偏移量 + * + * @param scrollOffsetPx 滚动偏移量 + */ public void setScrollOffset(int scrollOffsetPx) { this.scrollOffset = scrollOffsetPx; invalidate(); @@ -538,23 +589,25 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { return scrollOffset; } + /** + * 是否展开 + * + * @param shouldExpand 是否展开 + */ public void setShouldExpand(boolean shouldExpand) { this.shouldExpand = shouldExpand; - requestLayout(); + postLayout(); } public boolean getShouldExpand() { return shouldExpand; } - public void setTabBackground(int resId) { - this.tabBackgroundResId = resId; - } - - public int getTabBackground() { - return tabBackgroundResId; - } - + /** + * tab左右padding + * + * @param paddingPx 左右padding值 + */ public void setTabPaddingLeftRight(int paddingPx) { this.tabPadding = paddingPx; updateTabStyles(); @@ -563,52 +616,4 @@ public class CustomPagerSlidingTabStrip extends HorizontalScrollView { public int getTabPaddingLeftRight() { return tabPadding; } - - @Override - public void onRestoreInstanceState(Parcelable state) { - SavedState savedState = (SavedState) state; - super.onRestoreInstanceState(savedState.getSuperState()); - currentPosition = savedState.currentPosition; - requestLayout(); - } - - @Override - public Parcelable onSaveInstanceState() { - Parcelable superState = super.onSaveInstanceState(); - SavedState savedState = new SavedState(superState); - savedState.currentPosition = currentPosition; - return savedState; - } - - static class SavedState extends BaseSavedState { - int currentPosition; - - public SavedState(Parcelable superState) { - super(superState); - } - - private SavedState(Parcel in) { - super(in); - currentPosition = in.readInt(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - super.writeToParcel(dest, flags); - dest.writeInt(currentPosition); - } - - public static final Creator CREATOR = new Creator() { - @Override - public SavedState createFromParcel(Parcel in) { - return new SavedState(in); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }; - } - } diff --git a/Library/src/com/lhh/apst/library/Margins.java b/Library/src/main/java/com/lhh/apst/library/Margins.java similarity index 40% rename from Library/src/com/lhh/apst/library/Margins.java rename to Library/src/main/java/com/lhh/apst/library/Margins.java index dbdbc89..3a4ffa9 100644 --- a/Library/src/com/lhh/apst/library/Margins.java +++ b/Library/src/main/java/com/lhh/apst/library/Margins.java @@ -3,12 +3,36 @@ package com.lhh.apst.library; /** * Created by Linhh on 16/3/8. */ -public class Margins{ +public class Margins { + /** + * 左Margin + */ public int mLeft; + + /** + * 右Margin + */ public int mRight; + + /** + * 上Margin + */ public int mTop; + + /** + * 下Margin + */ public int mBottom; - public Margins(int left, int top, int right, int bottom){ + + /** + * 构造函数 + * + * @param left 左Margin + * @param top 上Margin + * @param right 右Margin + * @param bottom 下Margin + */ + public Margins(int left, int top, int right, int bottom) { mLeft = left; mRight = right; mTop = top; diff --git a/Library/src/main/java/com/lhh/apst/library/utils/TypedAttrUtils.java b/Library/src/main/java/com/lhh/apst/library/utils/TypedAttrUtils.java new file mode 100644 index 0000000..0e4c44d --- /dev/null +++ b/Library/src/main/java/com/lhh/apst/library/utils/TypedAttrUtils.java @@ -0,0 +1,196 @@ +/* + * Copyright (C) 2021 The Chinese Software International Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package com.lhh.apst.library.utils; + +import ohos.agp.components.AttrSet; +import ohos.agp.components.element.Element; +import ohos.agp.utils.Color; +import ohos.hiviewdfx.HiLog; +import ohos.hiviewdfx.HiLogLabel; + +/** + * TypedAttrUtils + * + * @since 2021-04-13 + */ +public class TypedAttrUtils { + /** + * 日志常量 + */ + public static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0x00201, "TypedAttrUtils"); + + /** + * 颜色工具类 + * + * @param attrs 属性 + * @param attrName 属性名 + * @param defValue 默认值 + * @return int + */ + public static int getIntColor(AttrSet attrs, String attrName, int defValue) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + return attrs.getAttr(attrName).get().getColorValue().getValue(); + } else { + return defValue; + } + } + + /** + * getColor + * + * @param attrs 属性 + * @param attrName 属性名 + * @param defValue 默认值 + * @return Color + */ + public static Color getColor(AttrSet attrs, String attrName, Color defValue) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + return attrs.getAttr(attrName).get().getColorValue(); + } else { + return defValue; + } + } + + /** + * getBoolean + * + * @param attrs 属性 + * @param attrName 属性名 + * @param isDefValue 默认值 + * @return boolean + */ + public static boolean getBoolean(AttrSet attrs, String attrName, boolean isDefValue) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + return attrs.getAttr(attrName).get().getBoolValue(); + } else { + return isDefValue; + } + } + + /** + * getString + * + * @param attrs 属性 + * @param attrName 属性名 + * @param defValue 默认值 + * @return String + */ + public static String getString(AttrSet attrs, String attrName, String defValue) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + return attrs.getAttr(attrName).get().getStringValue(); + } else { + return defValue; + } + } + + /** + * getFloat + * + * @param attrs 属性 + * @param attrName 属性名 + * @param defValue 默认值 + * @return float + */ + public static float getFloat(AttrSet attrs, String attrName, float defValue) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + return attrs.getAttr(attrName).get().getFloatValue(); + } else { + return defValue; + } + } + + /** + * getInt + * + * @param attrs 属性 + * @param attrName 属性名 + * @param defValue 默认值 + * @return int + */ + public static int getInt(AttrSet attrs, String attrName, int defValue) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + return attrs.getAttr(attrName).get().getIntegerValue(); + } else { + return defValue; + } + } + + /** + * getDimensionPixelSize + * + * @param attrs 属性 + * @param attrName 属性名 + * @param defValue 默认值 + * @return int + */ + public static int getDimensionPixelSize(AttrSet attrs, String attrName, int defValue) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + return attrs.getAttr(attrName).get().getIntegerValue(); + } else { + return defValue; + } + } + + /** + * getLayoutDimension + * + * @param attrs 属性 + * @param attrName 属性名 + * @param defValue 默认值 + * @return int + */ + public static int getLayoutDimension(AttrSet attrs, String attrName, int defValue) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + HiLog.info(LABEL, "attr.getDimensionValue() = " + attrs.getAttr(attrName).get().getDimensionValue()); + return attrs.getAttr(attrName).get().getDimensionValue(); + } else { + return defValue; + } + } + + /** + * getElement + * + * @param attrs 属性 + * @param attrName 属性名 + * @param defValue 默认值 + * @return Element + */ + public static Element getElement(AttrSet attrs, String attrName, Element defValue) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + HiLog.info(LABEL, "attr.getElement() = " + attrs.getAttr(attrName).get().getElement()); + return attrs.getAttr(attrName).get().getElement(); + } else { + return defValue; + } + } + + /** + * hasValue + * + * @param attrs 属性 + * @param attrName 属性名 + * @return boolean + */ + public static boolean hasValue(AttrSet attrs, String attrName) { + if (attrs.getAttr(attrName) != null && attrs.getAttr(attrName).isPresent()) { + return true; + } else { + return false; + } + } +} diff --git a/Library/src/main/resources/base/element/color.json b/Library/src/main/resources/base/element/color.json new file mode 100644 index 0000000..7b220e6 --- /dev/null +++ b/Library/src/main/resources/base/element/color.json @@ -0,0 +1,12 @@ +{ + "color": [ + { + "name": "background_tab_pressed", + "value": "#6633B5E5" + }, + { + "name": "red", + "value": "#E43F3E" + } + ] +} diff --git a/Library/src/main/resources/base/element/float.json b/Library/src/main/resources/base/element/float.json new file mode 100644 index 0000000..19e2916 --- /dev/null +++ b/Library/src/main/resources/base/element/float.json @@ -0,0 +1,32 @@ +{ + "float": [ + { + "name": "psts_dot_wh", + "value": "10vp" + }, + { + "name": "psts_indicator_circle", + "value": "4vp" + }, + { + "name": "psts_dot_m_right", + "value": "9vp" + }, + { + "name": "psts_dot_m_tv_right", + "value": "8vp" + }, + { + "name": "psts_dot_m_top", + "value": "7vp" + }, + { + "name": "psts_dot_linelayout_h", + "value": "23vp" + }, + { + "name": "psts_dot_txt_size", + "value": "10fp" + } + ] +} diff --git a/Library/src/main/resources/base/element/string.json b/Library/src/main/resources/base/element/string.json new file mode 100644 index 0000000..b2f9e9b --- /dev/null +++ b/Library/src/main/resources/base/element/string.json @@ -0,0 +1,16 @@ +{ + "string": [ + { + "name": "app_name", + "value": "Library" + }, + { + "name": "tag_position", + "value": "tag_position" + }, + { + "name": "id_tab_txt", + "value": "id_tab_txt" + } + ] +} diff --git a/Library/src/main/resources/base/graphic/apsts_tips.xml b/Library/src/main/resources/base/graphic/apsts_tips.xml new file mode 100644 index 0000000..7ba893f --- /dev/null +++ b/Library/src/main/resources/base/graphic/apsts_tips.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/Library/src/main/resources/base/graphic/psts_background_tab.xml b/Library/src/main/resources/base/graphic/psts_background_tab.xml new file mode 100644 index 0000000..c835995 --- /dev/null +++ b/Library/src/main/resources/base/graphic/psts_background_tab.xml @@ -0,0 +1,16 @@ + + + + + + + + + \ No newline at end of file diff --git a/Library/src/test/java/com/lhh/apst/library/ExampleTest.java b/Library/src/test/java/com/lhh/apst/library/ExampleTest.java new file mode 100644 index 0000000..a038733 --- /dev/null +++ b/Library/src/test/java/com/lhh/apst/library/ExampleTest.java @@ -0,0 +1,9 @@ +package com.lhh.apst.library; + +import org.junit.Test; + +public class ExampleTest { + @Test + public void onStart() { + } +} diff --git a/Pic/Screen_20160216163404.png b/Pic/Screen_20160216163404.png deleted file mode 100644 index 2a220a3b1ca9542ed1f39ca6fffcfd547a2a7698..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30900 zcmeEt^;cWn^EDD6NJ%JOB*AHMDeg{jcz{scX>lm-?pD0G6x!laq`14gySqau@TT8? z;{D~5weDKyW=+mLYwpR+oV{m9s4C08!g_;+goN};UQS9K2??1JaXkak5#M}>G5!w; z35WQTq@=36q$E_;$=>3VjX4sMTtspz225jssBbTYKtcjrO6I$%`re=(^xc_u^dnyne z;@YGB^(bfTrR1%1gNF@LJY)aQOd(g?ZAql{Z#Dt!5F`oSYqH@%V!3-3GfgT2AW{PJ z#urj+c|OhF*~zqdE5m+Yr1+oADeM$TX!5=m$buBRYGARtU1xXi{v|4}N-h|Azezv7 zlaqynR-pus(i5u+e9fsScE_x0vJW;({4?Rn-6POuHuJ@q@40@*EJ|i+JS^lJ6;5Qz zHEFD_?d-5BrsRnnndp1!*VS0t&O))=2A%a>QsRy@7f;7RhI|(O$Vgax%x$Xu4$Nwy zj7+0m!L~XQpY%!MWX>;xOlA2r`M5l3ML)KW#RAC&YN&(Aga$R2gopQg3^<8Q42yM_v8I*FIp27XP7o+cj3 zb5*|fT=wyt1+sye7j_=+5Cf%OM!8t8;vSNl##w#60UAt)l7}1D`6sM?@67Zm;Ar6Z z@5KLc{Zv(SI+n{p$tYr}E8Bf5yV4$a{INx1BCXEe^ug5Y^~~CxWp{;9`8s<(waf9y zeXR6TTF+e*$7Z|Neq6#l)-lwTNH8F)Z?V#%y*t*F1;*g|U#BV8M%5Sk=sF^nnH03E za~adpqq4_R(U$_3*>IG+Yo8$R(_`;}!1JuPX*Ap4Ew{N^Hi*-QaCU3T=-F+{Y{`-1 zz1Pfh;&^cm+{lde?stc5G1|YA2u!s-z|fJ%Jy4LIR(NwdtQ(qVQ5=r-92Xw%(XUp?!{V zkMx`@Mq`D?3@i^elAxx_VvkalVx&2yC#TO0wJuIQkCmh445yc3Xy8cTrP9%LX);7Ppw8k@+P=qV5BzckaYX5shGRNPHWjUVdw z>hJ4M9Z(sNbo$^V<5cdH;6&cY?_|C0I`Df?|LajQSw5qNBI9Wi>;t_y$M?)hF@B{+ z1rHiFwhFd0YEhkRhBmoYJ>Ry!{0|tHke~1VbN@6OPNIZ{^2{#2i_#~;|{}%bJGt3qG5m_p)06xT;C5 zNiay}NOO8W#a&VMQPex>bu|oat(L@T->L8YA}-o+x!x!Jp%v z%Pi$rsQGYJYw_Yfb78l&uocw@A@S42p5dH}oc&hvTcbq7T2)t8P*pd#Mdz{5wGCIY zPk}+hGH8?|OGN)qc^IpTThOWF%AVr;B3`Zxol&74^6{xj>`DBClkuZTvPs^FxGBT@ zwI6s&nki4%x;n8@4q3G?oQ81xhlOF{@-5Bn%{Mymmak7WsCs zZPcyQ?VaY5EDk??v;Ju7ITLNQYm;JLH&ePq{@#s!jJ<-p%`D&}-^X+2x{ue2P(_FI z_8e8=jZnIo$))P{>eb5t!mfA2pCdGDW`-g{@e>)!Gu&M_wXHFZY>xD2-E97|k+4ab zuU%}edtYz9q_t@9yI=uro~72h%FEo|cFV8{Gb?}?k{ZHl%L>t_(7)0LH9YTF9Hi{j^_?uxCdx0%H_;0_&AC}N zo;eVEu?wpU)p>;r-w5es&t!vIaGLoHnp(0wGdwIk&u)AVOiyU8`H!zw=Vshm?VBLG z#QWOEb2}BAkUhf|=a-_J3ywKP>+FWC}r%R#_$7i4)RcTHuOz&3sEKg6@ z$8e@hnYk%yzLm846IUau$RNjp)AqLZYU+KlrHZJ4q$9d@ZwGSN1El+)z%KqL|T%mF{bUw^Dw7>Uo`Odw9Gl;X^ zymc&c_}9RjQRRNSVXD2tZSswh^P2l&i^Jhe;Tl;ZD#q90⁣0ySPBfkfy8n=1(3h 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%0Adip)Xe^#z|Xabs9pX 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 OfAZ2wQpFNRAO08nlb(kF diff --git a/Pic/Screen_20160216163452.png b/Pic/Screen_20160216163452.png deleted file mode 100644 index 3bc6ca36ef009e5de553f434ec0cf526bcebb4bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28828 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 Qmk5f2jH-0mGqb?|0_(dkjQ{`u diff --git a/Pic/Screen_20160411141706.png b/Pic/Screen_20160411141706.png deleted file mode 100644 index 08da89fbdaa812164f58a368703fec5db5843273..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31539 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 Ppu)}5)z4*}Q$iB}!y(lG diff --git a/Pic/categry_icon_p.png b/Pic/categry_icon_p.png deleted file mode 100755 index 1ff85e49b307afb766b2d1ecd81a3a150c2dacb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1303 zcmeAS@N?(olHy`uVBq!ia0vp^4nS8U}fi7AzZCsS=07??9MLn2Bde0{8v^Kf6`()~Xj@TAnpKdC8`Lf!&sHg;q@=(~U%$M( zT(8_%FTW^V-_X+15@d#vkuFe$ZgFK^Nn(X=Ua>OF1ees}t-3#_`hBq$Z(46Le)Ln;eW^@CE2 z^Gl18f$@>14ATq@JNy=b6armiQ# zzd*q`*i1pgH!(Rg4Y0ng`4?MZnClJnmmT0|TS0r;B4q#jQ89 zH+mg*kZBjbys%^PwT1i--f?sAv5Kot&x_qu^4+wiflDvwqvjXcH5M;lJ$ewum09$! zP5M-zN~7G_r~B+{oE4nkJ)ZQt&CK+eis5-jp`Qv2j2sROOacuJ70biFA3Hp~E`U3_ zFD$O?z+R1(OwHC>xBT@E_foFE$#j2i$C|?U=HHp+41SC(3J>o86v&_ZreT)xcK3^w zJ=P0^&QB}#VM=@CBGaA!QJL*gh>gYfW!B3?*B`i|SMjK$Rw#Vq9wzfg8IP+Z4m~RW zDHzicUzqLv#;>N+__^KXP{#R>LSt^d&i=U1)git7z>S^z7O)69a7{k6#6Z&rMg=!< zD71Pe2F(yrgHf7}ED8z*jHwLSTD4piTTb4-w(^Z}l{M?9B@g)pf3j_<3HoPtT(hBJ d#dH4#MuytriXO!&{sEw(%G1@)Wt~$(69A!%y_*04 diff --git a/Pic/classify_icon_n.png b/Pic/classify_icon_n.png deleted file mode 100755 index 0eb34d1e0871e55c6268476594fd0b3155a2873d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1286 zcmbVLU2NM_6m}UZqtc`y*d!2CmNTYJCGk%ZH#W@{JC3&uT&g7Mf_Ug$`?m2~|6t!P zX*!S!f`Yc9KEf)oYSN%j1J)IZp^AwCQ(-F7*anPNl{PURK!s=^?FSIoP15pE_P~|x zbME!|zVma>dA*~3*M_D?nlKF8klrn2kW8TW$@Pus`_19TS(bhRXDFH>DfF;GI>JX;o@vEvi$LC7 zy@$_8a?Kao#fbuh4o{NBVlh+y z+-Fp~?Ex4kP^8rqOh-{xh%K*HC{!}Cq&g%WqDa&9^IEp{U3=sSr*@>sG4E<2iyG%s^%*J*Ej%l*|kl4xx&1$ zMg(k(ZI#88Ov(S1c@?YwpQ@247}9T#f3-{f2=$<^t~5W|tc(w^(9F1KIK%?=IfgYv z(vpxXUHN6a()205ab&7IH~rzn$hOxenu%kV8)v{cM~w-A%9d9bhtJc=ZtXa2o?l-$*hO8Ky;5lr7QTFUxM`;OXgL$P6+P41GC#6+D|TWkJMsSC zmo7gJTOQmro_}EM{*?0G2kxKK6ISz$mPF^9qZ?OU)UzWG`>muy^&y%?Ol q^P7?AjQtT!RDO8$sDN!T?S@8733MKO=VV~W2c=W((g|_jOaA~6eXjoi diff --git a/Pic/classify_icon_p.png b/Pic/classify_icon_p.png deleted file mode 100755 index 5f1f86cd7bb45f0bba8ae63b07b4d736585cd99d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1242 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 diff --git a/Pic/mine_icon_p.png b/Pic/mine_icon_p.png deleted file mode 100755 index c5d61b2d790db26831b820671e63e315047d2e17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1813 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 Rw#;76m<+aSxyzR1{{U9CF@yjB diff --git a/Pic/update_dynamic_p.png b/Pic/update_dynamic_p.png deleted file mode 100755 index 3d39b065e4600451f681e9f860f5e80465f602aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2136 zcmaJ?dpMN&9)ArZ<~c4+RP1o3alg!r84NRH7!1oWB@|X!W9DVvn2VWltG32iB_t=? z>O`728zQSm3b9cs)nn=MbdcndlX7cSlnv*dHtqg#ocDR(_xJmKpYP}My?vhNcO+!% z*Lo;Z6aWBvfdQ;gcxA#LT}K=K-^@2(b5^XPrNjEuQn5L z*iSCmb|R69PVh^?lU!)76dKtL z`}x7a(WLx%S}4o^b1eA8zzO7X35`fhOG_i9ITOUv1R{w_rK&l|WIXJFmt~0L+;qH1 zX0gh^0%bfYB#}d65mwE}jT5KH88|r8KS~fvzR-$fpW6gCjF`@q5J?0lbxEs^9M1oD z6$-z2%jBWppZWezVp({G1SE!nGI5HO2M;dZLLEv%^Ob^JxmX%57ALKCF+?Dii)8|_ z1nV0{!P;`TJV>NA*nL89IJ7{KOwJYYz(5uQ2Xhc0h)<(>`};VNo!$JL$$lh~pNqGP z4~6RPPG(VD+$erz@+y`k=A{Thk$e@){}b!JCRQy5p#+Z10;NzY$oH3uh1gF;)1b9; zab1(|GnT)0E|fK~L^v6udbEET^{NThk9zw>xbWeN^g$7svLBb!bYAcWH@zg&O7; zP@55lls_O^qIaC5PINvS&zy|4=|c{!IPjS0Nd2-*S5?+MY3^@rZ}VToBCAY#5Fv@D zQ0AE?+qqypN*!e91QTkKTXlNB8bnMZFpsKhOLnDJA@a2j zdygB&U(Ve%-&L=rQo3c1ZrM89*{sjY+Nd(<1JI+`TW4vt<1{3WN$xYBE4i{qm(JX9 z4XJvW;8kT*-as8L?LJw*>4&#riaRP{K!KNr1v98D^+K&)*Xtm~H?druf`XJ=nP zF(qB%rRurDk;eM3(D-45TeQt&=I_Ib_>=U4B77iwh``oUUfK0_sTHv^t*H4}{NnSE z9P?|eQ3XREbwFpnQzzBhZVUrtcQo$L_qrTp&9V(%I-fBeTK2HJzf^bXy=ie!w2gnt zQ@kB;`cdC`>hu(u>RDh``Lv|Pe)E$mmuYQToS>E&7rNE+xT2JwFyS-RV<%ni zc$=tY(MC$;&C)vUgUU=wUcP7xeH-Us;fXg7?s4}F`QrT-osPabehbh1fCu_XF&8`Y zetI*?Mp`LG?|&E9g&%SI_m+FpnyvBQKen^@=Lfrgd3q@(RoBtX%uT3FeVbYvad+7DWcI+vgIx0>c7Y!lAt8)$n5}18`<+PR2{0e5tq8<1^{7t!I?(jd)追踪到原项目版本** -## Feature - * 支持Tab小圆点以及数量显示和隐藏 - * 支持自定义Tab View - * 支持使用Bitmap、Drawable和本地resId来显示Tab图标 - * 支持对Tab图标替换成自定义View来加载网络图片 - * 支持自由设置小圆点、tab大小和位置等设置 - * 支持实现如:微博等不均匀Tab的APP风格,并支持滑动 +#### 项目介绍 -Project site: . +- 项目名称:AdvancedPagerSlidingTabStrip +- 所属系列:openHarmony的第三方组件适配移植 +- 功能:支持Tab小圆点以及数量显示和隐藏、支持自定义Tab Component,支持使用Component、Element和本地resId来显示Tab图标, +支持自由设置小圆点、tab大小和位置等设置,支持实现如:微博等不均匀Tab的APP风格,并支持滑动 +- 项目移植状态:100% +- 调用差异:无 +- 开发版本:sdk5,DevEco Studio2.1 beta3 +- 基线版本:无 +- 项目作者和维护人:高建明 +- 联系方式: +- 原项目Doc地址: -最新版本:v1.8.0 +#### 效果演示 -效果图: + + -![p1](https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/Screen_20160216163404.png) + + -![p2](https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/Screen_20160216163428.png) + -![p3](https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/Screen_20160216163452.png) +#### 安装教程 -![p4](https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/Screen_20160411141706.png) - -##导入项目 - -**Gradle dependency:** -``` groovy -compile 'homhomlin.lib:apsts:1.8.0' -``` - -or +1.在项目根目录下的build.gradle文件中, + ``` +allprojects { + repositories { + maven { + url 'https://s01.oss.sonatype.org/content/repositories/snapshots/' + } + } +} + ``` -**Maven dependency:** -``` xml - - homhomlin.lib - apsts - 1.8.0 - +2.在entry模块的build.gradle文件中, + ``` + dependencies { + implementation('com.gitee.chinasoft_ohos:AdvancedPagerSlidingTabStrip:0.0.1-SNAPSHOT') + ...... + } + ``` +在sdk5,DevEco Studio2.1 beta3下项目可直接运行 +如无法运行,删除项目.gradle,.idea,build,gradle,build.gradle文件, +并依据自己的版本创建新项目,将新项目的对应文件复制到根目录下 + +#### 使用说明 + +在 layout 文件中: + +```xml + ``` - -##用法 - -基本AdvancedPagerPagerSlidingTabStrip: - -在需要添加的界面xml中添加组件和ViewPager -``` xml - - - +在代码中find该组件,并且设置provider和PageSlider。 ``` -在代码中find该组件,并且设置adapter和ViewPager。 -``` java - ViewPager pager = (ViewPager) findViewById(R.id.pager); - pager.setAdapter(new TestAdapter(getSupportFragmentManager())); - - + PageSlider pager = (PageSlider) findViewById(R.id.pager); + pager.setProvider(new MySlidePagerProvider(this)); + AdvancedPagerSlidingTabStrip tabs = (AdvancedPagerSlidingTabStrip) findViewById(R.id.tabs); tabs.setViewPager(pager); ``` AdvancedPagerSlidingTabStrip支持绑定OnPageChangeListener,并且不影响使用效果。 - -``` java +``` tabs.setOnPageChangeListener(mPageChangeListener); ``` 通过调用AdvancedPagerSlidingTabStrip的showDot(int index)和hideDot(int index)来显示或者隐藏Tab上的小圆点,index代表需要显示和隐藏的tab序列位置(0 ~ N)。 通过调用showDot(int index,String txt)方法可以显示小圆点文字,并同样通过hideDot来隐藏。如: - -``` java +``` tabs.showDot(0, “99+”); ``` +  +  +  +  +  +  -## Tab显示模式 - -* 基本Adapter显示 +基本Adapter显示 1.纯文本显示 - 通过实现Adapter内的getPageTitle()接口即可显示纯文本情况的效果。 + 通过实现Provider内的getPageTitle()接口即可显示纯文本情况的效果。 2.图文显示 - 通过将Adapter实现AdvancedPagerSlidingTabStrip.IconTabProvider接口,并实现其中的getPageIcon(展示未选中的图片)、getPageSelectIcon(展示选中的图片)和getPageIconText(展示的文本)方法即可显示图文效果。 + 通过将Provider实现AdvancedPagerSlidingTabStrip.IconTabProvider接口,并实现其中的getPageIcon(展示未选中的图片)、getPageSelectIcon(展示选中的图片)和getPageIconText(展示的文本)方法即可显示图文效果。 - 其中getPageIcon(展示未选中的图片)和getPageSelectIcon方法可以通过改变方法返回值来显示不同类型的图片,可以选择的返回值为Bitmap、Drawable和ResId。 + 其中getPageIcon(展示未选中的图片)和getPageSelectIcon方法可以通过改变方法返回值来显示不同类型的图片,可以选择的返回值为Component、Element和本地resId。 3.自定义图片View显示 - 通过将Adapter实现AdvancedPagerSlidingTabStrip.ViewTabProvider接口,并实现其中的onSelectIconView(选中的自定义图片View)、onIconView(未选中的自定义图片View)和getPageIconText(文本)方法即可。 + 通过将Provider实现AdvancedPagerSlidingTabStrip.ViewTabProvider接口,并实现其中的onSelectIconView(选中的自定义图片View)、onIconView(未选中的自定义图片View)和getPageIconText(文本)方法即可。 - 需要注意的是,onSelectIconView和onIconView两个方法的返回值均为View,并会回调回上一次使用的View缓存对象,你可以通过判断返回的View是否为null来决定是否新建View对象。(PS:不判断缓存将导致你每次调用都会创建新的View对象。) + 需要注意的是,onSelectIconView和onIconView两个方法的返回值均为Component,并会回调回上一次使用的Component缓存对象,你可以通过判断返回的Component是否为null来决定是否新建Component对象 。 - 你可以直接创建并返回ImageView对象,也可以返回其他View子类,该模式可以用于显示网络图片,需要注意的是你需要手动给View添加LayoutParams来控制其大小,并只能使用RelativeLayout.LayoutParams,具体实现方式可以查看[Demo](https://github.com/HomHomLin/AdvancedPagerSlidingTabStrip/blob/master/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/ViewTabActivity.java)。 +  +  +  +  +  +  -* 自定义Tab +自定义Tab 我知道以上模式可能并不能完全满足需求,有时候可能我们需要的是更复杂的Tab,所以添加自定义tab来满足各种各样的需求。 当前自定义tab被封装到另一个tab类中,通过使用CustomPagerSlidingTabStrip控件来实现,该控件的所有使用方法和AdvancedPagerSlidingTabStrip一致。 - 通过将Adapter实现CustomPagerSlidingTabStrip.CustomTabProvider并实现其中getSelectTabView(选中的View)和getDisSelectTabView(未选中的View)方法来实现自定义Tab,两个方法同样会回调上一次使用的View缓存对象。具体实现方式可以查看[Demo](https://github.com/HomHomLin/AdvancedPagerSlidingTabStrip/blob/master/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/CustomTabActivity.java)。 - -## 拓展的Provider显示设置 +  +  +  +  +  +  - 有时候我们不使用自定义View显示模式又想调整现有的Tab,比如设置小圆点位置、tab大小和间距等来满足原有就可以实现的需求。 +拓展的Provider显示设置 - AdvancedPagerSlidingTabStrip提供了几个Provider来实现这些功能,你可以通过将你的Adapter实现定制的接口方法来实现,具体可以查看demo中的WeiboTabActivity.java。 + 有时候我们不使用自定义Component显示模式又想调整现有的Tab,比如设置小圆点位置、tab大小和间距等来满足原有就可以实现的需求。 -* AdvancedPagerSlidingTabStrip.LayoutProvider + AdvancedPagerSlidingTabStrip提供了几个Provider来实现这些功能,你可以通过将你的Provider实现定制的接口方法来实现,具体可以查看demo中的WeiboTabActivity.java。 + +  +  +  +  +  +  + +AdvancedPagerSlidingTabStrip.LayoutProvider 通过将Adapter实现AdvancedPagerSlidingTabStrip.LayoutProvider可以实现对Tab以及内容icon的Layout设置。 - ``` java + ``` public float getPageWeight(int position); ``` - 该方法用于设置每个pageTab在整个tabs中的权重。 -``` java +``` public int[] getPageRule(int position); ``` +该方法用于设置每个tab的相对位置。 -该方法用于设置每个tab的相对位置,如将tab设置为靠左:return new int[]{ - RelativeLayout.ALIGN_PARENT_LEFT};。 - - ``` java + ``` public Margins getPageMargins(int position); ``` + 该方法用于设置每个tab的间距大小,如将tab设置为距离左边距30:return new Margins(30,0,0,0); - 该方法用于设置每个tab的间距大小,如将tab设置为距离左边距30px:return new Margins(30,0,0,0);。 +  +  +  +  +  +  - * AdvancedPagerSlidingTabStrip.TipsProvider +AdvancedPagerSlidingTabStrip.TipsProvider 通过将Adapter实现AdvancedPagerSlidingTabStrip.TipsProvider可以实现对小圆点的设置。 - - ``` java + ``` public int[] getTipsRule(int position); ``` - 该方法用于设置小圆点的相对位置。 - - ``` java + ``` public Margins getTipsMargins(int position); ``` - 该方法用于设置小圆点在tab中的间距大小。 -``` java +``` public Drawable getTipsDrawable(int position); ``` 该方法用于设置小圆点的背景,默认为红色圆角图。 -## XML样式参数 +配置 * `apTabIndicatorColor` 导航条的颜色 * `apTabUnderlineColor` Tab底部下划线的颜色 @@ -195,11 +214,24 @@ public Drawable getTipsDrawable(int position); * `apTabTextSelectColor` 你所选择的那个tab的颜色 * `apTabDrawMode` 绘制模式,text或者normal,用于是否将下划线绘制为跟随TextView -## Developed By +#### 测试信息 + +CodeCheck代码测试无异常 - * Linhonghong - +CloudTest代码测试无异常 + +火绒安全病毒安全检测通过 + +当前版本demo功能与原组件基本无差异 + +测试员:李文琪 + +#### 版本迭代 + +- 0.0.1-SNAPSHOT + +#### 版权和许可信息 -##License Copyright 2016 LinHongHong Licensed under the Apache License, Version 2.0 (the "License"); @@ -212,4 +244,7 @@ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file +limitations under the License. + + + diff --git a/app/app.iml b/app/app.iml deleted file mode 100644 index a5bdf5a..0000000 --- a/app/app.iml +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle deleted file mode 100644 index c02b18c..0000000 --- a/app/build.gradle +++ /dev/null @@ -1,35 +0,0 @@ -apply plugin: 'com.android.application' - -android { - compileSdkVersion 23 - buildToolsVersion "23.0.1" - - defaultConfig { - applicationId "com.lhh.apst.advancedpagerslidingtabstrip" - minSdkVersion 9 - targetSdkVersion 23 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:23.1.1' - compile 'com.android.support:support-v4:23.1.1' - compile 'com.android.support:design:23.1.1' - - compile project(':Library') - - compile 'homhomlin.lib:frescoimageview:1.2.0' - - compile 'com.facebook.fresco:fresco:0.9.0' - compile 'com.facebook.fresco:imagepipeline-okhttp:0.9.0' -// compile 'homhomlin.lib:apsts:1.4.0' -} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro deleted file mode 100644 index 40bdd43..0000000 --- a/app/proguard-rules.pro +++ /dev/null @@ -1,17 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in F:\Android\sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} diff --git a/app/src/androidTest/java/com/lhh/apst/advancedpagerslidingtabstrip/ApplicationTest.java b/app/src/androidTest/java/com/lhh/apst/advancedpagerslidingtabstrip/ApplicationTest.java deleted file mode 100644 index a7d16a5..0000000 --- a/app/src/androidTest/java/com/lhh/apst/advancedpagerslidingtabstrip/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.lhh.apst.advancedpagerslidingtabstrip; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml deleted file mode 100644 index e1c8bf7..0000000 --- a/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/APSTSViewPager.java b/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/APSTSViewPager.java deleted file mode 100644 index 7fd8cad..0000000 --- a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/APSTSViewPager.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.lhh.apst.advancedpagerslidingtabstrip; - -import android.content.Context; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.view.MotionEvent; - -/** - * Created by linhonghong on 2015/8/10. - */ -public class APSTSViewPager extends ViewPager { - private boolean mNoFocus = false; //if true, keep View don't move - public APSTSViewPager(Context context, AttributeSet attrs) { - super(context, attrs); - } - public APSTSViewPager(Context context){ - this(context,null); - } - - public boolean onInterceptTouchEvent(MotionEvent event) { - if (mNoFocus) { - return false; - } - return super.onInterceptTouchEvent(event); - } - - public void setNoFocus(boolean b){ - mNoFocus = b; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/App.java b/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/App.java deleted file mode 100644 index 5527eb1..0000000 --- a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/App.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.lhh.apst.advancedpagerslidingtabstrip; - -import android.app.Application; - -import com.facebook.drawee.backends.pipeline.Fresco; -import com.facebook.imagepipeline.backends.okhttp.OkHttpImagePipelineConfigFactory; -import com.facebook.imagepipeline.core.ImagePipelineConfig; -import com.squareup.okhttp.OkHttpClient; - -/** - * Created by Linhh on 16/2/16. - */ -public class App extends Application{ - @Override - public void onCreate() { - super.onCreate(); - ImagePipelineConfig frescoConfig = OkHttpImagePipelineConfigFactory - .newBuilder(this, new OkHttpClient()) - .build(); - Fresco.initialize(this,frescoConfig); - } -} diff --git a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/CustomTabActivity.java b/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/CustomTabActivity.java deleted file mode 100644 index 283be21..0000000 --- a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/CustomTabActivity.java +++ /dev/null @@ -1,178 +0,0 @@ -package com.lhh.apst.advancedpagerslidingtabstrip; - -import android.app.Activity; -import android.content.Context; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBarActivity; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.TextView; - -import com.lhh.apst.fragments.FirstFragment; -import com.lhh.apst.fragments.FourthFragment; -import com.lhh.apst.fragments.SecondFragment; -import com.lhh.apst.fragments.ThirdFragment; -import com.lhh.apst.library.AdvancedPagerSlidingTabStrip; -import com.lhh.apst.library.CustomPagerSlidingTabStrip; -import com.lhh.apst.library.ViewHolder; - -/** - * Created by linhonghong on 2015/8/10. - */ -public class CustomTabActivity extends ActionBarActivity implements ViewPager.OnPageChangeListener{ - - public CustomPagerSlidingTabStrip mAPSTS; - public APSTSViewPager mVP; - - private static final int VIEW_FIRST = 0; - private static final int VIEW_SECOND = 1; - private static final int VIEW_THIRD = 2; - private static final int VIEW_FOURTH = 3; - - private static final int VIEW_SIZE = 4; - - private Context mContext; - - private FirstFragment mFirstFragment = null; - private SecondFragment mSecondFragment = null; - private ThirdFragment mThirdFragment = null; - private FourthFragment mFourthFragment = null; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mContext = this; - setContentView(R.layout.activity_custom_tab); - findViews(); - init(); - } - - private void findViews(){ - mAPSTS = (CustomPagerSlidingTabStrip)findViewById(R.id.tabs); - mVP = (APSTSViewPager)findViewById(R.id.vp_main); - } - - private void init(){ - mVP.setOffscreenPageLimit(VIEW_SIZE); - FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager()); - - mVP.setAdapter(new FragmentAdapter(getSupportFragmentManager())); - - adapter.notifyDataSetChanged(); - mAPSTS.setViewPager(mVP); - mAPSTS.setOnPageChangeListener(this); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - - } - - @Override - public void onPageScrollStateChanged(int state) { - - } - - public class FragmentAdapter extends FragmentStatePagerAdapter implements CustomPagerSlidingTabStrip.CustomTabProvider{ - - protected LayoutInflater mInflater; - - public FragmentAdapter(FragmentManager fm) { - super(fm); - mInflater = LayoutInflater.from(mContext); - } - - @Override - public Fragment getItem(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - if(null == mFirstFragment) - mFirstFragment = FirstFragment.instance(); - return mFirstFragment; - - case VIEW_SECOND: - if(null == mSecondFragment) - mSecondFragment = SecondFragment.instance(); - return mSecondFragment; - - case VIEW_THIRD: - if(null == mThirdFragment) - mThirdFragment = ThirdFragment.instance(); - return mThirdFragment; - - case VIEW_FOURTH: - if(null == mFourthFragment) - mFourthFragment = FourthFragment.instance(); - return mFourthFragment; - default: - break; - } - } - return null; - } - - @Override - public int getCount() { - return VIEW_SIZE; - } - - @Override - public CharSequence getPageTitle(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return "FIRST"; - case VIEW_SECOND: - return "SECOND"; - case VIEW_THIRD: - return "THIRD"; - case VIEW_FOURTH: - return "FOURTH"; - default: - break; - } - } - return null; - } - - @Override - public View getSelectTabView(int position, View convertView) { - if (convertView == null){ - convertView = mInflater.inflate(R.layout.custom_select_tab, null); - } - - TextView tv = ViewHolder.get(convertView, R.id.tvTab); - - tv.setText(getPageTitle(position)); - - return convertView; - } - - @Override - public View getDisSelectTabView(int position, View convertView) { - if (convertView == null){ - convertView = mInflater.inflate(R.layout.custom_disselect_tab, null); - } - - TextView tv = ViewHolder.get(convertView, R.id.tvTab); - - tv.setText(getPageTitle(position)); - - return convertView; - } - } -} - diff --git a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/IconTabActivity.java b/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/IconTabActivity.java deleted file mode 100644 index db835f8..0000000 --- a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/IconTabActivity.java +++ /dev/null @@ -1,183 +0,0 @@ -package com.lhh.apst.advancedpagerslidingtabstrip; - -import android.graphics.Rect; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBarActivity; -import android.widget.RelativeLayout; - -import com.lhh.apst.fragments.FirstFragment; -import com.lhh.apst.fragments.FourthFragment; -import com.lhh.apst.fragments.SecondFragment; -import com.lhh.apst.fragments.ThirdFragment; -import com.lhh.apst.library.AdvancedPagerSlidingTabStrip; - -/** - * Created by linhonghong on 2015/8/11. - */ -public class IconTabActivity extends ActionBarActivity implements ViewPager.OnPageChangeListener{ - - public AdvancedPagerSlidingTabStrip mAPSTS; - public APSTSViewPager mVP; - - private static final int VIEW_FIRST = 0; - private static final int VIEW_SECOND = 1; - private static final int VIEW_THIRD = 2; - private static final int VIEW_FOURTH = 3; - - private static final int VIEW_SIZE = 4; - - private FirstFragment mFirstFragment = null; - private SecondFragment mSecondFragment = null; - private ThirdFragment mThirdFragment = null; - private FourthFragment mFourthFragment = null; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_icon_tab); - findViews(); - init(); - } - - private void findViews(){ - mAPSTS = (AdvancedPagerSlidingTabStrip)findViewById(R.id.tabs); - mVP = (APSTSViewPager)findViewById(R.id.vp_main); - } - - private void init(){ - mVP.setOffscreenPageLimit(VIEW_SIZE); - FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager()); - - mVP.setAdapter(new FragmentAdapter(getSupportFragmentManager())); - - adapter.notifyDataSetChanged(); - mAPSTS.setViewPager(mVP); - mAPSTS.setOnPageChangeListener(this); - mVP.setCurrentItem(VIEW_FIRST); - mAPSTS.showDot(VIEW_FIRST,"99+"); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - - } - - @Override - public void onPageScrollStateChanged(int state) { - - } - - public class FragmentAdapter extends FragmentStatePagerAdapter implements AdvancedPagerSlidingTabStrip.IconTabProvider{ - - public FragmentAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public Fragment getItem(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - if(null == mFirstFragment) - mFirstFragment = FirstFragment.instance(); - return mFirstFragment; - - case VIEW_SECOND: - if(null == mSecondFragment) - mSecondFragment = SecondFragment.instance(); - return mSecondFragment; - - case VIEW_THIRD: - if(null == mThirdFragment) - mThirdFragment = ThirdFragment.instance(); - return mThirdFragment; - - case VIEW_FOURTH: - if(null == mFourthFragment) - mFourthFragment = FourthFragment.instance(); - return mFourthFragment; - default: - break; - } - } - return null; - } - - @Override - public int getCount() { - return VIEW_SIZE; - } - - @Override - public CharSequence getPageTitle(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return "first"; - case VIEW_SECOND: - return "second"; - case VIEW_THIRD: - return "third"; - case VIEW_FOURTH: - return "fourth"; - default: - break; - } - } - return null; - } - - @Override - public Integer getPageIcon(int index) { - if(index >= 0 && index < VIEW_SIZE){ - switch (index){ - case VIEW_FIRST: - return R.mipmap.home_main_icon_n; - case VIEW_SECOND: - return R.mipmap.home_categry_icon_n; - case VIEW_THIRD: - return R.mipmap.home_live_icon_n; - case VIEW_FOURTH: - return R.mipmap.home_mine_icon_n; - default: - break; - } - } - return 0; - } - - @Override - public Integer getPageSelectIcon(int index) { - if(index >= 0 && index < VIEW_SIZE){ - switch (index){ - case VIEW_FIRST: - return R.mipmap.home_main_icon_f_n; - case VIEW_SECOND: - return R.mipmap.home_categry_icon_f_n; - case VIEW_THIRD: - return R.mipmap.home_live_icon_f_n; - case VIEW_FOURTH: - return R.mipmap.home_mine_icon_f_n; - default: - break; - } - } - return 0; - } - - @Override - public Rect getPageIconBounds(int position) { - return null; - } - } -} diff --git a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/MainActivity.java b/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/MainActivity.java deleted file mode 100644 index 72a5ffb..0000000 --- a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/MainActivity.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.lhh.apst.advancedpagerslidingtabstrip; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.support.v7.app.ActionBarActivity; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Button; - - -public class MainActivity extends ActionBarActivity { - - private Button mNormalTab; - private Button mIconTab; - private Button mCustomTab; - private Button mViewTab; - private Button mWeiboTab; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - findViews(); - setButton(); - } - - private void findViews(){ - mIconTab = (Button)findViewById(R.id.icontab); - mNormalTab = (Button)findViewById(R.id.noramltab); - mCustomTab = (Button)findViewById(R.id.customtab); - mViewTab = (Button)findViewById(R.id.viewtab); - mWeiboTab = (Button)findViewById(R.id.weibotab); - } - - private void setButton(){ - mIconTab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - MainActivity.this.startActivity(new Intent(MainActivity.this,IconTabActivity.class)); - } - }); - mNormalTab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - MainActivity.this.startActivity(new Intent(MainActivity.this,NormalTabActivity.class)); - } - }); - mCustomTab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - MainActivity.this.startActivity(new Intent(MainActivity.this,CustomTabActivity.class)); - } - }); - mViewTab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - MainActivity.this.startActivity(new Intent(MainActivity.this,ViewTabActivity.class)); - - } - }); - mWeiboTab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - MainActivity.this.startActivity(new Intent(MainActivity.this,WeiboTabActivity.class)); - } - }); - } - -} diff --git a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/NormalTabActivity.java b/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/NormalTabActivity.java deleted file mode 100644 index 4efb236..0000000 --- a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/NormalTabActivity.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.lhh.apst.advancedpagerslidingtabstrip; - -import android.app.Activity; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBarActivity; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; - -import com.lhh.apst.fragments.FirstFragment; -import com.lhh.apst.fragments.FourthFragment; -import com.lhh.apst.fragments.SecondFragment; -import com.lhh.apst.fragments.ThirdFragment; -import com.lhh.apst.library.AdvancedPagerSlidingTabStrip; - -/** - * Created by linhonghong on 2015/8/10. - */ -public class NormalTabActivity extends ActionBarActivity implements ViewPager.OnPageChangeListener{ - - public AdvancedPagerSlidingTabStrip mAPSTS; - public APSTSViewPager mVP; - - private static final int VIEW_FIRST = 0; - private static final int VIEW_SECOND = 1; - private static final int VIEW_THIRD = 2; - private static final int VIEW_FOURTH = 3; - - private static final int VIEW_SIZE = 4; - - private FirstFragment mFirstFragment = null; - private SecondFragment mSecondFragment = null; - private ThirdFragment mThirdFragment = null; - private FourthFragment mFourthFragment = null; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_normal_tab); - findViews(); - init(); - } - - private void findViews(){ - mAPSTS = (AdvancedPagerSlidingTabStrip)findViewById(R.id.tabs); - mVP = (APSTSViewPager)findViewById(R.id.vp_main); - } - - private void init(){ - mVP.setOffscreenPageLimit(VIEW_SIZE); - FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager()); - - mVP.setAdapter(new FragmentAdapter(getSupportFragmentManager())); - - adapter.notifyDataSetChanged(); - mAPSTS.setViewPager(mVP); - mAPSTS.setOnPageChangeListener(this); - mAPSTS.showDot(VIEW_FIRST); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - - } - - @Override - public void onPageScrollStateChanged(int state) { - - } - - public class FragmentAdapter extends FragmentStatePagerAdapter{ - - public FragmentAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public Fragment getItem(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - if(null == mFirstFragment) - mFirstFragment = FirstFragment.instance(); - return mFirstFragment; - - case VIEW_SECOND: - if(null == mSecondFragment) - mSecondFragment = SecondFragment.instance(); - return mSecondFragment; - - case VIEW_THIRD: - if(null == mThirdFragment) - mThirdFragment = ThirdFragment.instance(); - return mThirdFragment; - - case VIEW_FOURTH: - if(null == mFourthFragment) - mFourthFragment = FourthFragment.instance(); - return mFourthFragment; - default: - break; - } - } - return null; - } - - @Override - public int getCount() { - return VIEW_SIZE; - } - - @Override - public CharSequence getPageTitle(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return "FIRST"; - case VIEW_SECOND: - return "SECOND"; - case VIEW_THIRD: - return "THIRD"; - case VIEW_FOURTH: - return "FOURTH"; - default: - break; - } - } - return null; - } -// -// @Override -// public float getPageWeight(int position) { -// if(position >= 0 && position < VIEW_SIZE){ -// switch (position){ -// case VIEW_FIRST: -// return 1.0f; -// case VIEW_SECOND: -// return 2.0f; -// case VIEW_THIRD: -// return 2.0f; -// case VIEW_FOURTH: -// return 1.0f; -// default: -// break; -// } -// } -// return 1.0f; -// } - } -} diff --git a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/ViewTabActivity.java b/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/ViewTabActivity.java deleted file mode 100644 index e9a5ed7..0000000 --- a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/ViewTabActivity.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.lhh.apst.advancedpagerslidingtabstrip; - -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBarActivity; -import android.view.View; -import android.view.ViewGroup; -import android.widget.RelativeLayout; - -import com.lhh.apst.fragments.FirstFragment; -import com.lhh.apst.fragments.FourthFragment; -import com.lhh.apst.fragments.SecondFragment; -import com.lhh.apst.fragments.ThirdFragment; -import com.lhh.apst.library.AdvancedPagerSlidingTabStrip; - -import lib.lhh.fiv.library.FrescoImageView; - -/** - * Created by Linhh on 16/2/16. - */ -public class ViewTabActivity extends ActionBarActivity implements ViewPager.OnPageChangeListener{ - - public AdvancedPagerSlidingTabStrip mAPSTS; - public APSTSViewPager mVP; - - private static final int VIEW_FIRST = 0; - private static final int VIEW_SECOND = 1; - private static final int VIEW_THIRD = 2; - private static final int VIEW_FOURTH = 3; - - private static final int VIEW_SIZE = 4; - - private FirstFragment mFirstFragment = null; - private SecondFragment mSecondFragment = null; - private ThirdFragment mThirdFragment = null; - private FourthFragment mFourthFragment = null; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_icon_tab); - findViews(); - init(); - } - - private void findViews(){ - mAPSTS = (AdvancedPagerSlidingTabStrip)findViewById(R.id.tabs); - mVP = (APSTSViewPager)findViewById(R.id.vp_main); - } - - private void init(){ - mVP.setOffscreenPageLimit(VIEW_SIZE); - FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager()); - - mVP.setAdapter(new FragmentAdapter(getSupportFragmentManager())); - - adapter.notifyDataSetChanged(); - mAPSTS.setViewPager(mVP); - mAPSTS.setOnPageChangeListener(this); - mVP.setCurrentItem(VIEW_FIRST); - mAPSTS.showDot(VIEW_FIRST,"99+"); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - - } - - @Override - public void onPageScrollStateChanged(int state) { - - } - - public class FragmentAdapter extends FragmentStatePagerAdapter implements AdvancedPagerSlidingTabStrip.ViewTabProvider{ - - public FragmentAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public Fragment getItem(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - if(null == mFirstFragment) - mFirstFragment = FirstFragment.instance(); - return mFirstFragment; - - case VIEW_SECOND: - if(null == mSecondFragment) - mSecondFragment = SecondFragment.instance(); - return mSecondFragment; - - case VIEW_THIRD: - if(null == mThirdFragment) - mThirdFragment = ThirdFragment.instance(); - return mThirdFragment; - - case VIEW_FOURTH: - if(null == mFourthFragment) - mFourthFragment = FourthFragment.instance(); - return mFourthFragment; - default: - break; - } - } - return null; - } - - @Override - public int getCount() { - return VIEW_SIZE; - } - - @Override - public View onSelectIconView(int position, View view, ViewGroup parent) { - FrescoImageView draweeView; - if(view == null){ - draweeView = new FrescoImageView(ViewTabActivity.this); - draweeView.setLayoutParams(new RelativeLayout.LayoutParams(50,50)); - view = draweeView; - } - draweeView = (FrescoImageView)view; - switch (position){ - case VIEW_FIRST: - draweeView.loadView("https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/categry_icon_p.png",R.mipmap.home_categry_icon_f_n); - break; - case VIEW_SECOND: - draweeView.loadView("https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/classify_icon_p.png",R.mipmap.home_auther_icon_f_p); - break; - case VIEW_THIRD: - draweeView.loadView("https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/mine_icon_p.png",R.mipmap.home_live_icon_f_n); - break; - case VIEW_FOURTH: - draweeView.loadView("https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/update_dynamic_p.png",R.mipmap.home_main_icon_f_n); - break; - default: - break; - } - return draweeView; - } - - @Override - public View onIconView(int position, View view, ViewGroup parent) { - FrescoImageView draweeView; - if(view == null){ - draweeView = new FrescoImageView(ViewTabActivity.this); - draweeView.setLayoutParams(new RelativeLayout.LayoutParams(50,50)); - view = draweeView; - } - draweeView = (FrescoImageView)view; - switch (position){ - case VIEW_FIRST: - draweeView.loadView("https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/categry_icon_n.png",R.mipmap.home_categry_icon_n); - break; - case VIEW_SECOND: - draweeView.loadView("https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/classify_icon_n.png",R.mipmap.home_auther_icon_f_n); - break; - case VIEW_THIRD: - draweeView.loadView("https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/mine_icon_n.png",R.mipmap.home_live_icon_n); - break; - case VIEW_FOURTH: - draweeView.loadView("https://raw.githubusercontent.com/HomHomLin/AdvancedPagerSlidingTabStrip/master/Pic/update_dynamic_n.png",R.mipmap.home_main_icon_n); - break; - default: - break; - } - return draweeView; - } - - @Override - public CharSequence getPageTitle(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return "first"; - case VIEW_SECOND: - return "second"; - case VIEW_THIRD: - return "third"; - case VIEW_FOURTH: - return "fourth"; - default: - break; - } - } - return null; - } - - } -} - diff --git a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/WeiboTabActivity.java b/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/WeiboTabActivity.java deleted file mode 100644 index aedf6ac..0000000 --- a/app/src/main/java/com/lhh/apst/advancedpagerslidingtabstrip/WeiboTabActivity.java +++ /dev/null @@ -1,303 +0,0 @@ -package com.lhh.apst.advancedpagerslidingtabstrip; - -import android.graphics.Rect; -import android.graphics.drawable.Drawable; -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; -import android.support.v4.app.FragmentStatePagerAdapter; -import android.support.v4.view.ViewPager; -import android.support.v7.app.ActionBarActivity; -import android.view.View; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.Toast; - -import com.lhh.apst.fragments.FirstFragment; -import com.lhh.apst.fragments.FourthFragment; -import com.lhh.apst.fragments.SecondFragment; -import com.lhh.apst.fragments.ThirdFragment; -import com.lhh.apst.library.AdvancedPagerSlidingTabStrip; -import com.lhh.apst.library.Margins; - -/** - * Created by Linhh on 16/3/8. - */ -public class WeiboTabActivity extends ActionBarActivity implements ViewPager.OnPageChangeListener{ - - public AdvancedPagerSlidingTabStrip mAPSTS; - public APSTSViewPager mVP; - - private static final int VIEW_FIRST = 0; - private static final int VIEW_SECOND = 1; - private static final int VIEW_THIRD = 2; - private static final int VIEW_FOURTH = 3; - - private static final int VIEW_SIZE = 4; - - private FirstFragment mFirstFragment = null; - private SecondFragment mSecondFragment = null; - private ThirdFragment mThirdFragment = null; - private FourthFragment mFourthFragment = null; - private ImageView mIvCenterBtn = null; - - private int mSize = 0; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_weibo_tab); - findViews(); - init(); - } - - private void findViews(){ - mAPSTS = (AdvancedPagerSlidingTabStrip)findViewById(R.id.tabs); - mVP = (APSTSViewPager)findViewById(R.id.vp_main); - mIvCenterBtn = (ImageView)findViewById(R.id.ivCenterBtn); - } - - private void init(){ - mIvCenterBtn.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText(WeiboTabActivity.this, "Center Btn is Clicked.",Toast.LENGTH_SHORT).show(); - } - }); - mSize = getResources().getDimensionPixelSize(R.dimen.weibo_tab_size); - mVP.setOffscreenPageLimit(VIEW_SIZE); - FragmentAdapter adapter = new FragmentAdapter(getSupportFragmentManager()); - - mVP.setAdapter(new FragmentAdapter(getSupportFragmentManager())); - - adapter.notifyDataSetChanged(); - mAPSTS.setViewPager(mVP); - mAPSTS.setOnPageChangeListener(this); - mVP.setCurrentItem(VIEW_FIRST); - mAPSTS.showDot(VIEW_FIRST,"99+"); - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - - } - - @Override - public void onPageSelected(int position) { - - } - - @Override - public void onPageScrollStateChanged(int state) { - - } - - public class FragmentAdapter extends FragmentStatePagerAdapter implements - AdvancedPagerSlidingTabStrip.IconTabProvider, - AdvancedPagerSlidingTabStrip.LayoutProvider, - AdvancedPagerSlidingTabStrip.TipsProvider{ - - public FragmentAdapter(FragmentManager fm) { - super(fm); - } - - @Override - public Fragment getItem(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - if(null == mFirstFragment) - mFirstFragment = FirstFragment.instance(); - return mFirstFragment; - - case VIEW_SECOND: - if(null == mSecondFragment) - mSecondFragment = SecondFragment.instance(); - return mSecondFragment; - - case VIEW_THIRD: - if(null == mThirdFragment) - mThirdFragment = ThirdFragment.instance(); - return mThirdFragment; - - case VIEW_FOURTH: - if(null == mFourthFragment) - mFourthFragment = FourthFragment.instance(); - return mFourthFragment; - default: - break; - } - } - return null; - } - - @Override - public int getCount() { - return VIEW_SIZE; - } - - @Override - public CharSequence getPageTitle(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return "first"; - case VIEW_SECOND: - return "second"; - case VIEW_THIRD: - return "third"; - case VIEW_FOURTH: - return "fourth"; - default: - break; - } - } - return null; - } - - @Override - public float getPageWeight(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return 0.92f; - case VIEW_SECOND: - return 1.0f; - case VIEW_THIRD: - return 1.0f; - case VIEW_FOURTH: - return 0.92f; - default: - break; - } - } - return 1.0f; - } - - @Override - public int[] getPageRule(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return new int[]{ - RelativeLayout.ALIGN_PARENT_LEFT}; - case VIEW_SECOND: - return new int[]{ - RelativeLayout.ALIGN_PARENT_LEFT}; - case VIEW_THIRD: - return new int[]{ - RelativeLayout.ALIGN_PARENT_RIGHT}; - case VIEW_FOURTH: - return new int[]{ - RelativeLayout.ALIGN_PARENT_RIGHT}; - default: - break; - } - } - return new int[0]; - } - - @Override - public Margins getPageMargins(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return new Margins(getResources().getDimensionPixelSize(R.dimen.home_bar_icon_margins),0,0,0); - case VIEW_SECOND: - return null; - case VIEW_THIRD: - return null; - case VIEW_FOURTH: - return new Margins(0,0,getResources().getDimensionPixelSize(R.dimen.home_bar_icon_margins),0); - default: - break; - } - } - return null; - } - - @Override - public Integer getPageIcon(int index) { - if(index >= 0 && index < VIEW_SIZE){ - switch (index){ - case VIEW_FIRST: - return R.mipmap.tabbar_home; - case VIEW_SECOND: - return R.mipmap.tabbar_message_center; - case VIEW_THIRD: - return R.mipmap.tabbar_discover; - case VIEW_FOURTH: - return R.mipmap.tabbar_profile; - default: - break; - } - } - return 0; - } - - @Override - public Integer getPageSelectIcon(int index) { - if(index >= 0 && index < VIEW_SIZE){ - switch (index){ - case VIEW_FIRST: - return R.mipmap.tabbar_home_selected; - case VIEW_SECOND: - return R.mipmap.tabbar_message_center_highlighted; - case VIEW_THIRD: - return R.mipmap.tabbar_discover_highlighted; - case VIEW_FOURTH: - return R.mipmap.tabbar_profile_highlighted; - default: - break; - } - } - return 0; - } - - @Override - public Rect getPageIconBounds(int position) { - return new Rect(0, 0, mSize, mSize); - } - - @Override - public int[] getTipsRule(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return new int[]{ - RelativeLayout.ALIGN_PARENT_LEFT}; - case VIEW_SECOND: - return new int[]{ - RelativeLayout.ALIGN_PARENT_LEFT}; - case VIEW_THIRD: - return new int[]{ - RelativeLayout.ALIGN_PARENT_RIGHT}; - case VIEW_FOURTH: - return new int[]{ - RelativeLayout.ALIGN_PARENT_RIGHT}; - default: - break; - } - } - return new int[0]; - } - - @Override - public Margins getTipsMargins(int position) { - if(position >= 0 && position < VIEW_SIZE){ - switch (position){ - case VIEW_FIRST: - return new Margins(4 *getResources().getDimensionPixelSize(R.dimen.psts_dot_m_right), 0, 0, 0); - default: - break; - } - } - return null; - } - - @Override - public Drawable getTipsDrawable(int position) { - return null; - } - } -} diff --git a/app/src/main/java/com/lhh/apst/fragments/FirstFragment.java b/app/src/main/java/com/lhh/apst/fragments/FirstFragment.java deleted file mode 100644 index 148121c..0000000 --- a/app/src/main/java/com/lhh/apst/fragments/FirstFragment.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.lhh.apst.fragments; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.lhh.apst.advancedpagerslidingtabstrip.R; - -/** - * Created by linhonghong on 2015/8/11. - */ -public class FirstFragment extends Fragment{ - - public static FirstFragment instance() { - FirstFragment view = new FirstFragment(); - return view; - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.first_fragment, null); - return view; - } -} diff --git a/app/src/main/java/com/lhh/apst/fragments/FourthFragment.java b/app/src/main/java/com/lhh/apst/fragments/FourthFragment.java deleted file mode 100644 index ae0c312..0000000 --- a/app/src/main/java/com/lhh/apst/fragments/FourthFragment.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.lhh.apst.fragments; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.lhh.apst.advancedpagerslidingtabstrip.R; - -/** - * Created by linhonghong on 2015/8/11. - */ -public class FourthFragment extends Fragment { - - public static FourthFragment instance() { - FourthFragment view = new FourthFragment(); - return view; - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.fourth_fragment, null); - return view; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lhh/apst/fragments/SecondFragment.java b/app/src/main/java/com/lhh/apst/fragments/SecondFragment.java deleted file mode 100644 index bdc3d88..0000000 --- a/app/src/main/java/com/lhh/apst/fragments/SecondFragment.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.lhh.apst.fragments; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.lhh.apst.advancedpagerslidingtabstrip.R; - -/** - * Created by linhonghong on 2015/8/11. - */ -public class SecondFragment extends Fragment { - - public static SecondFragment instance() { - SecondFragment view = new SecondFragment(); - return view; - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.second_fragment, null); - return view; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/lhh/apst/fragments/ThirdFragment.java b/app/src/main/java/com/lhh/apst/fragments/ThirdFragment.java deleted file mode 100644 index ac02ae7..0000000 --- a/app/src/main/java/com/lhh/apst/fragments/ThirdFragment.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.lhh.apst.fragments; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import com.lhh.apst.advancedpagerslidingtabstrip.R; - -/** - * Created by linhonghong on 2015/8/11. - */ -public class ThirdFragment extends Fragment { - - public static ThirdFragment instance() { - ThirdFragment view = new ThirdFragment(); - return view; - } - - @Nullable - @Override - public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.third_fragment, null); - return view; - } -} \ No newline at end of file diff --git a/app/src/main/res/drawable/sub_background.xml b/app/src/main/res/drawable/sub_background.xml deleted file mode 100644 index 0b70e57..0000000 --- a/app/src/main/res/drawable/sub_background.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_bg_normal.xml b/app/src/main/res/drawable/tab_bg_normal.xml deleted file mode 100644 index 006280b..0000000 --- a/app/src/main/res/drawable/tab_bg_normal.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_bg_transparent.xml b/app/src/main/res/drawable/tab_bg_transparent.xml deleted file mode 100644 index 42ee901..0000000 --- a/app/src/main/res/drawable/tab_bg_transparent.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_bg_white.xml b/app/src/main/res/drawable/tab_bg_white.xml deleted file mode 100644 index f192df8..0000000 --- a/app/src/main/res/drawable/tab_bg_white.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/tab_color_select.xml b/app/src/main/res/drawable/tab_color_select.xml deleted file mode 100644 index cf354de..0000000 --- a/app/src/main/res/drawable/tab_color_select.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/weibo_tab_bg_normal.xml b/app/src/main/res/drawable/weibo_tab_bg_normal.xml deleted file mode 100644 index 339a5e9..0000000 --- a/app/src/main/res/drawable/weibo_tab_bg_normal.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_custom_tab.xml b/app/src/main/res/layout/activity_custom_tab.xml deleted file mode 100644 index 469dd98..0000000 --- a/app/src/main/res/layout/activity_custom_tab.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_icon_tab.xml b/app/src/main/res/layout/activity_icon_tab.xml deleted file mode 100644 index 13c4a9c..0000000 --- a/app/src/main/res/layout/activity_icon_tab.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml deleted file mode 100644 index ed85311..0000000 --- a/app/src/main/res/layout/activity_main.xml +++ /dev/null @@ -1,37 +0,0 @@ - -