├── .gitignore ├── GIF ├── 1.gif ├── 2.gif ├── 3.gif ├── 4.gif ├── 5.gif ├── 6.gif ├── 7.gif ├── 8.gif └── 9.gif ├── LICENSE ├── README.md ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libs ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── com │ │ └── ybao │ │ └── pullrefreshview │ │ ├── extras │ │ ├── PullableImageView.java │ │ └── PullableTextView.java │ │ ├── layout │ │ ├── BaseFooterView.java │ │ ├── BaseHeaderView.java │ │ ├── FlingLayout.java │ │ ├── PullRefreshLayout.java │ │ └── SliderBox.java │ │ └── support │ │ ├── anim │ │ ├── AnimGetter.java │ │ ├── AnimListener.java │ │ ├── IAnimGetter.java │ │ └── interpolator │ │ │ └── DecelerateAccelerateInterpolator.java │ │ ├── impl │ │ ├── HPullable.java │ │ ├── Loadable.java │ │ ├── OnEndListener.java │ │ ├── OnScrollListener.java │ │ ├── Pullable.java │ │ ├── Refreshable.java │ │ └── VPullable.java │ │ ├── overscroll │ │ └── OverScrollController.java │ │ ├── resolver │ │ ├── EventResolver.java │ │ ├── FlingXResolver.java │ │ ├── FlingYResolver.java │ │ └── IEventResolver.java │ │ ├── type │ │ └── LayoutType.java │ │ ├── utils │ │ ├── HCanPullUtil.java │ │ ├── Utils.java │ │ ├── VCanPullUtil.java │ │ └── ViewScrollUtil.java │ │ └── view │ │ └── ObservableScrollView.java │ └── res │ └── values │ ├── attrs.xml │ └── strings.xml ├── settings.gradle ├── simple ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-web.png │ ├── java │ └── com │ │ └── ybao │ │ └── pullrefreshview │ │ └── simple │ │ ├── activities │ │ ├── AllViewActivity.java │ │ ├── ExpandActivity.java │ │ ├── FlingActivity.java │ │ ├── MainActivity.java │ │ ├── NestedScrollingActivity.java │ │ ├── NormalRefreshActivity.java │ │ ├── OtherActivity.java │ │ ├── ep │ │ │ ├── DrawerEpActivity.java │ │ │ ├── NormolEpActivity.java │ │ │ ├── RG2Activity.java │ │ │ ├── RGActivity.java │ │ │ └── ScrollerEpActivity.java │ │ ├── ex │ │ │ ├── RecyclerViewActivity.java │ │ │ ├── ScrollViewActivity.java │ │ │ └── TextViewActivity.java │ │ └── other │ │ │ ├── HeaderActivity.java │ │ │ └── MIFlingActivity.java │ │ ├── fragment │ │ ├── Fragment0.java │ │ ├── Fragment1.java │ │ ├── Fragment2.java │ │ ├── Fragment3.java │ │ └── Fragment4.java │ │ ├── utils │ │ └── AnimUtil.java │ │ └── view │ │ ├── EndFooterView.java │ │ ├── ExpandFooterView.java │ │ ├── ExpandHeaderView.java │ │ ├── LockFooterView.java │ │ ├── LockHeaderView.java │ │ ├── MiFliingLayout.java │ │ ├── NormalFooterView.java │ │ └── NormalHeaderView.java │ └── res │ ├── anim │ ├── scale_in.xml │ └── scale_out.xml │ ├── drawable │ ├── bottom_shadow.xml │ ├── progress_large_black.xml │ ├── progress_large_white.xml │ └── top_shadow.xml │ ├── layout │ ├── activity_all_view.xml │ ├── activity_drawer_ep.xml │ ├── activity_expand.xml │ ├── activity_fling.xml │ ├── activity_header.xml │ ├── activity_main.xml │ ├── activity_mifling.xml │ ├── activity_nestedscrolling.xml │ ├── activity_normal_refresh.xml │ ├── activity_normol_ep.xml │ ├── activity_other.xml │ ├── activity_recyclerview.xml │ ├── activity_rg.xml │ ├── activity_rg2.xml │ ├── activity_scroller_ep.xml │ ├── activity_scrollview.xml │ ├── activity_textview.xml │ ├── fragment0.xml │ ├── fragment1.xml │ ├── fragment2.xml │ ├── fragment3.xml │ ├── fragment4.xml │ ├── item.xml │ ├── view_footer_end.xml │ ├── view_footer_expand.xml │ ├── view_footer_lock.xml │ ├── view_footer_normal.xml │ ├── view_header_expand.xml │ ├── view_header_lock.xml │ └── view_header_normal.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── ic_pull_down.png │ ├── ic_pull_up.png │ ├── id_load.png │ ├── id_load_b.png │ ├── id_load_clone.png │ ├── id_load_clone_b.png │ └── img_header.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ ├── values-w820dp │ └── dimens.xml │ └── values │ ├── colors.xml │ ├── dimens.xml │ ├── strings.xml │ └── styles.xml └── standardadapter ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src └── main ├── AndroidManifest.xml ├── java └── com │ └── ybao │ └── adapter │ ├── StandardAdapter.java │ └── recyclerview │ ├── HeaderStandardAdapter.java │ └── StandardAdapter.java └── res └── values └── strings.xml /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | 5 | # Files for the Dalvik VM 6 | *.dex 7 | 8 | # Java class files 9 | *.class 10 | 11 | # Generated files 12 | bin/ 13 | gen/ 14 | 15 | # Gradle files 16 | .gradle/ 17 | build/ 18 | /*/build/ 19 | 20 | # Local configuration file (sdk path, etc) 21 | local.properties 22 | 23 | # Proguard folder generated by Eclipse 24 | proguard/ 25 | 26 | # Log Files 27 | *.log 28 | 29 | #.idea 30 | .idea/ 31 | *.iml 32 | -------------------------------------------------------------------------------- /GIF/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/1.gif -------------------------------------------------------------------------------- /GIF/2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/2.gif -------------------------------------------------------------------------------- /GIF/3.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/3.gif -------------------------------------------------------------------------------- /GIF/4.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/4.gif -------------------------------------------------------------------------------- /GIF/5.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/5.gif -------------------------------------------------------------------------------- /GIF/6.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/6.gif -------------------------------------------------------------------------------- /GIF/7.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/7.gif -------------------------------------------------------------------------------- /GIF/8.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/8.gif -------------------------------------------------------------------------------- /GIF/9.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/GIF/9.gif -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | mavenCentral() 6 | jcenter() 7 | } 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:2.3.1' 10 | 11 | // NOTE: Do not place your application dependencies here; they belong 12 | // in the individual module build.gradle files 13 | } 14 | } 15 | 16 | allprojects { 17 | repositories { 18 | mavenCentral() 19 | jcenter() 20 | } 21 | } 22 | 23 | task clean(type: Delete) { 24 | delete rootProject.buildDir 25 | } 26 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | ANDROID_BUILD_MIN_SDK_VERSION=9 2 | ANDROID_BUILD_TARGET_SDK_VERSION=22 3 | ANDROID_BUILD_SDK_VERSION=23 4 | ANDROID_BUILD_TOOLS_VERSION=25.0.0 5 | 6 | VERSION_NAME=2.1 7 | VERSION_CODE=3 -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Sun May 14 06:00:48 CST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /libs/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /libs/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion ANDROID_BUILD_SDK_VERSION as int 5 | buildToolsVersion ANDROID_BUILD_TOOLS_VERSION 6 | 7 | defaultConfig { 8 | minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION as int 9 | targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION as int 10 | versionCode VERSION_CODE as int 11 | versionName VERSION_NAME 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | productFlavors { 20 | } 21 | } 22 | 23 | dependencies { 24 | compile project(':standardadapter') 25 | compile 'com.android.support:recyclerview-v7:23.2.1' 26 | compile 'com.android.support:support-v4:23.2.1' 27 | compile 'com.nineoldandroids:library:2.4.0' 28 | } 29 | -------------------------------------------------------------------------------- /libs/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\CodeTools\SDK\AndroidWindows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /libs/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/extras/PullableImageView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.extras; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.View; 6 | import android.widget.ImageView; 7 | 8 | import com.ybao.pullrefreshview.support.impl.VPullable; 9 | 10 | 11 | public class PullableImageView extends ImageView implements VPullable { 12 | 13 | public PullableImageView(Context context) { 14 | super(context); 15 | } 16 | 17 | public PullableImageView(Context context, AttributeSet attrs) { 18 | super(context, attrs); 19 | } 20 | 21 | public PullableImageView(Context context, AttributeSet attrs, int defStyle) { 22 | super(context, attrs, defStyle); 23 | 24 | } 25 | 26 | @Override 27 | public boolean canOverStart() { 28 | return true; 29 | } 30 | 31 | @Override 32 | public boolean canOverEnd() { 33 | return true; 34 | } 35 | 36 | @Override 37 | public View getView() { 38 | return this; 39 | } 40 | 41 | @Override 42 | public void scrollAViewBy(int dp) { 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/extras/PullableTextView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.extras; 2 | 3 | 4 | import android.content.Context; 5 | import android.text.method.ScrollingMovementMethod; 6 | import android.util.AttributeSet; 7 | import android.view.View; 8 | import android.widget.TextView; 9 | 10 | import com.ybao.pullrefreshview.support.impl.OnScrollListener; 11 | import com.ybao.pullrefreshview.support.impl.VPullable; 12 | 13 | public class PullableTextView extends TextView implements VPullable { 14 | private OnScrollListener onScrollListener = null; 15 | 16 | public PullableTextView(Context context) { 17 | super(context); 18 | setMovementMethod(ScrollingMovementMethod.getInstance()); 19 | } 20 | 21 | public PullableTextView(Context context, AttributeSet attrs) { 22 | super(context, attrs); 23 | setMovementMethod(ScrollingMovementMethod.getInstance()); 24 | } 25 | 26 | public PullableTextView(Context context, AttributeSet attrs, int defStyle) { 27 | super(context, attrs, defStyle); 28 | setMovementMethod(ScrollingMovementMethod.getInstance()); 29 | } 30 | 31 | @Override 32 | public boolean canOverStart() { 33 | if (getScrollY() == 0) 34 | return true; 35 | else 36 | return false; 37 | } 38 | 39 | @Override 40 | public boolean canOverEnd() { 41 | if (getScrollY() >= (getLayout().getHeight() - getMeasuredHeight() + getCompoundPaddingBottom() + getCompoundPaddingTop())) 42 | return true; 43 | else 44 | return false; 45 | } 46 | 47 | public void setOnScrollListener(OnScrollListener onScrollListener) { 48 | this.onScrollListener = onScrollListener; 49 | } 50 | 51 | @Override 52 | protected void onScrollChanged(int x, int y, int oldx, int oldy) { 53 | super.onScrollChanged(x, y, oldx, oldy); 54 | if (onScrollListener != null) { 55 | onScrollListener.onScrollChanged(this, x, y, oldx, oldy); 56 | } 57 | } 58 | 59 | @Override 60 | public View getView() { 61 | return this; 62 | } 63 | 64 | @Override 65 | public void scrollAViewBy(int dp) { 66 | int maxScrollY = (getLayout().getHeight() - getMeasuredHeight() + getCompoundPaddingBottom() + getCompoundPaddingTop()); 67 | if (getScrollY() + dp >= maxScrollY) { 68 | scrollTo(0, maxScrollY); 69 | } else { 70 | scrollBy(0, dp); 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/layout/SliderBox.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.layout; 2 | 3 | import android.annotation.TargetApi; 4 | import android.content.Context; 5 | import android.os.Build; 6 | import android.support.v4.view.NestedScrollingChild; 7 | import android.support.v4.view.NestedScrollingChildHelper; 8 | import android.support.v4.view.NestedScrollingParent; 9 | import android.support.v4.view.NestedScrollingParentHelper; 10 | import android.support.v4.view.ViewCompat; 11 | import android.util.AttributeSet; 12 | import android.view.View; 13 | import android.view.ViewGroup; 14 | import android.widget.FrameLayout; 15 | 16 | import com.ybao.pullrefreshview.support.impl.VPullable; 17 | import com.ybao.pullrefreshview.support.utils.VCanPullUtil; 18 | 19 | /** 20 | * 其他附带控件的父控件 21 | * 处理事件传递 22 | * Created by Ybao on 17/1/16. 23 | */ 24 | 25 | public class SliderBox extends FrameLayout implements VPullable, NestedScrollingChild, NestedScrollingParent { 26 | private VPullable mPullable; 27 | private NestedScrollingParentHelper mParentHelper; 28 | private NestedScrollingChildHelper mChildHelper; 29 | 30 | public SliderBox(Context context) { 31 | super(context); 32 | init(); 33 | } 34 | 35 | public SliderBox(Context context, AttributeSet attrs) { 36 | super(context, attrs); 37 | init(); 38 | } 39 | 40 | public SliderBox(Context context, AttributeSet attrs, int defStyleAttr) { 41 | super(context, attrs, defStyleAttr); 42 | init(); 43 | } 44 | 45 | @TargetApi(Build.VERSION_CODES.LOLLIPOP) 46 | public SliderBox(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 47 | super(context, attrs, defStyleAttr, defStyleRes); 48 | init(); 49 | } 50 | 51 | private void init() { 52 | mParentHelper = new NestedScrollingParentHelper(this); 53 | mChildHelper = new NestedScrollingChildHelper(this); 54 | } 55 | 56 | @Override 57 | public void addView(View child, int index, ViewGroup.LayoutParams params) { 58 | VPullable pullable; 59 | if (mPullable == null && (pullable = VCanPullUtil.getPullAble(child)) != null) { 60 | mPullable = pullable; 61 | } 62 | super.addView(child, index, params); 63 | } 64 | 65 | @Override 66 | public boolean canOverEnd() { 67 | if (mPullable != null) { 68 | return mPullable.canOverEnd(); 69 | } 70 | return false; 71 | } 72 | 73 | @Override 74 | public boolean canOverStart() { 75 | if (mPullable != null) { 76 | return mPullable.canOverStart(); 77 | } 78 | return false; 79 | } 80 | 81 | @Override 82 | public View getView() { 83 | return this; 84 | } 85 | 86 | @Override 87 | public void scrollAViewBy(int dp) { 88 | if (mPullable != null) { 89 | mPullable.scrollAViewBy(dp); 90 | } 91 | } 92 | 93 | /*****************************************************************************************/ 94 | 95 | @Override 96 | public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { 97 | if (!isNestedScrollingEnabled()) { 98 | setNestedScrollingEnabled(true); 99 | } 100 | return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; 101 | } 102 | 103 | @Override 104 | public void onNestedScrollAccepted(View child, View target, int nestedScrollAxes) { 105 | mParentHelper.onNestedScrollAccepted(child, target, nestedScrollAxes); 106 | startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL); 107 | } 108 | 109 | @Override 110 | public void onStopNestedScroll(View target) { 111 | stopNestedScroll(); 112 | } 113 | 114 | @Override 115 | public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { 116 | dispatchNestedScroll(0, dyConsumed, 0, dyUnconsumed, null); 117 | } 118 | 119 | @Override 120 | public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { 121 | dispatchNestedPreScroll(0, dy, consumed, null); 122 | } 123 | 124 | @Override 125 | public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) { 126 | return dispatchNestedFling(velocityX, velocityY, consumed); 127 | } 128 | 129 | @Override 130 | public boolean onNestedPreFling(View target, float velocityX, float velocityY) { 131 | return dispatchNestedPreFling(velocityX, velocityY); 132 | } 133 | 134 | @Override 135 | public int getNestedScrollAxes() { 136 | return mParentHelper.getNestedScrollAxes(); 137 | } 138 | 139 | 140 | @Override 141 | public void setNestedScrollingEnabled(boolean enabled) { 142 | mChildHelper.setNestedScrollingEnabled(enabled); 143 | } 144 | 145 | @Override 146 | public boolean isNestedScrollingEnabled() { 147 | return mChildHelper.isNestedScrollingEnabled(); 148 | } 149 | 150 | @Override 151 | public boolean startNestedScroll(int axes) { 152 | return mChildHelper.startNestedScroll(axes); 153 | } 154 | 155 | @Override 156 | public void stopNestedScroll() { 157 | mChildHelper.stopNestedScroll(); 158 | } 159 | 160 | @Override 161 | public boolean dispatchNestedScroll(int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int[] offsetInWindow) { 162 | return mChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); 163 | } 164 | 165 | @Override 166 | public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) { 167 | return mChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); 168 | } 169 | 170 | @Override 171 | public boolean dispatchNestedFling(float velocityX, float velocityY, boolean consumed) { 172 | return mChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); 173 | } 174 | 175 | @Override 176 | public boolean dispatchNestedPreFling(float velocityX, float velocityY) { 177 | return mChildHelper.dispatchNestedPreFling(velocityX, velocityY); 178 | } 179 | 180 | @Override 181 | public void onDetachedFromWindow() { 182 | super.onDetachedFromWindow(); 183 | mChildHelper.onDetachedFromWindow(); 184 | } 185 | } 186 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/anim/AnimGetter.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.anim; 2 | 3 | import android.view.animation.AccelerateDecelerateInterpolator; 4 | import android.view.animation.Interpolator; 5 | 6 | import com.nineoldandroids.animation.Animator; 7 | import com.nineoldandroids.animation.AnimatorListenerAdapter; 8 | import com.nineoldandroids.animation.ValueAnimator; 9 | 10 | /** 11 | * Created by ybao on 2017/5/14. 12 | */ 13 | 14 | public class AnimGetter implements IAnimGetter { 15 | 16 | @Override 17 | public Animator createMoveToAnim(int startDelay, int duration, Interpolator interpolator, final AnimListener animListener, float... p) { 18 | ValueAnimator animator = ValueAnimator.ofFloat(p); 19 | animator.setStartDelay(startDelay); 20 | animator.setInterpolator(interpolator); 21 | animator.setDuration(duration); 22 | animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 23 | @Override 24 | public void onAnimationUpdate(ValueAnimator animation) { 25 | animListener.onUpdate((float) animation.getAnimatedValue()); 26 | } 27 | }); 28 | animator.addListener(new AnimatorListenerAdapter() { 29 | @Override 30 | public void onAnimationEnd(Animator animation) { 31 | super.onAnimationEnd(animation); 32 | animListener.onAnimEnd(); 33 | } 34 | 35 | @Override 36 | public void onAnimationCancel(Animator animation) { 37 | super.onAnimationCancel(animation); 38 | animListener.onAnimCencel(); 39 | } 40 | }); 41 | return animator; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/anim/AnimListener.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.anim; 2 | 3 | /** 4 | * Created by ybao on 2017/5/14. 5 | */ 6 | 7 | public interface AnimListener { 8 | void onUpdate(float value); 9 | 10 | void onAnimEnd(); 11 | 12 | void onAnimCencel(); 13 | } 14 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/anim/IAnimGetter.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.anim; 2 | 3 | import android.view.animation.Interpolator; 4 | 5 | import com.nineoldandroids.animation.Animator; 6 | 7 | /** 8 | * Created by ybao on 2017/5/14. 9 | */ 10 | 11 | public interface IAnimGetter { 12 | Animator createMoveToAnim(int offstart, int duration, Interpolator interpolator, AnimListener animListener, float... p); 13 | } 14 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/anim/interpolator/DecelerateAccelerateInterpolator.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.anim.interpolator; 2 | 3 | import android.view.animation.Interpolator; 4 | 5 | /** 6 | * Created by ybao on 2017/5/14. 7 | */ 8 | 9 | public class DecelerateAccelerateInterpolator implements Interpolator { 10 | 11 | @Override 12 | public float getInterpolation(float input) { 13 | float result; 14 | if (input <= 0.5) { 15 | result = (float) (Math.sin(Math.PI * input)) / 2; 16 | } else { 17 | result = (float) (2 - Math.sin(Math.PI * input)) / 2; 18 | } 19 | return result; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/impl/HPullable.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2015 Pengyuan-Jiang 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | *

8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | *

10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | *

16 | * Author:Ybao on 2015/11/3 ‏‎0:51 17 | *

18 | * QQ: 392579823 19 | *

20 | * Email:392579823@qq.com 21 | */ 22 | package com.ybao.pullrefreshview.support.impl; 23 | 24 | public interface HPullable extends Pullable { 25 | } 26 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/impl/Loadable.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2015 Pengyuan-Jiang 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | *

8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | *

10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | *

16 | * Author:Ybao on 2015/11/3 ‏‎17:44 17 | *

18 | * QQ: 392579823 19 | *

20 | * Email:392579823@qq.com 21 | */ 22 | package com.ybao.pullrefreshview.support.impl; 23 | 24 | import com.ybao.pullrefreshview.layout.PullRefreshLayout; 25 | 26 | public interface Loadable { 27 | 28 | void setPullRefreshLayout(PullRefreshLayout refreshLayout); 29 | 30 | boolean onScroll(float y); 31 | 32 | void onScrollChange(int state); 33 | 34 | boolean onStartrRelease(float offsetTop); 35 | 36 | void startLoad(); 37 | 38 | void stopLoad(); 39 | } 40 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/impl/OnEndListener.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.impl; 2 | 3 | /** 4 | * Created by ybao on 2017/5/16. 5 | */ 6 | 7 | public interface OnEndListener { 8 | void onEnd(); 9 | } 10 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/impl/OnScrollListener.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.impl; 2 | 3 | import android.view.View; 4 | 5 | /** 6 | * Created by Ybao on 16/7/24. 7 | */ 8 | public interface OnScrollListener { 9 | void onScrollChanged(View scrollView, int x, int y, int oldx, int oldy); 10 | } 11 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/impl/Pullable.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2015 Pengyuan-Jiang 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | *

8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | *

10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | *

16 | * Author:Ybao on 2015/11/3 ‏‎0:51 17 | *

18 | * QQ: 392579823 19 | *

20 | * Email:392579823@qq.com 21 | */ 22 | package com.ybao.pullrefreshview.support.impl; 23 | 24 | import android.view.View; 25 | 26 | public interface Pullable { 27 | 28 | boolean canOverStart(); 29 | 30 | boolean canOverEnd(); 31 | 32 | View getView(); 33 | 34 | void scrollAViewBy(int dp); 35 | } 36 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/impl/Refreshable.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2015 Pengyuan-Jiang 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | *

8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | *

10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | *

16 | * Author:Ybao on 2015/11/3 ‏‎17:44 17 | *

18 | * QQ: 392579823 19 | *

20 | * Email:392579823@qq.com 21 | */ 22 | package com.ybao.pullrefreshview.support.impl; 23 | 24 | import com.ybao.pullrefreshview.layout.PullRefreshLayout; 25 | 26 | public interface Refreshable { 27 | 28 | void setPullRefreshLayout(PullRefreshLayout refreshLayout); 29 | 30 | boolean onScroll(float y); 31 | 32 | void onScrollChange(int state); 33 | 34 | boolean onStartrRelease(float offsetTop); 35 | 36 | void startRefresh(); 37 | 38 | void stopRefresh(); 39 | } 40 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/impl/VPullable.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright 2015 Pengyuan-Jiang 3 | *

4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | *

8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | *

10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | *

16 | * Author:Ybao on 2015/11/3 ‏‎0:51 17 | *

18 | * QQ: 392579823 19 | *

20 | * Email:392579823@qq.com 21 | */ 22 | package com.ybao.pullrefreshview.support.impl; 23 | 24 | public interface VPullable extends Pullable { 25 | } 26 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/overscroll/OverScrollController.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.overscroll; 2 | 3 | import android.os.Handler; 4 | import android.view.animation.DecelerateInterpolator; 5 | 6 | import com.ybao.pullrefreshview.layout.FlingLayout; 7 | import com.ybao.pullrefreshview.support.anim.interpolator.DecelerateAccelerateInterpolator; 8 | 9 | /** 10 | * Created by ybao on 2017/5/14. 11 | */ 12 | 13 | public class OverScrollController { 14 | Handler handler = new Handler(); 15 | ScrollChangedListener scrollChangedListener = new ScrollChangedListener(); 16 | protected FlingLayout.FlingLayoutContext c; 17 | 18 | public OverScrollController(FlingLayout.FlingLayoutContext flingLayoutContext) { 19 | this.c = flingLayoutContext; 20 | } 21 | 22 | public void addOverScrollListener() { 23 | removeOverScrollListener(); 24 | scrollChangedListener.reset(); 25 | handler.post(scrollChangedListener); 26 | } 27 | 28 | 29 | public void removeOverScrollListener() { 30 | handler.removeCallbacks(scrollChangedListener); 31 | } 32 | 33 | class ScrollChangedListener implements Runnable { 34 | int times = 0; 35 | 36 | public void reset() { 37 | times = 0; 38 | } 39 | 40 | @Override 41 | public void run() { 42 | times++; 43 | if (c.canOverStart()) { 44 | float oh = (float) Math.sqrt(c.getVelocity() * 3 / times); 45 | oh = Math.min(c.getMaxOverScrollDist(), oh); 46 | if (oh > c.getTouchSlop()) { 47 | float moveP = c.getMoveP(); 48 | startBounce(moveP, moveP + oh); 49 | } else { 50 | c.setScrollState(FlingLayout.SCROLL_STATE_IDLE); 51 | } 52 | return; 53 | } else if (c.canOverEnd()) { 54 | float oh = (float) -Math.sqrt(-c.getVelocity() * 3 / times); 55 | oh = -Math.min(c.getMaxOverScrollDist(), -oh); 56 | if (-oh > c.getTouchSlop()) { 57 | float moveP = c.getMoveP(); 58 | startBounce(moveP, moveP + oh); 59 | } else { 60 | c.setScrollState(FlingLayout.SCROLL_STATE_IDLE); 61 | } 62 | return; 63 | } 64 | if (times > 60) { 65 | c.setScrollState(FlingLayout.SCROLL_STATE_IDLE); 66 | } else { 67 | c.setScrollState(FlingLayout.SCROLL_STATE_FLING); 68 | handler.postDelayed(this, 16); 69 | } 70 | } 71 | } 72 | 73 | public int startBounce(float startP, float endP) { 74 | int duration = (int) Math.abs(endP - startP); 75 | int time = Math.min(c.getMaxDuration() * 2, duration); 76 | time = Math.max(c.getMinDuration(), time); 77 | c.startAnim(0, FlingLayout.SCROLL_STATE_OVER_SCROLL, time, new DecelerateAccelerateInterpolator(), null, startP, endP, startP); 78 | return time; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/resolver/IEventResolver.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.resolver; 2 | 3 | import android.support.v4.view.NestedScrollingChild; 4 | import android.support.v4.view.NestedScrollingParent; 5 | import android.view.MotionEvent; 6 | import android.view.View; 7 | 8 | import com.ybao.pullrefreshview.support.impl.Pullable; 9 | 10 | /** 11 | * Created by ybao on 2017/5/14. 12 | */ 13 | 14 | public interface IEventResolver extends NestedScrollingChild, NestedScrollingParent { 15 | 16 | Pullable getPullAble(View view); 17 | 18 | Pullable getPullAble(Pullable pullable); 19 | 20 | boolean isScrolling(); 21 | 22 | void setViewTranslationP(View view, float value); 23 | 24 | boolean dispatchTouchEvent(MotionEvent ev); 25 | 26 | boolean interceptTouchEvent(MotionEvent ev); 27 | 28 | boolean touchEvent(MotionEvent ev); 29 | 30 | float getVelocity(); 31 | 32 | void onDetachedFromWindow(); 33 | } 34 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/type/LayoutType.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.type; 2 | 3 | /** 4 | * Created by Ybao on 16/7/26. 5 | */ 6 | public class LayoutType { 7 | public final static int LAYOUT_NORMAL = 0x00; 8 | public final static int LAYOUT_DRAWER = 0x01; 9 | public final static int LAYOUT_SCROLLER = 0x10; 10 | public final static int LAYOUT_NOT_MOVE= 0x11; 11 | } 12 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/utils/HCanPullUtil.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.utils; 2 | 3 | import android.support.v4.widget.NestedScrollView; 4 | import android.support.v7.widget.LinearLayoutManager; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.ScrollView; 9 | 10 | import com.ybao.pullrefreshview.support.impl.HPullable; 11 | 12 | /** 13 | * Created by ybao on 16/3/7. 14 | */ 15 | public class HCanPullUtil { 16 | 17 | public static HPullable getPullAble(View view) { 18 | if (view == null) { 19 | return null; 20 | } 21 | view.setOverScrollMode(View.OVER_SCROLL_NEVER); 22 | if (view instanceof HPullable) { 23 | return (HPullable) view; 24 | } else if (view instanceof ScrollView || view instanceof NestedScrollView) { 25 | return new ScrollViewCanPull((ViewGroup) view); 26 | } else if (view instanceof RecyclerView) { 27 | return new RecyclerViewCanPull((RecyclerView) view); 28 | } 29 | return null; 30 | } 31 | 32 | private static class ScrollViewCanPull implements HPullable { 33 | public ScrollViewCanPull(ViewGroup scrollView) { 34 | this.scrollView = scrollView; 35 | } 36 | 37 | ViewGroup scrollView; 38 | 39 | @Override 40 | public boolean canOverStart() { 41 | if (scrollView.getScrollX() <= 0) 42 | return true; 43 | else 44 | return false; 45 | } 46 | 47 | @Override 48 | public boolean canOverEnd() { 49 | if (scrollView.getChildCount() == 0) { 50 | return true; 51 | } 52 | if (scrollView.getScrollX() >= (scrollView.getChildAt(0).getWidth() - scrollView.getMeasuredWidth())) 53 | return true; 54 | else 55 | return false; 56 | } 57 | 58 | @Override 59 | public View getView() { 60 | return scrollView; 61 | } 62 | 63 | @Override 64 | public void scrollAViewBy(int dp) { 65 | if (scrollView.getChildCount() != 0) { 66 | float maxScrollY = scrollView.getChildAt(0).getWidth() - scrollView.getMeasuredWidth(); 67 | if (scrollView.getScrollX() + dp >= maxScrollY) { 68 | scrollView.scrollTo((int) maxScrollY, 0); 69 | } else { 70 | scrollView.scrollBy(dp, 0); 71 | } 72 | } 73 | } 74 | } 75 | 76 | 77 | private static class RecyclerViewCanPull implements HPullable { 78 | public RecyclerViewCanPull(RecyclerView recyclerView) { 79 | this.recyclerView = recyclerView; 80 | } 81 | 82 | RecyclerView recyclerView; 83 | LinearLayoutManager layoutManager; 84 | 85 | private void initLayoutManager() { 86 | if (layoutManager == null) { 87 | RecyclerView.LayoutManager layout = recyclerView.getLayoutManager(); 88 | if (layout != null && layout instanceof LinearLayoutManager) { 89 | layoutManager = (LinearLayoutManager) layout; 90 | } 91 | } 92 | } 93 | 94 | @Override 95 | public boolean canOverStart() { 96 | initLayoutManager(); 97 | if (layoutManager != null) { 98 | if (layoutManager.getItemCount() == 0) { 99 | return true; 100 | } else if (layoutManager.findFirstVisibleItemPosition() == 0 && recyclerView.getChildAt(0).getLeft() >= recyclerView.getPaddingLeft()) { 101 | return true; 102 | } 103 | } 104 | return false; 105 | } 106 | 107 | 108 | @Override 109 | public boolean canOverEnd() { 110 | initLayoutManager(); 111 | if (layoutManager != null) { 112 | int count = layoutManager.getItemCount(); 113 | if (count == 0) { 114 | return true; 115 | } else if (layoutManager.findLastCompletelyVisibleItemPosition() == count - 1) { 116 | return true; 117 | } 118 | } 119 | return false; 120 | } 121 | 122 | @Override 123 | public View getView() { 124 | return recyclerView; 125 | } 126 | 127 | @Override 128 | public void scrollAViewBy(int dp) { 129 | recyclerView.scrollBy(dp, 0); 130 | } 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/utils/Utils.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.utils; 2 | 3 | import android.app.Activity; 4 | import android.content.Context; 5 | import android.util.DisplayMetrics; 6 | import android.view.Display; 7 | import android.view.WindowManager; 8 | 9 | /** 10 | * Created by Ybao on 16/7/24. 11 | */ 12 | public class Utils { 13 | public static int getScreenWidth(Context context) { 14 | WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 15 | Display mDisplay = windowManager.getDefaultDisplay(); 16 | DisplayMetrics metrics = new DisplayMetrics(); 17 | mDisplay.getMetrics(metrics); 18 | return metrics.widthPixels; 19 | } 20 | 21 | /** 22 | * 屏幕分辨率高 23 | **/ 24 | public static int getScreenHeight(Context context) { 25 | WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 26 | Display mDisplay = windowManager.getDefaultDisplay(); 27 | DisplayMetrics metrics = new DisplayMetrics(); 28 | mDisplay.getMetrics(metrics); 29 | return metrics.heightPixels; 30 | } 31 | 32 | public static int dip2px(Context context, float dipValue) { 33 | final float scale = context.getResources().getDisplayMetrics().density; 34 | return (int) (dipValue * scale + 0.5f); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/utils/ViewScrollUtil.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.utils; 2 | 3 | import android.support.v7.widget.GridLayoutManager; 4 | import android.support.v7.widget.LinearLayoutManager; 5 | import android.support.v7.widget.RecyclerView; 6 | import android.util.Log; 7 | import android.view.View; 8 | import android.widget.AbsListView; 9 | 10 | /** 11 | * Created by ybao on 16/3/9. 12 | */ 13 | public class ViewScrollUtil { 14 | public static ScrollGeter getScrollGeter(View view) { 15 | if (view == null) { 16 | return null; 17 | } 18 | if (view instanceof ScrollGeter) { 19 | return (ScrollGeter) view; 20 | } else if (view instanceof AbsListView) { 21 | return new AbsListViewScrollGeter((AbsListView) view); 22 | } else if (view instanceof RecyclerView) { 23 | return new RecyclerViewScrollGeter((RecyclerView) view); 24 | } 25 | return null; 26 | } 27 | 28 | private static class AbsListViewScrollGeter implements ScrollGeter { 29 | AbsListView absListView; 30 | 31 | public AbsListViewScrollGeter(AbsListView absListView) { 32 | this.absListView = absListView; 33 | } 34 | 35 | @Override 36 | public int getScrollX() { 37 | return 0; 38 | } 39 | 40 | @Override 41 | public int getScrollY() { 42 | int firstVisiblePosition = absListView.getFirstVisiblePosition(); 43 | View c = absListView.getChildAt(0); 44 | if (c == null) { 45 | return 0; 46 | } 47 | int top = c.getTop() - absListView.getPaddingTop(); 48 | return -top + firstVisiblePosition * c.getHeight(); 49 | } 50 | } 51 | 52 | private static class RecyclerViewScrollGeter implements ScrollGeter { 53 | RecyclerView recyclerView; 54 | LinearLayoutManager layoutManager; 55 | 56 | public RecyclerViewScrollGeter(RecyclerView recyclerView) { 57 | this.recyclerView = recyclerView; 58 | RecyclerView.LayoutManager layout = recyclerView.getLayoutManager(); 59 | if (layout != null && layout instanceof LinearLayoutManager) { 60 | layoutManager = (LinearLayoutManager) layout; 61 | } else { 62 | Log.w("RecyclerViewScrollGeter", "LayoutManager is null or Not is LinearLayoutManager"); 63 | } 64 | } 65 | 66 | @Override 67 | public int getScrollX() { 68 | return 0; 69 | } 70 | 71 | @Override 72 | public int getScrollY() { 73 | if (layoutManager != null) { 74 | int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition(); 75 | View c = layoutManager.findViewByPosition(firstVisiblePosition); 76 | if (c == null) { 77 | return 0; 78 | } 79 | int top = c.getTop() - recyclerView.getPaddingTop(); 80 | int n = firstVisiblePosition; 81 | if (layoutManager instanceof GridLayoutManager) { 82 | int spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); 83 | n = n / spanCount; 84 | } 85 | return -top + n * c.getHeight(); 86 | } 87 | return 0; 88 | } 89 | } 90 | 91 | public interface ScrollGeter { 92 | int getScrollX(); 93 | 94 | int getScrollY(); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /libs/src/main/java/com/ybao/pullrefreshview/support/view/ObservableScrollView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.support.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.widget.ScrollView; 6 | 7 | import com.ybao.pullrefreshview.support.impl.OnScrollListener; 8 | 9 | /** 10 | * 11 | * Created by Y-bao on 2016/3/21 17:48. 12 | */ 13 | public class ObservableScrollView extends ScrollView { 14 | 15 | private OnScrollListener onScrollListener = null; 16 | 17 | public ObservableScrollView(Context context) { 18 | super(context); 19 | } 20 | 21 | public ObservableScrollView(Context context, AttributeSet attrs, 22 | int defStyle) { 23 | super(context, attrs, defStyle); 24 | } 25 | 26 | public ObservableScrollView(Context context, AttributeSet attrs) { 27 | super(context, attrs); 28 | } 29 | 30 | public void setOnScrollListener(OnScrollListener onScrollListener) { 31 | this.onScrollListener = onScrollListener; 32 | } 33 | 34 | @Override 35 | protected void onScrollChanged(int x, int y, int oldx, int oldy) { 36 | super.onScrollChanged(x, y, oldx, oldy); 37 | if (onScrollListener != null) { 38 | onScrollListener.onScrollChanged(this, x, y, oldx, oldy); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /libs/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /libs/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | libs 3 | 4 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':simple', ':libs', ':standardadapter' 2 | -------------------------------------------------------------------------------- /simple/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /simple/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion ANDROID_BUILD_SDK_VERSION as int 5 | buildToolsVersion ANDROID_BUILD_TOOLS_VERSION 6 | 7 | defaultConfig { 8 | applicationId 'com.ybao.pullrefreshview.simple' 9 | minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION as int 10 | targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION as int 11 | versionCode VERSION_CODE as int 12 | versionName VERSION_NAME 13 | multiDexEnabled true 14 | } 15 | buildTypes { 16 | release { 17 | minifyEnabled false 18 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 19 | } 20 | } 21 | productFlavors { 22 | } 23 | } 24 | 25 | dependencies { 26 | compile 'com.nineoldandroids:library:2.4.0' 27 | compile project(':libs') 28 | compile 'com.android.support:support-v4:23.2.1' 29 | compile 'com.android.support:appcompat-v7:23.2.1' 30 | compile 'com.android.support:design:23.2.1' 31 | compile 'com.android.support:recyclerview-v7:23.2.1' 32 | } 33 | -------------------------------------------------------------------------------- /simple/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\CodeTools\SDK\AndroidWindows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /simple/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 26 | 30 | 33 | 36 | 39 | 42 | 45 | 48 | 51 | 54 | 57 | 60 | 63 | 66 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /simple/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pierreown/PullRefreshView/d01a63461abfb7d520f54abfab692f15b07d935f/simple/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/AllViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | 8 | import com.ybao.pullrefreshview.simple.R; 9 | import com.ybao.pullrefreshview.simple.activities.ex.RecyclerViewActivity; 10 | import com.ybao.pullrefreshview.simple.activities.ex.ScrollViewActivity; 11 | import com.ybao.pullrefreshview.simple.activities.ex.TextViewActivity; 12 | 13 | 14 | /** 15 | * Created by Ybao on 2015/11/3 0003. 16 | */ 17 | public class AllViewActivity extends AppCompatActivity { 18 | 19 | @Override 20 | protected void onCreate(Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | setContentView(R.layout.activity_all_view); 23 | findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 24 | @Override 25 | public void onClick(View v) { 26 | startActivity(new Intent(AllViewActivity.this, ScrollViewActivity.class)); 27 | } 28 | }); 29 | findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { 30 | @Override 31 | public void onClick(View v) { 32 | startActivity(new Intent(AllViewActivity.this, TextViewActivity.class)); 33 | } 34 | }); 35 | findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() { 36 | @Override 37 | public void onClick(View v) { 38 | startActivity(new Intent(AllViewActivity.this, RecyclerViewActivity.class)); 39 | } 40 | }); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ExpandActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | 8 | import com.ybao.pullrefreshview.simple.R; 9 | import com.ybao.pullrefreshview.simple.activities.ep.DrawerEpActivity; 10 | import com.ybao.pullrefreshview.simple.activities.ep.NormolEpActivity; 11 | import com.ybao.pullrefreshview.simple.activities.ep.RG2Activity; 12 | import com.ybao.pullrefreshview.simple.activities.ep.RGActivity; 13 | import com.ybao.pullrefreshview.simple.activities.ep.ScrollerEpActivity; 14 | 15 | 16 | /** 17 | * Created by Ybao on 2015/11/3 0003. 18 | */ 19 | public class ExpandActivity extends AppCompatActivity { 20 | 21 | 22 | @Override 23 | protected void onCreate(Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.activity_expand); 26 | findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 27 | @Override 28 | public void onClick(View v) { 29 | startActivity(new Intent(ExpandActivity.this, NormolEpActivity.class)); 30 | } 31 | }); 32 | findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { 33 | @Override 34 | public void onClick(View v) { 35 | startActivity(new Intent(ExpandActivity.this, DrawerEpActivity.class)); 36 | } 37 | }); 38 | findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() { 39 | @Override 40 | public void onClick(View v) { 41 | startActivity(new Intent(ExpandActivity.this, ScrollerEpActivity.class)); 42 | } 43 | }); 44 | findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() { 45 | @Override 46 | public void onClick(View v) { 47 | startActivity(new Intent(ExpandActivity.this, RGActivity.class)); 48 | } 49 | }); 50 | findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() { 51 | @Override 52 | public void onClick(View v) { 53 | startActivity(new Intent(ExpandActivity.this, RG2Activity.class)); 54 | } 55 | }); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/FlingActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.ArrayAdapter; 6 | import android.widget.ListView; 7 | 8 | import com.ybao.pullrefreshview.simple.R; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | /** 14 | * Created by Ybao on 2015/11/3 0003. 15 | */ 16 | public class FlingActivity extends AppCompatActivity { 17 | 18 | ListView listView; 19 | 20 | ArrayAdapter adapter; 21 | 22 | List list; 23 | 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | setContentView(R.layout.activity_fling); 28 | listView = (ListView) findViewById(R.id.list); 29 | list = getData(15); 30 | adapter = new ArrayAdapter(this, R.layout.item, list); 31 | 32 | listView.setAdapter(adapter); 33 | } 34 | 35 | 36 | int page = 1; 37 | 38 | private List getData(int n) { 39 | List datas = new ArrayList<>(n); 40 | for (int i = 0; i < n; i++) { 41 | datas.add("第" + page + "页,第" + i + "条"); 42 | } 43 | return datas; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v4.view.NestedScrollingParent; 6 | import android.support.v7.app.AppCompatActivity; 7 | import android.view.View; 8 | 9 | import com.ybao.pullrefreshview.simple.R; 10 | 11 | 12 | /** 13 | * Created by Ybao on 2015/11/3 0003. 14 | */ 15 | public class MainActivity extends AppCompatActivity { 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_main); 21 | findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 22 | @Override 23 | public void onClick(View v) { 24 | startActivity(new Intent(MainActivity.this, FlingActivity.class)); 25 | } 26 | }); 27 | findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { 28 | @Override 29 | public void onClick(View v) { 30 | startActivity(new Intent(MainActivity.this, NormalRefreshActivity.class)); 31 | } 32 | }); 33 | findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() { 34 | @Override 35 | public void onClick(View v) { 36 | startActivity(new Intent(MainActivity.this, ExpandActivity.class)); 37 | } 38 | }); 39 | findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() { 40 | @Override 41 | public void onClick(View v) { 42 | startActivity(new Intent(MainActivity.this, AllViewActivity.class)); 43 | } 44 | }); 45 | findViewById(R.id.button5).setOnClickListener(new View.OnClickListener() { 46 | @Override 47 | public void onClick(View v) { 48 | startActivity(new Intent(MainActivity.this, OtherActivity.class)); 49 | } 50 | }); 51 | findViewById(R.id.button6).setOnClickListener(new View.OnClickListener() { 52 | @Override 53 | public void onClick(View v) { 54 | startActivity(new Intent(MainActivity.this, NestedScrollingActivity.class)); 55 | } 56 | }); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/NestedScrollingActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.app.Fragment; 5 | import android.support.v4.app.FragmentManager; 6 | import android.support.v4.app.FragmentPagerAdapter; 7 | import android.support.v4.view.ViewPager; 8 | import android.support.v7.app.AppCompatActivity; 9 | import android.support.v7.widget.Toolbar; 10 | 11 | import com.ybao.pullrefreshview.simple.R; 12 | import com.ybao.pullrefreshview.simple.fragment.Fragment0; 13 | import com.ybao.pullrefreshview.simple.fragment.Fragment2; 14 | import com.ybao.pullrefreshview.simple.fragment.Fragment3; 15 | import com.ybao.pullrefreshview.simple.fragment.Fragment1; 16 | import com.ybao.pullrefreshview.simple.fragment.Fragment4; 17 | 18 | import java.util.ArrayList; 19 | 20 | /** 21 | * Created by Ybao on 2015/11/3 0003. 22 | */ 23 | public class NestedScrollingActivity extends AppCompatActivity { 24 | ViewPager viewPager; 25 | 26 | @Override 27 | protected void onCreate(Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | setContentView(R.layout.activity_nestedscrolling); 30 | Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 31 | setSupportActionBar(toolbar); 32 | ArrayList fragments = new ArrayList<>(); 33 | fragments.add(new Fragment0()); 34 | fragments.add(new Fragment1()); 35 | fragments.add(new Fragment2()); 36 | fragments.add(new Fragment3()); 37 | fragments.add(new Fragment4()); 38 | MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments); 39 | viewPager = (ViewPager) findViewById(R.id.viewpager); 40 | viewPager.setOffscreenPageLimit(2); 41 | viewPager.setAdapter(myFragmentPagerAdapter); 42 | } 43 | 44 | public class MyFragmentPagerAdapter extends FragmentPagerAdapter { 45 | ArrayList list; 46 | ArrayList strings; 47 | 48 | public MyFragmentPagerAdapter(FragmentManager fm, ArrayList list) { 49 | super(fm); 50 | this.list = list; 51 | strings = new ArrayList<>(); 52 | strings.add("ListView"); 53 | strings.add("RecyclerView"); 54 | strings.add("ScrollView"); 55 | strings.add("NestedScrollView"); 56 | strings.add("WebView"); 57 | } 58 | 59 | 60 | @Override 61 | public int getCount() { 62 | return list.size(); 63 | } 64 | 65 | @Override 66 | public Fragment getItem(int arg0) { 67 | return list.get(arg0); 68 | } 69 | 70 | @Override 71 | public CharSequence getPageTitle(int position) { 72 | if (position >= strings.size()) { 73 | return "第" + position + "个"; 74 | } 75 | return strings.get(position); 76 | } 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/NormalRefreshActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.support.v7.widget.Toolbar; 6 | import android.util.Log; 7 | import android.util.SparseArray; 8 | import android.view.View; 9 | import android.widget.AbsListView; 10 | import android.widget.ArrayAdapter; 11 | import android.widget.ListView; 12 | 13 | import com.ybao.pullrefreshview.layout.BaseFooterView; 14 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 15 | import com.ybao.pullrefreshview.layout.PullRefreshLayout; 16 | import com.ybao.pullrefreshview.simple.R; 17 | import com.ybao.pullrefreshview.simple.view.EndFooterView; 18 | import com.ybao.pullrefreshview.simple.view.NormalFooterView; 19 | 20 | import java.util.ArrayList; 21 | import java.util.List; 22 | 23 | /** 24 | * Created by Ybao on 2015/11/3 0003. 25 | */ 26 | public class NormalRefreshActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 27 | 28 | ListView listView; 29 | BaseHeaderView headerView; 30 | BaseFooterView footerView; 31 | 32 | ArrayAdapter adapter; 33 | 34 | List list = new ArrayList(); 35 | 36 | @Override 37 | protected void onCreate(Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | setContentView(R.layout.activity_normal_refresh); 40 | 41 | listView = (ListView) findViewById(R.id.list); 42 | headerView = (BaseHeaderView) findViewById(R.id.header); 43 | 44 | list = getData(15); 45 | 46 | adapter = new ArrayAdapter(this, R.layout.item, list); 47 | 48 | footerView = new EndFooterView(this); 49 | 50 | listView.setAdapter(adapter); 51 | listView.addFooterView(footerView); 52 | 53 | ((PullRefreshLayout) findViewById(R.id.root)).setFooter(footerView); 54 | 55 | headerView.setOnRefreshListener(this); 56 | footerView.setOnLoadListener(this); 57 | } 58 | 59 | @Override 60 | public void onRefresh(BaseHeaderView baseHeaderView) { 61 | baseHeaderView.postDelayed(new Runnable() { 62 | @Override 63 | public void run() { 64 | page = 1; 65 | List datas = getData(5); 66 | list.clear(); 67 | list.addAll(datas); 68 | adapter.notifyDataSetChanged(); 69 | headerView.stopRefresh(); 70 | } 71 | }, 3000); 72 | } 73 | 74 | @Override 75 | public void onLoad(BaseFooterView baseFooterView) { 76 | baseFooterView.postDelayed(new Runnable() { 77 | @Override 78 | public void run() { 79 | page++; 80 | List datas = getData(5); 81 | list.addAll(datas); 82 | adapter.notifyDataSetChanged(); 83 | footerView.stopLoad(); 84 | } 85 | }, 3000); 86 | } 87 | 88 | 89 | int page = 1; 90 | 91 | private List getData(int n) { 92 | List datas = new ArrayList<>(n); 93 | for (int i = 0; i < n; i++) { 94 | datas.add("第" + page + "页,第" + i + "条"); 95 | } 96 | return datas; 97 | } 98 | } 99 | 100 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/OtherActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | 8 | import com.ybao.pullrefreshview.simple.R; 9 | import com.ybao.pullrefreshview.simple.activities.other.HeaderActivity; 10 | import com.ybao.pullrefreshview.simple.activities.other.MIFlingActivity; 11 | 12 | 13 | /** 14 | * Created by Ybao on 2015/11/3 0003. 15 | */ 16 | public class OtherActivity extends AppCompatActivity { 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_other); 22 | findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { 23 | @Override 24 | public void onClick(View v) { 25 | startActivity(new Intent(OtherActivity.this, MIFlingActivity.class)); 26 | } 27 | }); 28 | findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { 29 | @Override 30 | public void onClick(View v) { 31 | startActivity(new Intent(OtherActivity.this, HeaderActivity.class)); 32 | } 33 | }); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/DrawerEpActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.ep; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.ArrayAdapter; 6 | import android.widget.ListView; 7 | 8 | import com.ybao.pullrefreshview.layout.BaseFooterView; 9 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 10 | import com.ybao.pullrefreshview.simple.R; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | /** 16 | * Created by Ybao on 2015/11/3 0003. 17 | */ 18 | public class DrawerEpActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 19 | 20 | ListView listView; 21 | BaseHeaderView headerView; 22 | BaseFooterView footerView; 23 | 24 | ArrayAdapter adapter; 25 | 26 | List list; 27 | 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.activity_drawer_ep); 32 | 33 | listView = (ListView) findViewById(R.id.list); 34 | headerView = (BaseHeaderView) findViewById(R.id.header); 35 | footerView = (BaseFooterView) findViewById(R.id.footer); 36 | 37 | list = getData(15); 38 | 39 | adapter = new ArrayAdapter(this, R.layout.item, list); 40 | 41 | 42 | listView.setAdapter(adapter); 43 | 44 | headerView.setOnRefreshListener(this); 45 | footerView.setOnLoadListener(this); 46 | } 47 | 48 | @Override 49 | public void onRefresh(BaseHeaderView baseHeaderView) { 50 | baseHeaderView.postDelayed(new Runnable() { 51 | @Override 52 | public void run() { 53 | page = 1; 54 | List datas = getData(5); 55 | list.clear(); 56 | list.addAll(datas); 57 | adapter.notifyDataSetChanged(); 58 | headerView.stopRefresh(); 59 | } 60 | }, 3000); 61 | } 62 | 63 | @Override 64 | public void onLoad(BaseFooterView baseFooterView) { 65 | baseFooterView.postDelayed(new Runnable() { 66 | @Override 67 | public void run() { 68 | page++; 69 | List datas = getData(5); 70 | list.addAll(datas); 71 | adapter.notifyDataSetChanged(); 72 | footerView.stopLoad(); 73 | } 74 | }, 3000); 75 | } 76 | 77 | 78 | int page = 1; 79 | 80 | private List getData(int n) { 81 | List datas = new ArrayList<>(n); 82 | for (int i = 0; i < n; i++) { 83 | datas.add("第" + page + "页,第" + i + "条"); 84 | } 85 | return datas; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/NormolEpActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.ep; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.ArrayAdapter; 6 | import android.widget.ListView; 7 | 8 | import com.ybao.pullrefreshview.layout.BaseFooterView; 9 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 10 | import com.ybao.pullrefreshview.simple.R; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | /** 16 | * Created by Ybao on 2015/11/3 0003. 17 | */ 18 | public class NormolEpActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 19 | 20 | ListView listView; 21 | BaseHeaderView headerView; 22 | BaseFooterView footerView; 23 | 24 | ArrayAdapter adapter; 25 | 26 | List list = new ArrayList(); 27 | 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.activity_normol_ep); 32 | 33 | listView = (ListView) findViewById(R.id.list); 34 | headerView = (BaseHeaderView) findViewById(R.id.header); 35 | footerView = (BaseFooterView) findViewById(R.id.footer); 36 | 37 | list = getData(15); 38 | 39 | adapter = new ArrayAdapter(this, R.layout.item, list); 40 | 41 | 42 | listView.setAdapter(adapter); 43 | 44 | headerView.setOnRefreshListener(this); 45 | footerView.setOnLoadListener(this); 46 | } 47 | 48 | @Override 49 | public void onRefresh(BaseHeaderView baseHeaderView) { 50 | baseHeaderView.postDelayed(new Runnable() { 51 | @Override 52 | public void run() { 53 | page = 1; 54 | List datas = getData(5); 55 | list.clear(); 56 | list.addAll(datas); 57 | adapter.notifyDataSetChanged(); 58 | headerView.stopRefresh(); 59 | } 60 | }, 3000); 61 | } 62 | 63 | @Override 64 | public void onLoad(BaseFooterView baseFooterView) { 65 | baseFooterView.postDelayed(new Runnable() { 66 | @Override 67 | public void run() { 68 | page++; 69 | List datas = getData(5); 70 | list.addAll(datas); 71 | adapter.notifyDataSetChanged(); 72 | footerView.stopLoad(); 73 | } 74 | }, 3000); 75 | } 76 | 77 | 78 | int page = 1; 79 | 80 | private List getData(int n) { 81 | List datas = new ArrayList<>(n); 82 | for (int i = 0; i < n; i++) { 83 | datas.add("第" + page + "页,第" + i + "条"); 84 | } 85 | return datas; 86 | } 87 | } 88 | 89 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/RG2Activity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.ep; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.ArrayAdapter; 6 | import android.widget.ListView; 7 | 8 | import com.ybao.pullrefreshview.layout.BaseFooterView; 9 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 10 | import com.ybao.pullrefreshview.simple.R; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | /** 16 | * Created by Ybao on 2015/11/3 0003. 17 | */ 18 | public class RG2Activity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 19 | 20 | ListView listView; 21 | BaseHeaderView headerView; 22 | BaseFooterView footerView; 23 | 24 | ArrayAdapter adapter; 25 | 26 | List list = new ArrayList(); 27 | 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.activity_rg2); 32 | listView = (ListView) findViewById(R.id.list); 33 | headerView = (BaseHeaderView) findViewById(R.id.header); 34 | footerView = (BaseFooterView) findViewById(R.id.footer); 35 | 36 | list = getData(15); 37 | 38 | adapter = new ArrayAdapter(this, R.layout.item, list); 39 | 40 | listView.setAdapter(adapter); 41 | 42 | headerView.setOnRefreshListener(this); 43 | footerView.setOnLoadListener(this); 44 | } 45 | 46 | 47 | @Override 48 | public void onRefresh(BaseHeaderView baseHeaderView) { 49 | baseHeaderView.postDelayed(new Runnable() { 50 | @Override 51 | public void run() { 52 | page = 1; 53 | List datas = getData(5); 54 | list.clear(); 55 | list.addAll(datas); 56 | adapter.notifyDataSetChanged(); 57 | headerView.stopRefresh(); 58 | } 59 | }, 3000); 60 | } 61 | 62 | @Override 63 | public void onLoad(BaseFooterView baseFooterView) { 64 | baseFooterView.postDelayed(new Runnable() { 65 | @Override 66 | public void run() { 67 | page++; 68 | List datas = getData(5); 69 | list.addAll(datas); 70 | adapter.notifyDataSetChanged(); 71 | footerView.stopLoad(); 72 | } 73 | }, 3000); 74 | } 75 | 76 | 77 | int page = 1; 78 | 79 | private List getData(int n) { 80 | List datas = new ArrayList<>(n); 81 | for (int i = 0; i < n; i++) { 82 | datas.add("第" + page + "页,第" + i + "条"); 83 | } 84 | return datas; 85 | } 86 | } -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/RGActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.ep; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.ArrayAdapter; 6 | import android.widget.ListView; 7 | 8 | import com.ybao.pullrefreshview.layout.BaseFooterView; 9 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 10 | import com.ybao.pullrefreshview.simple.R; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | /** 16 | * Created by Ybao on 2015/11/3 0003. 17 | */ 18 | public class RGActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 19 | 20 | ListView listView; 21 | BaseHeaderView headerView; 22 | BaseFooterView footerView; 23 | 24 | ArrayAdapter adapter; 25 | 26 | List list = new ArrayList(); 27 | 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.activity_rg); 32 | listView = (ListView) findViewById(R.id.list); 33 | headerView = (BaseHeaderView) findViewById(R.id.header); 34 | footerView = (BaseFooterView) findViewById(R.id.footer); 35 | 36 | list = getData(15); 37 | 38 | adapter = new ArrayAdapter(this, R.layout.item, list); 39 | 40 | listView.setAdapter(adapter); 41 | 42 | headerView.setOnRefreshListener(this); 43 | footerView.setOnLoadListener(this); 44 | } 45 | 46 | 47 | @Override 48 | public void onRefresh(BaseHeaderView baseHeaderView) { 49 | baseHeaderView.postDelayed(new Runnable() { 50 | @Override 51 | public void run() { 52 | page = 1; 53 | List datas = getData(5); 54 | list.clear(); 55 | list.addAll(datas); 56 | adapter.notifyDataSetChanged(); 57 | headerView.stopRefresh(); 58 | } 59 | }, 3000); 60 | } 61 | 62 | @Override 63 | public void onLoad(BaseFooterView baseFooterView) { 64 | baseFooterView.postDelayed(new Runnable() { 65 | @Override 66 | public void run() { 67 | page++; 68 | List datas = getData(5); 69 | list.addAll(datas); 70 | adapter.notifyDataSetChanged(); 71 | footerView.stopLoad(); 72 | } 73 | }, 3000); 74 | } 75 | 76 | 77 | int page = 1; 78 | 79 | private List getData(int n) { 80 | List datas = new ArrayList<>(n); 81 | for (int i = 0; i < n; i++) { 82 | datas.add("第" + page + "页,第" + i + "条"); 83 | } 84 | return datas; 85 | } 86 | } -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ep/ScrollerEpActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.ep; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.ArrayAdapter; 6 | import android.widget.ListView; 7 | 8 | import com.ybao.pullrefreshview.layout.BaseFooterView; 9 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 10 | import com.ybao.pullrefreshview.simple.R; 11 | 12 | import java.util.ArrayList; 13 | import java.util.List; 14 | 15 | /** 16 | * Created by Ybao on 2015/11/3 0003. 17 | */ 18 | public class ScrollerEpActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 19 | 20 | ListView listView; 21 | BaseHeaderView headerView; 22 | BaseFooterView footerView; 23 | 24 | ArrayAdapter adapter; 25 | 26 | List list = new ArrayList(); 27 | 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.activity_scroller_ep); 32 | listView = (ListView) findViewById(R.id.list); 33 | headerView = (BaseHeaderView) findViewById(R.id.header); 34 | footerView = (BaseFooterView) findViewById(R.id.footer); 35 | 36 | list = getData(15); 37 | 38 | adapter = new ArrayAdapter(this, R.layout.item, list); 39 | 40 | listView.setAdapter(adapter); 41 | 42 | headerView.setOnRefreshListener(this); 43 | footerView.setOnLoadListener(this); 44 | } 45 | 46 | 47 | @Override 48 | public void onRefresh(BaseHeaderView baseHeaderView) { 49 | baseHeaderView.postDelayed(new Runnable() { 50 | @Override 51 | public void run() { 52 | page = 1; 53 | List datas = getData(5); 54 | list.clear(); 55 | list.addAll(datas); 56 | adapter.notifyDataSetChanged(); 57 | headerView.stopRefresh(); 58 | } 59 | }, 3000); 60 | } 61 | 62 | @Override 63 | public void onLoad(BaseFooterView baseFooterView) { 64 | baseFooterView.postDelayed(new Runnable() { 65 | @Override 66 | public void run() { 67 | page++; 68 | List datas = getData(5); 69 | list.addAll(datas); 70 | adapter.notifyDataSetChanged(); 71 | footerView.stopLoad(); 72 | } 73 | }, 3000); 74 | } 75 | 76 | 77 | int page = 1; 78 | 79 | private List getData(int n) { 80 | List datas = new ArrayList<>(n); 81 | for (int i = 0; i < n; i++) { 82 | datas.add("第" + page + "页,第" + i + "条"); 83 | } 84 | return datas; 85 | } 86 | } -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ex/RecyclerViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.ex; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.support.v7.widget.LinearLayoutManager; 6 | import android.support.v7.widget.RecyclerView; 7 | import android.view.LayoutInflater; 8 | import android.view.ViewGroup; 9 | import android.widget.ArrayAdapter; 10 | import android.widget.ListView; 11 | import android.widget.TextView; 12 | 13 | import com.ybao.adapter.recyclerview.StandardAdapter; 14 | import com.ybao.pullrefreshview.layout.BaseFooterView; 15 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 16 | import com.ybao.pullrefreshview.simple.R; 17 | 18 | import java.util.ArrayList; 19 | import java.util.List; 20 | 21 | /** 22 | * Created by Ybao on 2015/11/3 0003. 23 | */ 24 | public class RecyclerViewActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 25 | 26 | RecyclerView recyclerView; 27 | BaseHeaderView headerView; 28 | BaseFooterView footerView; 29 | 30 | RecyclerViewAdapter adapter; 31 | 32 | List list = new ArrayList(); 33 | 34 | @Override 35 | protected void onCreate(Bundle savedInstanceState) { 36 | super.onCreate(savedInstanceState); 37 | setContentView(R.layout.activity_recyclerview); 38 | 39 | recyclerView = (RecyclerView) findViewById(R.id.list); 40 | headerView = (BaseHeaderView) findViewById(R.id.header); 41 | footerView = (BaseFooterView) findViewById(R.id.footer); 42 | 43 | list = getData(15); 44 | 45 | adapter = new RecyclerViewAdapter(); 46 | adapter.setData(list); 47 | 48 | recyclerView.setLayoutManager(new LinearLayoutManager(this)); 49 | recyclerView.setAdapter(adapter); 50 | 51 | headerView.setOnRefreshListener(this); 52 | footerView.setOnLoadListener(this); 53 | } 54 | 55 | @Override 56 | public void onRefresh(BaseHeaderView baseHeaderView) { 57 | baseHeaderView.postDelayed(new Runnable() { 58 | @Override 59 | public void run() { 60 | page = 1; 61 | List datas = getData(5); 62 | list.clear(); 63 | list.addAll(datas); 64 | adapter.setData(list); 65 | headerView.stopRefresh(); 66 | } 67 | }, 3000); 68 | } 69 | 70 | @Override 71 | public void onLoad(BaseFooterView baseFooterView) { 72 | baseFooterView.postDelayed(new Runnable() { 73 | @Override 74 | public void run() { 75 | page++; 76 | List datas = getData(5); 77 | list.addAll(datas); 78 | adapter.notifyDataSetChanged(); 79 | footerView.stopLoad(); 80 | } 81 | }, 3000); 82 | } 83 | 84 | 85 | int page = 1; 86 | 87 | private List getData(int n) { 88 | List datas = new ArrayList<>(n); 89 | for (int i = 0; i < n; i++) { 90 | datas.add("第" + page + "页,第" + i + "条"); 91 | } 92 | return datas; 93 | } 94 | 95 | class RecyclerViewAdapter extends StandardAdapter { 96 | @Override 97 | public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 98 | return new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false)); 99 | } 100 | 101 | @Override 102 | public void onBindViewHolder(ItemViewHolder holder, int position) { 103 | super.onBindViewHolder(holder, position); 104 | 105 | ((TextView) holder.itemView).setText(getItem(position).toString()); 106 | 107 | } 108 | } 109 | 110 | 111 | } 112 | 113 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ex/ScrollViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.ex; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | import com.ybao.pullrefreshview.layout.BaseFooterView; 7 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 8 | import com.ybao.pullrefreshview.simple.R; 9 | 10 | /** 11 | * Created by Ybao on 2015/11/5 0003. 12 | */ 13 | public class ScrollViewActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 14 | 15 | BaseHeaderView headerView; 16 | BaseFooterView footerView; 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_scrollview); 22 | 23 | headerView = (BaseHeaderView) findViewById(R.id.header); 24 | footerView = (BaseFooterView) findViewById(R.id.footer); 25 | 26 | headerView.setOnRefreshListener(this); 27 | footerView.setOnLoadListener(this); 28 | } 29 | 30 | 31 | @Override 32 | public void onRefresh(BaseHeaderView baseHeaderView) { 33 | baseHeaderView.postDelayed(new Runnable() { 34 | @Override 35 | public void run() { 36 | headerView.stopRefresh(); 37 | } 38 | }, 3000); 39 | } 40 | 41 | @Override 42 | public void onLoad(BaseFooterView baseFooterView) { 43 | baseFooterView.postDelayed(new Runnable() { 44 | @Override 45 | public void run() { 46 | footerView.stopLoad(); 47 | } 48 | }, 3000); 49 | } 50 | 51 | 52 | } 53 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/ex/TextViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.ex; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | 6 | import com.ybao.pullrefreshview.layout.BaseFooterView; 7 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 8 | import com.ybao.pullrefreshview.simple.R; 9 | 10 | /** 11 | * Created by Ybao on 2015/11/7 0007. 12 | */ 13 | public class TextViewActivity extends AppCompatActivity implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 14 | 15 | BaseHeaderView headerView; 16 | BaseFooterView footerView; 17 | 18 | @Override 19 | protected void onCreate(Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | setContentView(R.layout.activity_textview); 22 | 23 | headerView = (BaseHeaderView) findViewById(R.id.header); 24 | footerView = (BaseFooterView) findViewById(R.id.footer); 25 | 26 | 27 | headerView.setOnRefreshListener(this); 28 | footerView.setOnLoadListener(this); 29 | } 30 | 31 | 32 | @Override 33 | public void onRefresh(BaseHeaderView baseHeaderView) { 34 | baseHeaderView.postDelayed(new Runnable() { 35 | @Override 36 | public void run() { 37 | headerView.stopRefresh(); 38 | } 39 | }, 3000); 40 | } 41 | 42 | @Override 43 | public void onLoad(BaseFooterView baseFooterView) { 44 | baseFooterView.postDelayed(new Runnable() { 45 | @Override 46 | public void run() { 47 | footerView.stopLoad(); 48 | } 49 | }, 3000); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/other/HeaderActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.other; 2 | 3 | import android.os.Bundle; 4 | import android.support.v4.view.ViewCompat; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.view.View; 7 | import android.widget.AbsListView; 8 | import android.widget.ArrayAdapter; 9 | import android.widget.ListView; 10 | 11 | import com.ybao.pullrefreshview.layout.BaseFooterView; 12 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 13 | import com.ybao.pullrefreshview.layout.FlingLayout; 14 | import com.ybao.pullrefreshview.simple.R; 15 | import com.ybao.pullrefreshview.support.utils.ViewScrollUtil; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | /** 21 | * Created by Ybao on 16/7/30. 22 | */ 23 | public class HeaderActivity extends AppCompatActivity implements BaseFooterView.OnLoadListener, AbsListView.OnScrollListener, FlingLayout.OnScrollListener { 24 | 25 | FlingLayout flingLayout; 26 | ListView listView; 27 | BaseFooterView footerView; 28 | View animHeader; 29 | 30 | ArrayAdapter adapter; 31 | 32 | List list = new ArrayList(); 33 | 34 | ViewScrollUtil.ScrollGeter scrollGeter; 35 | 36 | @Override 37 | protected void onCreate(Bundle savedInstanceState) { 38 | super.onCreate(savedInstanceState); 39 | setContentView(R.layout.activity_header); 40 | 41 | flingLayout = (FlingLayout) findViewById(R.id.root); 42 | listView = (ListView) findViewById(R.id.list); 43 | footerView = (BaseFooterView) findViewById(R.id.footer); 44 | animHeader = findViewById(R.id.anim_header); 45 | scrollGeter = ViewScrollUtil.getScrollGeter(listView); 46 | 47 | list = getData(15); 48 | 49 | adapter = new ArrayAdapter(this, R.layout.item, list); 50 | 51 | listView.setAdapter(adapter); 52 | flingLayout.setOnScrollListener(this); 53 | listView.setOnScrollListener(this); 54 | footerView.setOnLoadListener(this); 55 | } 56 | 57 | @Override 58 | public void onLoad(BaseFooterView baseFooterView) { 59 | baseFooterView.postDelayed(new Runnable() { 60 | @Override 61 | public void run() { 62 | page++; 63 | List datas = getData(5); 64 | list.addAll(datas); 65 | adapter.notifyDataSetChanged(); 66 | footerView.stopLoad(); 67 | } 68 | }, 3000); 69 | } 70 | 71 | 72 | int page = 1; 73 | 74 | private List getData(int n) { 75 | List datas = new ArrayList<>(n); 76 | for (int i = 0; i < n; i++) { 77 | datas.add("第" + page + "页,第" + i + "条"); 78 | } 79 | return datas; 80 | } 81 | 82 | @Override 83 | public void onScroll(FlingLayout flingLayout, float y) { 84 | onMove(); 85 | } 86 | 87 | @Override 88 | public void onScrollChange(FlingLayout flingLayout, int state) { 89 | 90 | } 91 | 92 | @Override 93 | public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 94 | onMove(); 95 | } 96 | 97 | @Override 98 | public void onScrollStateChanged(AbsListView view, int scrollState) { 99 | 100 | } 101 | 102 | 103 | private void onMove() { 104 | int oy = (int) flingLayout.getMoveP() - scrollGeter.getScrollY(); 105 | if (oy > 0) { 106 | int imgHeaderHeigth = animHeader.getMeasuredHeight(); 107 | float ph = 1 + (float) oy / (float) imgHeaderHeigth; 108 | ViewCompat.setPivotY(animHeader, 0); 109 | ViewCompat.setScaleX(animHeader, ph); 110 | ViewCompat.setScaleY(animHeader, ph); 111 | 112 | } else { 113 | ViewCompat.setScaleX(animHeader, 1); 114 | ViewCompat.setScaleY(animHeader, 1); 115 | ViewCompat.setTranslationY(animHeader, oy); 116 | } 117 | } 118 | } -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/activities/other/MIFlingActivity.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.activities.other; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.ArrayAdapter; 6 | import android.widget.ListView; 7 | 8 | import com.ybao.pullrefreshview.simple.R; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | 13 | /** 14 | * Created by Ybao on 16/7/30. 15 | */ 16 | public class MIFlingActivity extends AppCompatActivity { 17 | 18 | ListView listView; 19 | 20 | ArrayAdapter adapter; 21 | 22 | List list; 23 | 24 | @Override 25 | protected void onCreate(Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | setContentView(R.layout.activity_mifling); 28 | listView = (ListView) findViewById(R.id.list); 29 | list = getData(15); 30 | adapter = new ArrayAdapter(this, R.layout.item, list); 31 | 32 | listView.setAdapter(adapter); 33 | } 34 | 35 | 36 | int page = 1; 37 | 38 | private List getData(int n) { 39 | List datas = new ArrayList<>(n); 40 | for (int i = 0; i < n; i++) { 41 | datas.add("第" + page + "页,第" + i + "条"); 42 | } 43 | return datas; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment0.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.fragment; 2 | 3 | 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.ArrayAdapter; 11 | import android.widget.ListView; 12 | 13 | import com.ybao.pullrefreshview.layout.BaseFooterView; 14 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 15 | import com.ybao.pullrefreshview.simple.R; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | /** 21 | * Created by Ybao on 16/7/25. 22 | */ 23 | public class Fragment0 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 24 | View view; 25 | 26 | ListView listView; 27 | BaseHeaderView headerView; 28 | BaseFooterView footerView; 29 | 30 | ArrayAdapter adapter; 31 | 32 | List list = new ArrayList(); 33 | 34 | @Nullable 35 | @Override 36 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 37 | view = inflater.inflate(R.layout.fragment0, container, false); 38 | listView = findViewById(R.id.list); 39 | headerView = findViewById(R.id.header); 40 | footerView = findViewById(R.id.footer); 41 | 42 | list = getData(15); 43 | 44 | adapter = new ArrayAdapter(getContext(), R.layout.item, list); 45 | 46 | listView.setAdapter(adapter); 47 | 48 | headerView.setOnRefreshListener(this); 49 | footerView.setOnLoadListener(this); 50 | return view; 51 | } 52 | 53 | @Override 54 | public void onRefresh(BaseHeaderView baseHeaderView) { 55 | baseHeaderView.postDelayed(new Runnable() { 56 | @Override 57 | public void run() { 58 | page = 1; 59 | List datas = getData(5); 60 | list.clear(); 61 | list.addAll(datas); 62 | adapter.notifyDataSetChanged(); 63 | headerView.stopRefresh(); 64 | } 65 | }, 3000); 66 | } 67 | 68 | @Override 69 | public void onLoad(BaseFooterView baseFooterView) { 70 | baseFooterView.postDelayed(new Runnable() { 71 | @Override 72 | public void run() { 73 | page++; 74 | List datas = getData(5); 75 | list.addAll(datas); 76 | adapter.notifyDataSetChanged(); 77 | footerView.stopLoad(); 78 | } 79 | }, 3000); 80 | } 81 | 82 | 83 | int page = 1; 84 | 85 | private List getData(int n) { 86 | List datas = new ArrayList<>(n); 87 | for (int i = 0; i < n; i++) { 88 | datas.add("第" + page + "页,第" + i + "条"); 89 | } 90 | return datas; 91 | } 92 | 93 | public T findViewById(int id) { 94 | return (T) view.findViewById(id); 95 | 96 | } 97 | } -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment1.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.fragment; 2 | 3 | 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.support.v7.widget.LinearLayoutManager; 11 | import android.support.v7.widget.RecyclerView; 12 | import android.widget.TextView; 13 | 14 | import com.ybao.adapter.recyclerview.StandardAdapter; 15 | import com.ybao.pullrefreshview.layout.BaseFooterView; 16 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 17 | import com.ybao.pullrefreshview.simple.R; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | /** 23 | * Created by Ybao on 16/7/25. 24 | */ 25 | public class Fragment1 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 26 | View view; 27 | 28 | 29 | RecyclerView recyclerView; 30 | BaseHeaderView headerView; 31 | BaseFooterView footerView; 32 | 33 | RecyclerViewAdapter adapter; 34 | 35 | List list = new ArrayList(); 36 | 37 | @Nullable 38 | @Override 39 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 40 | view = inflater.inflate(R.layout.fragment1, container, false); 41 | 42 | 43 | recyclerView = findViewById(R.id.list); 44 | headerView = findViewById(R.id.header); 45 | footerView = findViewById(R.id.footer); 46 | 47 | list = getData(15); 48 | 49 | adapter = new RecyclerViewAdapter(); 50 | adapter.setData(list); 51 | 52 | recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 53 | recyclerView.setAdapter(adapter); 54 | 55 | headerView.setOnRefreshListener(this); 56 | footerView.setOnLoadListener(this); 57 | 58 | return view; 59 | } 60 | @Override 61 | public void onRefresh(BaseHeaderView baseHeaderView) { 62 | baseHeaderView.postDelayed(new Runnable() { 63 | @Override 64 | public void run() { 65 | page = 1; 66 | List datas = getData(5); 67 | list.clear(); 68 | list.addAll(datas); 69 | adapter.setData(list); 70 | headerView.stopRefresh(); 71 | } 72 | }, 3000); 73 | } 74 | 75 | @Override 76 | public void onLoad(BaseFooterView baseFooterView) { 77 | baseFooterView.postDelayed(new Runnable() { 78 | @Override 79 | public void run() { 80 | page++; 81 | List datas = getData(5); 82 | list.addAll(datas); 83 | adapter.notifyDataSetChanged(); 84 | footerView.stopLoad(); 85 | } 86 | }, 3000); 87 | } 88 | 89 | 90 | int page = 1; 91 | 92 | private List getData(int n) { 93 | List datas = new ArrayList<>(n); 94 | for (int i = 0; i < n; i++) { 95 | datas.add("第" + page + "页,第" + i + "条"); 96 | } 97 | return datas; 98 | } 99 | 100 | class RecyclerViewAdapter extends StandardAdapter { 101 | @Override 102 | public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 103 | return new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false)); 104 | } 105 | 106 | @Override 107 | public void onBindViewHolder(ItemViewHolder holder, int position) { 108 | super.onBindViewHolder(holder, position); 109 | 110 | ((TextView) holder.itemView).setText(getItem(position).toString()); 111 | 112 | } 113 | } 114 | 115 | public T findViewById(int id) { 116 | return (T) view.findViewById(id); 117 | 118 | } 119 | 120 | } -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment2.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.fragment; 2 | 3 | 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | 11 | import com.ybao.pullrefreshview.layout.BaseFooterView; 12 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 13 | import com.ybao.pullrefreshview.simple.R; 14 | 15 | /** 16 | * Created by Ybao on 16/7/25. 17 | */ 18 | public class Fragment2 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 19 | View view; 20 | 21 | BaseHeaderView headerView; 22 | BaseFooterView footerView; 23 | @Nullable 24 | @Override 25 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 26 | view = inflater.inflate(R.layout.fragment2, container, false); 27 | 28 | headerView = findViewById(R.id.header); 29 | footerView = findViewById(R.id.footer); 30 | 31 | headerView.setOnRefreshListener(this); 32 | footerView.setOnLoadListener(this); 33 | return view; 34 | } 35 | 36 | 37 | @Override 38 | public void onRefresh(BaseHeaderView baseHeaderView) { 39 | baseHeaderView.postDelayed(new Runnable() { 40 | @Override 41 | public void run() { 42 | headerView.stopRefresh(); 43 | } 44 | }, 3000); 45 | } 46 | 47 | @Override 48 | public void onLoad(BaseFooterView baseFooterView) { 49 | baseFooterView.postDelayed(new Runnable() { 50 | @Override 51 | public void run() { 52 | footerView.stopLoad(); 53 | } 54 | }, 3000); 55 | } 56 | 57 | 58 | public T findViewById(int id) { 59 | return (T) view.findViewById(id); 60 | 61 | } 62 | } -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment3.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.fragment; 2 | 3 | 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.widget.ArrayAdapter; 11 | import android.widget.ListView; 12 | 13 | import com.ybao.pullrefreshview.layout.BaseFooterView; 14 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 15 | import com.ybao.pullrefreshview.simple.R; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | /** 21 | * Created by Ybao on 16/7/25. 22 | */ 23 | public class Fragment3 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 24 | View view; 25 | 26 | BaseHeaderView headerView; 27 | BaseFooterView footerView; 28 | @Nullable 29 | @Override 30 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 31 | view = inflater.inflate(R.layout.fragment3, container, false); 32 | 33 | headerView = findViewById(R.id.header); 34 | footerView = findViewById(R.id.footer); 35 | 36 | headerView.setOnRefreshListener(this); 37 | footerView.setOnLoadListener(this); 38 | return view; 39 | } 40 | 41 | 42 | @Override 43 | public void onRefresh(BaseHeaderView baseHeaderView) { 44 | baseHeaderView.postDelayed(new Runnable() { 45 | @Override 46 | public void run() { 47 | headerView.stopRefresh(); 48 | } 49 | }, 3000); 50 | } 51 | 52 | @Override 53 | public void onLoad(BaseFooterView baseFooterView) { 54 | baseFooterView.postDelayed(new Runnable() { 55 | @Override 56 | public void run() { 57 | footerView.stopLoad(); 58 | } 59 | }, 3000); 60 | } 61 | 62 | 63 | public T findViewById(int id) { 64 | return (T) view.findViewById(id); 65 | 66 | } 67 | } -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/fragment/Fragment4.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.fragment; 2 | 3 | 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v4.app.Fragment; 7 | import android.view.LayoutInflater; 8 | import android.view.View; 9 | import android.view.ViewGroup; 10 | import android.webkit.WebView; 11 | import android.webkit.WebViewClient; 12 | 13 | import com.ybao.pullrefreshview.layout.BaseFooterView; 14 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 15 | import com.ybao.pullrefreshview.simple.R; 16 | 17 | /** 18 | * Created by Ybao on 16/7/25. 19 | */ 20 | public class Fragment4 extends Fragment implements BaseHeaderView.OnRefreshListener, BaseFooterView.OnLoadListener { 21 | View view; 22 | 23 | BaseHeaderView headerView; 24 | BaseFooterView footerView; 25 | 26 | @Nullable 27 | @Override 28 | public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 29 | view = inflater.inflate(R.layout.fragment4, container, false); 30 | WebView webView = findViewById(R.id.webview); 31 | webView.setWebViewClient(new WebViewClient() { 32 | @Override 33 | public void onPageFinished(WebView view, String url){ 34 | } 35 | 36 | @Override 37 | public boolean shouldOverrideUrlLoading(WebView view, String url) { 38 | 39 | if (url.indexOf("objc://") != -1) { 40 | return true; 41 | } 42 | return super.shouldOverrideUrlLoading(view, url); 43 | } 44 | }); 45 | webView.loadUrl("http://www.baidu.com"); 46 | headerView = findViewById(R.id.header); 47 | footerView = findViewById(R.id.footer); 48 | 49 | headerView.setOnRefreshListener(this); 50 | footerView.setOnLoadListener(this); 51 | return view; 52 | } 53 | 54 | 55 | @Override 56 | public void onRefresh(BaseHeaderView baseHeaderView) { 57 | baseHeaderView.postDelayed(new Runnable() { 58 | @Override 59 | public void run() { 60 | headerView.stopRefresh(); 61 | } 62 | }, 3000); 63 | } 64 | 65 | @Override 66 | public void onLoad(BaseFooterView baseFooterView) { 67 | baseFooterView.postDelayed(new Runnable() { 68 | @Override 69 | public void run() { 70 | footerView.stopLoad(); 71 | } 72 | }, 3000); 73 | } 74 | 75 | 76 | public T findViewById(int id) { 77 | return (T) view.findViewById(id); 78 | 79 | } 80 | } -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/utils/AnimUtil.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.utils; 2 | 3 | import android.view.View; 4 | import android.view.animation.Interpolator; 5 | import android.view.animation.LinearInterpolator; 6 | 7 | import com.nineoldandroids.animation.Animator; 8 | import com.nineoldandroids.animation.AnimatorSet; 9 | import com.nineoldandroids.animation.ObjectAnimator; 10 | import com.nineoldandroids.view.ViewHelper; 11 | 12 | /** 13 | * Created by Ybao on 2015/11/7 0007. 14 | */ 15 | public class AnimUtil { 16 | public static Animator startRotation(View view, float toRotation) { 17 | Animator animator = ObjectAnimator.ofFloat(view, "rotation", ViewHelper.getRotation(view), toRotation); 18 | animator.start(); 19 | return animator; 20 | } 21 | 22 | public static Animator startRotation(View view, float toRotation, long duration, long startDelay) { 23 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "rotation", ViewHelper.getRotation(view), toRotation).setDuration(duration); 24 | objectAnimator.setStartDelay(startDelay); 25 | objectAnimator.start(); 26 | return objectAnimator; 27 | } 28 | 29 | public static Animator startRotation(View view, float toRotation, long duration, long startDelay, int times) { 30 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "rotation", ViewHelper.getRotation(view), toRotation).setDuration(duration); 31 | objectAnimator.setStartDelay(startDelay); 32 | objectAnimator.setRepeatCount(times); 33 | objectAnimator.setInterpolator(new LinearInterpolator()); 34 | objectAnimator.start(); 35 | return objectAnimator; 36 | } 37 | 38 | public static Animator startShow(View view, float fromAlpha, long duration, long startDelay) { 39 | ViewHelper.setAlpha(view, fromAlpha); 40 | view.setVisibility(View.VISIBLE); 41 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "alpha", fromAlpha, 1f).setDuration(duration); 42 | objectAnimator.setStartDelay(startDelay); 43 | objectAnimator.start(); 44 | return objectAnimator; 45 | } 46 | 47 | public static Animator startHide(final View view, long duration, long startDelay) { 48 | view.setVisibility(View.VISIBLE); 49 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "alpha", ViewHelper.getAlpha(view), 0f).setDuration(duration); 50 | objectAnimator.setStartDelay(startDelay); 51 | objectAnimator.start(); 52 | return objectAnimator; 53 | } 54 | 55 | public static Animator startShow(View view, float fromAlpha) { 56 | ViewHelper.setAlpha(view, fromAlpha); 57 | view.setVisibility(View.VISIBLE); 58 | Animator animator = ObjectAnimator.ofFloat(view, "alpha", fromAlpha, 1f); 59 | animator.start(); 60 | return animator; 61 | } 62 | 63 | public static Animator startHide(final View view) { 64 | view.setVisibility(View.VISIBLE); 65 | Animator animator = ObjectAnimator.ofFloat(view, "alpha", ViewHelper.getAlpha(view), 0f); 66 | animator.start(); 67 | return animator; 68 | } 69 | 70 | 71 | public static Animator startScale(final View view, float toScale) { 72 | AnimatorSet animator = new AnimatorSet(); 73 | animator.playTogether(ObjectAnimator.ofFloat(view, "scaleX", ViewHelper.getScaleX(view), toScale), ObjectAnimator.ofFloat(view, "scaleY", ViewHelper.getScaleY(view), toScale)); 74 | animator.start(); 75 | return animator; 76 | } 77 | 78 | public static Animator startScale(final View view, float toScale, long duration, long startDelay, Interpolator setInterpolator) { 79 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "scaleX", ViewHelper.getScaleX(view), toScale).setDuration(duration); 80 | objectAnimator.setStartDelay(startDelay); 81 | objectAnimator.setInterpolator(setInterpolator); 82 | objectAnimator.start(); 83 | objectAnimator = ObjectAnimator.ofFloat(view, "scaleY", ViewHelper.getScaleY(view), toScale).setDuration(duration); 84 | objectAnimator.setStartDelay(startDelay); 85 | objectAnimator.setInterpolator(setInterpolator); 86 | objectAnimator.start(); 87 | return objectAnimator; 88 | } 89 | 90 | public static Animator startScale(final View view, float fromScale, float toScale) { 91 | AnimatorSet animator = new AnimatorSet(); 92 | animator.playTogether(ObjectAnimator.ofFloat(view, "scaleX", fromScale, toScale), ObjectAnimator.ofFloat(view, "scaleY", fromScale, toScale)); 93 | animator.start(); 94 | return animator; 95 | } 96 | 97 | 98 | public static Animator startScale(final View view, float fromScale, float toScale, long duration, long startDelay, Interpolator setInterpolator) { 99 | ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view, "scaleX", fromScale, toScale).setDuration(duration); 100 | objectAnimator.setStartDelay(startDelay); 101 | objectAnimator.setInterpolator(setInterpolator); 102 | objectAnimator.start(); 103 | objectAnimator = ObjectAnimator.ofFloat(view, "scaleY", fromScale, toScale).setDuration(duration); 104 | objectAnimator.setStartDelay(startDelay); 105 | objectAnimator.setInterpolator(setInterpolator); 106 | objectAnimator.start(); 107 | return objectAnimator; 108 | } 109 | 110 | public static Animator startFromY(final View view, float fromY) { 111 | Animator animator = ObjectAnimator.ofFloat(view, "translationY", fromY, 0); 112 | animator.start(); 113 | return animator; 114 | } 115 | 116 | public static Animator startToY(final View view, float toY) { 117 | Animator animator = ObjectAnimator.ofFloat(view, "translationY", 0, toY); 118 | animator.start(); 119 | return animator; 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/view/EndFooterView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.animation.OvershootInterpolator; 8 | import android.widget.TextView; 9 | 10 | import com.nineoldandroids.animation.Animator; 11 | import com.nineoldandroids.view.ViewHelper; 12 | import com.ybao.pullrefreshview.layout.BaseFooterView; 13 | import com.ybao.pullrefreshview.simple.R; 14 | import com.ybao.pullrefreshview.simple.utils.AnimUtil; 15 | import com.ybao.pullrefreshview.support.type.LayoutType; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | /** 21 | * Created by Ybao on 2015/11/3 0003. 22 | */ 23 | public class EndFooterView extends BaseFooterView { 24 | 25 | TextView textView; 26 | View tagImg; 27 | View progress; 28 | View stateImg; 29 | 30 | 31 | public EndFooterView(Context context) { 32 | this(context, null); 33 | } 34 | 35 | public EndFooterView(Context context, AttributeSet attrs) { 36 | this(context, attrs, 0); 37 | } 38 | 39 | public EndFooterView(Context context, AttributeSet attrs, int defStyleAttr) { 40 | super(context, attrs, defStyleAttr); 41 | init(); 42 | } 43 | 44 | private void init() { 45 | LayoutInflater.from(getContext()).inflate(R.layout.view_footer_end, this, true); 46 | textView = (TextView) findViewById(R.id.text); 47 | tagImg = findViewById(R.id.tag); 48 | progress = findViewById(R.id.progress); 49 | stateImg = findViewById(R.id.state); 50 | } 51 | 52 | List animators = new ArrayList<>(); 53 | 54 | @Override 55 | protected void onStateChange(int state) { 56 | for (Animator animator : animators) { 57 | animator.cancel(); 58 | } 59 | animators.clear(); 60 | stateImg.setVisibility(View.INVISIBLE); 61 | progress.setVisibility(View.INVISIBLE); 62 | textView.setVisibility(View.VISIBLE); 63 | tagImg.setVisibility(View.VISIBLE); 64 | ViewHelper.setAlpha(textView, 1); 65 | ViewHelper.setAlpha(tagImg, 1); 66 | switch (state) { 67 | case NONE: 68 | case PULLING: 69 | textView.setText("上拉加载更多"); 70 | animators.add(AnimUtil.startRotation(tagImg, 0)); 71 | break; 72 | case LOOSENT_O_LOAD: 73 | textView.setText("松开加载"); 74 | animators.add(AnimUtil.startRotation(tagImg, 180)); 75 | break; 76 | case LOADING: 77 | textView.setText("正在加载"); 78 | animators.add(AnimUtil.startShow(progress, 0.1f, 400, 200)); 79 | animators.add(AnimUtil.startHide(textView)); 80 | animators.add(AnimUtil.startHide(tagImg)); 81 | break; 82 | case LOAD_CLONE: 83 | animators.add(AnimUtil.startScale(stateImg, 0.3f, 1f, 500, 50, new OvershootInterpolator())); 84 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 300, 150)); 85 | animators.add(AnimUtil.startHide(progress, 150, 0)); 86 | textView.setVisibility(View.INVISIBLE); 87 | tagImg.setVisibility(View.INVISIBLE); 88 | textView.setText("加载完成"); 89 | break; 90 | 91 | } 92 | 93 | } 94 | 95 | @Override 96 | public float getSpanHeight() { 97 | return 0; 98 | } 99 | 100 | @Override 101 | public int getLayoutType() { 102 | return LayoutType.LAYOUT_NOT_MOVE; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/view/ExpandFooterView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import com.nineoldandroids.animation.Animator; 10 | import com.nineoldandroids.animation.ObjectAnimator; 11 | import com.nineoldandroids.view.ViewHelper; 12 | import com.ybao.pullrefreshview.layout.BaseFooterView; 13 | import com.ybao.pullrefreshview.layout.FlingLayout; 14 | import com.ybao.pullrefreshview.layout.PullRefreshLayout; 15 | import com.ybao.pullrefreshview.simple.R; 16 | import com.ybao.pullrefreshview.simple.utils.AnimUtil; 17 | import com.ybao.pullrefreshview.support.type.LayoutType; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | /** 23 | * Created by Ybao on 2015/11/3 0003. 24 | */ 25 | public class ExpandFooterView extends BaseFooterView { 26 | View progress; 27 | View stateImg; 28 | View loadBox; 29 | 30 | int state = NONE; 31 | 32 | private int layoutType = LayoutType.LAYOUT_DRAWER; 33 | 34 | public ExpandFooterView(Context context) { 35 | this(context, null); 36 | } 37 | 38 | public ExpandFooterView(Context context, AttributeSet attrs) { 39 | this(context, attrs, 0); 40 | } 41 | 42 | public ExpandFooterView(Context context, AttributeSet attrs, int defStyleAttr) { 43 | super(context, attrs, defStyleAttr); 44 | init(); 45 | } 46 | 47 | private void init() { 48 | LayoutInflater.from(getContext()).inflate(R.layout.view_footer_expand, this, true); 49 | progress = findViewById(R.id.progress); 50 | stateImg = findViewById(R.id.state); 51 | loadBox = findViewById(R.id.load_box); 52 | setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 350)); 53 | } 54 | 55 | @Override 56 | public void setPullRefreshLayout(PullRefreshLayout refreshLayout) { 57 | super.setPullRefreshLayout(refreshLayout); 58 | refreshLayout.setMaxDistance(350); 59 | } 60 | 61 | List animators = new ArrayList<>(); 62 | 63 | @Override 64 | protected void onStateChange(int state) { 65 | this.state = state; 66 | for (Animator animator : animators) { 67 | animator.cancel(); 68 | } 69 | animators.clear(); 70 | stateImg.setVisibility(View.INVISIBLE); 71 | progress.setVisibility(View.VISIBLE); 72 | ViewHelper.setAlpha(progress, 1f); 73 | switch (state) { 74 | case NONE: 75 | break; 76 | case PULLING: 77 | break; 78 | case LOOSENT_O_LOAD: 79 | break; 80 | case LOADING: 81 | animators.add(AnimUtil.startRotation(progress, ViewHelper.getRotation(progress) + 359.99f, 500, 0, -1)); 82 | break; 83 | case LOAD_CLONE: 84 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 400, 200)); 85 | animators.add(AnimUtil.startHide(progress)); 86 | break; 87 | 88 | } 89 | 90 | } 91 | 92 | @Override 93 | public float getSpanHeight() { 94 | return loadBox.getHeight(); 95 | } 96 | 97 | @Override 98 | public int getLayoutType() { 99 | return layoutType; 100 | } 101 | 102 | @Override 103 | public boolean onScroll(float y) { 104 | boolean intercept = super.onScroll(y); 105 | if (!isLockState()) { 106 | ViewHelper.setRotation(progress, y * y * 48 / 31250); 107 | } 108 | return intercept; 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/view/ExpandHeaderView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import com.nineoldandroids.animation.Animator; 10 | import com.nineoldandroids.animation.ObjectAnimator; 11 | import com.nineoldandroids.view.ViewHelper; 12 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 13 | import com.ybao.pullrefreshview.layout.FlingLayout; 14 | import com.ybao.pullrefreshview.layout.PullRefreshLayout; 15 | import com.ybao.pullrefreshview.simple.R; 16 | import com.ybao.pullrefreshview.simple.utils.AnimUtil; 17 | import com.ybao.pullrefreshview.support.type.LayoutType; 18 | 19 | import java.util.ArrayList; 20 | import java.util.List; 21 | 22 | /** 23 | * Created by Ybao on 2015/11/3 0003. 24 | */ 25 | public class ExpandHeaderView extends BaseHeaderView { 26 | View progress; 27 | View stateImg; 28 | View loadBox; 29 | 30 | int state = NONE; 31 | 32 | private final static int layoutType = LayoutType.LAYOUT_DRAWER; 33 | 34 | public ExpandHeaderView(Context context) { 35 | this(context, null); 36 | } 37 | 38 | public ExpandHeaderView(Context context, AttributeSet attrs) { 39 | this(context, attrs, 0); 40 | } 41 | 42 | public ExpandHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { 43 | super(context, attrs, defStyleAttr); 44 | init(); 45 | } 46 | 47 | private void init() { 48 | LayoutInflater.from(getContext()).inflate(R.layout.view_header_expand, this, true); 49 | progress = findViewById(R.id.progress); 50 | stateImg = findViewById(R.id.state); 51 | loadBox = findViewById(R.id.load_box); 52 | setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 300)); 53 | } 54 | 55 | @Override 56 | public void setPullRefreshLayout(PullRefreshLayout refreshLayout) { 57 | super.setPullRefreshLayout(refreshLayout); 58 | refreshLayout.setMaxDistance(300); 59 | } 60 | List animators = new ArrayList<>(); 61 | 62 | @Override 63 | protected void onStateChange(int state) { 64 | this.state = state; 65 | for (Animator animator : animators) { 66 | animator.cancel(); 67 | } 68 | animators.clear(); 69 | stateImg.setVisibility(View.INVISIBLE); 70 | progress.setVisibility(View.VISIBLE); 71 | ViewHelper.setAlpha(progress, 1f); 72 | switch (state) { 73 | case NONE: 74 | break; 75 | case PULLING: 76 | break; 77 | case LOOSENT_O_REFRESH: 78 | break; 79 | case REFRESHING: 80 | animators.add(AnimUtil.startRotation(progress, ViewHelper.getRotation(progress) + 359.99f, 500, 0, -1)); 81 | break; 82 | case REFRESH_CLONE: 83 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 400, 200)); 84 | animators.add(AnimUtil.startHide(progress)); 85 | break; 86 | 87 | } 88 | 89 | } 90 | 91 | @Override 92 | public float getSpanHeight() { 93 | return loadBox.getHeight(); 94 | } 95 | 96 | @Override 97 | public int getLayoutType() { 98 | return layoutType; 99 | } 100 | 101 | @Override 102 | public boolean onScroll(float y) { 103 | boolean intercept = super.onScroll(y); 104 | if (!isLockState()) { 105 | ViewHelper.setRotation(progress, y * y * 48 / 31250); 106 | } 107 | return intercept; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/view/LockFooterView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.view; 2 | 3 | import android.content.Context; 4 | import android.graphics.Canvas; 5 | import android.graphics.Paint; 6 | import android.graphics.Path; 7 | import android.util.AttributeSet; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | 11 | import com.nineoldandroids.animation.Animator; 12 | import com.nineoldandroids.animation.ObjectAnimator; 13 | import com.nineoldandroids.view.ViewHelper; 14 | import com.ybao.pullrefreshview.layout.BaseFooterView; 15 | import com.ybao.pullrefreshview.layout.FlingLayout; 16 | import com.ybao.pullrefreshview.simple.R; 17 | import com.ybao.pullrefreshview.simple.utils.AnimUtil; 18 | import com.ybao.pullrefreshview.support.type.LayoutType; 19 | 20 | import java.util.ArrayList; 21 | import java.util.List; 22 | 23 | /** 24 | * Created by Ybao on 2015/11/3 0003. 25 | */ 26 | public class LockFooterView extends BaseFooterView { 27 | View progress; 28 | View stateImg; 29 | View loadBox; 30 | int width = 0; 31 | Path path; 32 | Paint paint; 33 | 34 | int state = NONE; 35 | 36 | int layoutType = LayoutType.LAYOUT_SCROLLER; 37 | 38 | public LockFooterView(Context context) { 39 | this(context, null); 40 | } 41 | 42 | public LockFooterView(Context context, AttributeSet attrs) { 43 | this(context, attrs, 0); 44 | } 45 | 46 | public LockFooterView(Context context, AttributeSet attrs, int defStyleAttr) { 47 | super(context, attrs, defStyleAttr); 48 | init(); 49 | } 50 | 51 | private void init() { 52 | LayoutInflater.from(getContext()).inflate(R.layout.view_footer_lock, this, true); 53 | progress = findViewById(R.id.progress); 54 | stateImg = findViewById(R.id.state); 55 | loadBox = findViewById(R.id.load_box); 56 | path = new Path(); 57 | paint = new Paint(); 58 | paint.setColor(0x8888ff00); 59 | paint.setAntiAlias(true); 60 | paint.setStyle(Paint.Style.FILL); 61 | } 62 | 63 | @Override 64 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 65 | super.onMeasure(widthMeasureSpec, 400); 66 | setMeasuredDimension(widthMeasureSpec, MeasureSpec.makeMeasureSpec(400, MeasureSpec.EXACTLY)); 67 | width = getWidth(); 68 | } 69 | 70 | @Override 71 | protected void dispatchDraw(Canvas canvas) { 72 | canvas.drawPath(path, paint); 73 | super.dispatchDraw(canvas); 74 | } 75 | 76 | List animators = new ArrayList<>(); 77 | @Override 78 | protected void onStateChange(int state) { 79 | this.state = state; 80 | for (Animator animator : animators) { 81 | animator.cancel(); 82 | } 83 | animators.clear(); 84 | stateImg.setVisibility(View.INVISIBLE); 85 | progress.setVisibility(View.INVISIBLE); 86 | ViewHelper.setAlpha(progress, 1f); 87 | switch (state) { 88 | case NONE: 89 | break; 90 | case PULLING: 91 | break; 92 | case LOOSENT_O_LOAD: 93 | break; 94 | case LOADING: 95 | animators.add(AnimUtil.startShow(progress, 0.1f, 200, 0)); 96 | animators.add(AnimUtil.startRotation(progress, ViewHelper.getRotation(progress) + 359.99f, 500, 0, -1)); 97 | break; 98 | case LOAD_CLONE: 99 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 400, 200)); 100 | animators.add(AnimUtil.startHide(progress)); 101 | break; 102 | 103 | } 104 | 105 | } 106 | 107 | @Override 108 | public float getSpanHeight() { 109 | return loadBox.getHeight(); 110 | } 111 | 112 | @Override 113 | public int getLayoutType() { 114 | return layoutType; 115 | } 116 | 117 | @Override 118 | public boolean onScroll(float y) { 119 | boolean intercept = super.onScroll(y); 120 | ViewHelper.setTranslationY(loadBox, 400 + 0.97f * y); 121 | if (!isLockState()) { 122 | ViewHelper.setRotation(progress, y * y * 48 / 31250); 123 | } 124 | path.reset();// 重置path 125 | if (y == 0) { 126 | invalidate(); 127 | return intercept; 128 | } 129 | // 贝赛尔曲线的起始点 130 | path.moveTo(0, 400); 131 | // 设置贝赛尔曲线的操作点以及终止点 132 | path.quadTo(width / 2, 400 + 1.94f * y, width, 400); 133 | invalidate(); 134 | return intercept; 135 | } 136 | } 137 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/view/LockHeaderView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.view; 2 | 3 | import android.content.Context; 4 | import android.graphics.Canvas; 5 | import android.graphics.Paint; 6 | import android.graphics.Path; 7 | import android.util.AttributeSet; 8 | import android.view.LayoutInflater; 9 | import android.view.View; 10 | 11 | import com.nineoldandroids.animation.Animator; 12 | import com.nineoldandroids.animation.ObjectAnimator; 13 | import com.nineoldandroids.view.ViewHelper; 14 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 15 | import com.ybao.pullrefreshview.layout.FlingLayout; 16 | import com.ybao.pullrefreshview.layout.PullRefreshLayout; 17 | import com.ybao.pullrefreshview.simple.R; 18 | import com.ybao.pullrefreshview.simple.utils.AnimUtil; 19 | import com.ybao.pullrefreshview.support.type.LayoutType; 20 | 21 | import java.util.ArrayList; 22 | import java.util.List; 23 | 24 | /** 25 | * Created by Ybao on 2015/11/3 0003. 26 | */ 27 | public class LockHeaderView extends BaseHeaderView { 28 | View progress; 29 | View stateImg; 30 | View loadBox; 31 | int width = 0; 32 | Path path; 33 | Paint paint; 34 | 35 | int state = NONE; 36 | 37 | int layoutType = LayoutType.LAYOUT_SCROLLER; 38 | 39 | public LockHeaderView(Context context) { 40 | this(context, null); 41 | } 42 | 43 | public LockHeaderView(Context context, AttributeSet attrs) { 44 | this(context, attrs, 0); 45 | } 46 | 47 | public LockHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { 48 | super(context, attrs, defStyleAttr); 49 | init(); 50 | } 51 | 52 | private void init() { 53 | LayoutInflater.from(getContext()).inflate(R.layout.view_header_lock, this, true); 54 | progress = findViewById(R.id.progress); 55 | stateImg = findViewById(R.id.state); 56 | loadBox = findViewById(R.id.load_box); 57 | path = new Path(); 58 | paint = new Paint(); 59 | paint.setColor(0x8888ff00); 60 | paint.setAntiAlias(true); 61 | paint.setStyle(Paint.Style.FILL); 62 | } 63 | 64 | @Override 65 | public void setPullRefreshLayout(PullRefreshLayout refreshLayout) { 66 | super.setPullRefreshLayout(refreshLayout); 67 | refreshLayout.setMaxDistance(400); 68 | } 69 | 70 | @Override 71 | protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 72 | super.onMeasure(widthMeasureSpec, 400); 73 | setMeasuredDimension(widthMeasureSpec, MeasureSpec.makeMeasureSpec(400, MeasureSpec.EXACTLY)); 74 | width = getWidth(); 75 | } 76 | 77 | 78 | @Override 79 | protected void dispatchDraw(Canvas canvas) { 80 | canvas.drawPath(path, paint); 81 | super.dispatchDraw(canvas); 82 | } 83 | 84 | List animators = new ArrayList<>(); 85 | 86 | @Override 87 | protected void onStateChange(int state) { 88 | this.state = state; 89 | for (Animator animator : animators) { 90 | animator.cancel(); 91 | } 92 | animators.clear(); 93 | stateImg.setVisibility(View.INVISIBLE); 94 | progress.setVisibility(View.INVISIBLE); 95 | ViewHelper.setAlpha(progress, 1f); 96 | switch (state) { 97 | case NONE: 98 | break; 99 | case PULLING: 100 | break; 101 | case LOOSENT_O_REFRESH: 102 | break; 103 | case REFRESHING: 104 | animators.add(AnimUtil.startShow(progress, 0.1f, 200, 0)); 105 | animators.add(AnimUtil.startRotation(progress, ViewHelper.getRotation(progress) + 359.99f, 500, 0, -1)); 106 | break; 107 | case REFRESH_CLONE: 108 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 400, 200)); 109 | animators.add(AnimUtil.startHide(progress)); 110 | break; 111 | 112 | } 113 | 114 | } 115 | 116 | @Override 117 | public float getSpanHeight() { 118 | return loadBox.getHeight(); 119 | } 120 | 121 | @Override 122 | public int getLayoutType() { 123 | return layoutType; 124 | } 125 | 126 | @Override 127 | public boolean onScroll(float y) { 128 | boolean intercept = super.onScroll(y); 129 | ViewHelper.setTranslationY(loadBox, 0.97f * y - loadBox.getHeight()); 130 | if (!isLockState()) { 131 | ViewHelper.setRotation(progress, y * y * 48 / 31250); 132 | } 133 | path.reset();// 重置path 134 | if (y == 0) { 135 | invalidate(); 136 | return intercept; 137 | } 138 | // 贝赛尔曲线的起始点 139 | path.moveTo(0, 0); 140 | // 设置贝赛尔曲线的操作点以及终止点 141 | path.quadTo(width / 2, 1.94f * y, width, 0); 142 | invalidate(); 143 | return intercept; 144 | } 145 | } 146 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/view/MiFliingLayout.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.view; 2 | 3 | import android.content.Context; 4 | import android.support.v4.view.ViewCompat; 5 | import android.util.AttributeSet; 6 | import android.view.View; 7 | 8 | import com.ybao.pullrefreshview.layout.FlingLayout; 9 | 10 | /** 11 | * Created by Ybao on 16/7/30. 12 | */ 13 | public class MiFliingLayout extends FlingLayout { 14 | public MiFliingLayout(Context context) { 15 | super(context); 16 | } 17 | 18 | public MiFliingLayout(Context context, AttributeSet attrs) { 19 | super(context, attrs); 20 | } 21 | 22 | public MiFliingLayout(Context context, AttributeSet attrs, int defStyle) { 23 | super(context, attrs, defStyle); 24 | } 25 | 26 | 27 | @Override 28 | protected boolean onScroll(float y) { 29 | View view = getPullable().getView(); 30 | int heigth = view.getMeasuredHeight(); 31 | if (y >= 0) { 32 | ViewCompat.setPivotY(view, 0); 33 | ViewCompat.setScaleY(view, (heigth + y) / heigth); 34 | } else { 35 | ViewCompat.setPivotY(view, heigth); 36 | ViewCompat.setScaleY(view, (heigth - y) / heigth); 37 | } 38 | return true; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/view/NormalFooterView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.animation.OvershootInterpolator; 8 | import android.widget.TextView; 9 | 10 | import com.nineoldandroids.animation.Animator; 11 | import com.nineoldandroids.view.ViewHelper; 12 | import com.ybao.pullrefreshview.layout.BaseFooterView; 13 | import com.ybao.pullrefreshview.simple.R; 14 | import com.ybao.pullrefreshview.simple.utils.AnimUtil; 15 | import com.ybao.pullrefreshview.support.type.LayoutType; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | /** 21 | * Created by Ybao on 2015/11/3 0003. 22 | */ 23 | public class NormalFooterView extends BaseFooterView { 24 | 25 | TextView textView; 26 | View tagImg; 27 | View progress; 28 | View stateImg; 29 | 30 | 31 | public NormalFooterView(Context context) { 32 | this(context, null); 33 | } 34 | 35 | public NormalFooterView(Context context, AttributeSet attrs) { 36 | this(context, attrs, 0); 37 | } 38 | 39 | public NormalFooterView(Context context, AttributeSet attrs, int defStyleAttr) { 40 | super(context, attrs, defStyleAttr); 41 | init(); 42 | } 43 | 44 | private void init() { 45 | LayoutInflater.from(getContext()).inflate(R.layout.view_footer_normal, this, true); 46 | textView = (TextView) findViewById(R.id.text); 47 | tagImg = findViewById(R.id.tag); 48 | progress = findViewById(R.id.progress); 49 | stateImg = findViewById(R.id.state); 50 | } 51 | 52 | 53 | List animators = new ArrayList<>(); 54 | @Override 55 | protected void onStateChange(int state) { 56 | for (Animator animator : animators) { 57 | animator.cancel(); 58 | } 59 | animators.clear(); 60 | stateImg.setVisibility(View.INVISIBLE); 61 | progress.setVisibility(View.INVISIBLE); 62 | textView.setVisibility(View.VISIBLE); 63 | tagImg.setVisibility(View.VISIBLE); 64 | ViewHelper.setAlpha(textView, 1); 65 | ViewHelper.setAlpha(tagImg, 1); 66 | switch (state) { 67 | case NONE: 68 | break; 69 | case PULLING: 70 | textView.setText("上拉加载更多"); 71 | animators.add(AnimUtil.startRotation(tagImg, 0)); 72 | break; 73 | case LOOSENT_O_LOAD: 74 | textView.setText("松开加载"); 75 | animators.add(AnimUtil.startRotation(tagImg, 180)); 76 | break; 77 | case LOADING: 78 | textView.setText("正在加载"); 79 | animators.add(AnimUtil.startShow(progress, 0.1f, 400, 200)); 80 | animators.add(AnimUtil.startHide(textView)); 81 | animators.add(AnimUtil.startHide(tagImg)); 82 | break; 83 | case LOAD_CLONE: 84 | animators.add(AnimUtil.startScale(stateImg, 0.3f, 1f, 500, 50, new OvershootInterpolator())); 85 | animators.add(AnimUtil.startShow(stateImg, 0.1f, 300, 150)); 86 | animators.add(AnimUtil.startHide(progress, 150, 0)); 87 | textView.setVisibility(View.INVISIBLE); 88 | tagImg.setVisibility(View.INVISIBLE); 89 | textView.setText("加载完成"); 90 | break; 91 | 92 | } 93 | 94 | } 95 | 96 | @Override 97 | public float getSpanHeight() { 98 | return getHeight(); 99 | } 100 | 101 | @Override 102 | public int getLayoutType() { 103 | return LayoutType.LAYOUT_NORMAL; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /simple/src/main/java/com/ybao/pullrefreshview/simple/view/NormalHeaderView.java: -------------------------------------------------------------------------------- 1 | package com.ybao.pullrefreshview.simple.view; 2 | 3 | import android.content.Context; 4 | import android.util.AttributeSet; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.widget.TextView; 8 | 9 | import com.nineoldandroids.animation.Animator; 10 | import com.nineoldandroids.view.ViewHelper; 11 | import com.ybao.pullrefreshview.layout.BaseHeaderView; 12 | import com.ybao.pullrefreshview.simple.R; 13 | import com.ybao.pullrefreshview.simple.utils.AnimUtil; 14 | import com.ybao.pullrefreshview.support.type.LayoutType; 15 | 16 | import java.util.ArrayList; 17 | import java.util.List; 18 | 19 | /** 20 | * Created by Ybao on 2015/11/3 0003. 21 | */ 22 | public class NormalHeaderView extends BaseHeaderView { 23 | TextView textView; 24 | View tagImg; 25 | View progress; 26 | View stateImg; 27 | 28 | 29 | public NormalHeaderView(Context context) { 30 | this(context, null); 31 | } 32 | 33 | public NormalHeaderView(Context context, AttributeSet attrs) { 34 | this(context, attrs, 0); 35 | } 36 | 37 | public NormalHeaderView(Context context, AttributeSet attrs, int defStyleAttr) { 38 | super(context, attrs, defStyleAttr); 39 | init(); 40 | } 41 | 42 | private void init() { 43 | LayoutInflater.from(getContext()).inflate(R.layout.view_header_normal, this, true); 44 | textView = (TextView) findViewById(R.id.text); 45 | tagImg = findViewById(R.id.tag); 46 | progress = findViewById(R.id.progress); 47 | stateImg = findViewById(R.id.state); 48 | } 49 | 50 | List animators = new ArrayList<>(); 51 | @Override 52 | protected void onStateChange(int state) { 53 | if (textView == null || tagImg == null || progress == null || stateImg == null) { 54 | return; 55 | } 56 | for (Animator animator : animators) { 57 | animator.cancel(); 58 | } 59 | animators.clear(); 60 | stateImg.setVisibility(View.INVISIBLE); 61 | progress.setVisibility(View.INVISIBLE); 62 | textView.setVisibility(View.VISIBLE); 63 | tagImg.setVisibility(View.VISIBLE); 64 | ViewHelper.setAlpha(textView, 1); 65 | ViewHelper.setAlpha(tagImg, 1); 66 | ViewHelper.setTranslationY(stateImg, 0); 67 | ViewHelper.setTranslationY(progress, 0); 68 | switch (state) { 69 | case NONE: 70 | break; 71 | case PULLING: 72 | textView.setText("下拉刷新"); 73 | animators.add(AnimUtil.startRotation(tagImg, 0)); 74 | break; 75 | case LOOSENT_O_REFRESH: 76 | textView.setText("松开刷新"); 77 | animators.add(AnimUtil.startRotation(tagImg, 180)); 78 | break; 79 | case REFRESHING: 80 | textView.setText("正在刷新"); 81 | animators.add(AnimUtil.startShow(progress, 0.1f, 400, 200)); 82 | animators.add(AnimUtil.startHide(textView)); 83 | animators.add(AnimUtil.startHide(tagImg)); 84 | break; 85 | case REFRESH_CLONE: 86 | animators.add(AnimUtil.startFromY(stateImg, -2 * stateImg.getHeight())); 87 | animators.add(AnimUtil.startToY(progress, 2 * progress.getHeight())); 88 | stateImg.setVisibility(View.VISIBLE); 89 | progress.setVisibility(View.VISIBLE); 90 | textView.setVisibility(View.INVISIBLE); 91 | tagImg.setVisibility(View.INVISIBLE); 92 | textView.setText("刷新完成"); 93 | break; 94 | 95 | } 96 | 97 | } 98 | 99 | @Override 100 | public float getSpanHeight() { 101 | return getHeight(); 102 | } 103 | 104 | 105 | @Override 106 | public int getLayoutType() { 107 | return LayoutType.LAYOUT_NORMAL; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /simple/src/main/res/anim/scale_in.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | -------------------------------------------------------------------------------- /simple/src/main/res/anim/scale_out.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 15 | -------------------------------------------------------------------------------- /simple/src/main/res/drawable/bottom_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | -------------------------------------------------------------------------------- /simple/src/main/res/drawable/progress_large_black.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /simple/src/main/res/drawable/progress_large_white.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /simple/src/main/res/drawable/top_shadow.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | -------------------------------------------------------------------------------- /simple/src/main/res/layout/activity_all_view.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 |