├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── overscroll │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── asset │ │ └── a.txt │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── overscroll │ │ │ ├── GridActivity.java │ │ │ ├── ListViewActivity.java │ │ │ ├── MainActivity.java │ │ │ ├── ScrollViewActivity.java │ │ │ └── adapter │ │ │ └── MyAdapter.java │ └── res │ │ ├── layout │ │ ├── content_main.xml │ │ ├── grid_activity.xml │ │ ├── list_activity.xml │ │ ├── list_item.xml │ │ └── scrollview_layout.xml │ │ ├── menu │ │ └── menu_main.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-v21 │ │ └── styles.xml │ │ ├── values-w820dp │ │ └── dimens.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── example │ └── overscroll │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── overscrolllib ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── overscrolllib │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── overscrolllib │ │ │ ├── AbsListViewOverScrollHelper.java │ │ │ ├── OnOverScrollListener.java │ │ │ ├── OverScrollGridView.java │ │ │ ├── OverScrollHelper.java │ │ │ ├── OverScrollListView.java │ │ │ ├── OverScrollView.java │ │ │ └── ScrollViewOverScrollHelper.java │ └── res │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── example │ └── overscrolllib │ └── ExampleUnitTest.java └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | /.idea/workspace.xml 4 | /.idea/libraries 5 | .DS_Store 6 | /build 7 | /captures 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # overscroll 2 | 类似qq效果的在view滚动到顶部或者底部后可以超出屏幕继续滚动的view,包括Listview,GridView 和ScrollView。可扩展性强,只需要继承OverScrollHeler类即可! 3 | 4 | 推荐使用OverScrollLayout:https://github.com/wcy10586/OverscrollLayout 5 | OverScrollLayout 功能更全面,扩展性更好 6 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 22 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.example.overscroll" 9 | minSdkVersion 21 10 | targetSdkVersion 22 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(include: ['*.jar'], dir: 'libs') 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:22.2.1' 26 | compile 'com.android.support:design:22.2.1' 27 | compile project(':overscrolllib') 28 | } 29 | -------------------------------------------------------------------------------- /app/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 E:\android_sdk/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 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/example/overscroll/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.example.overscroll; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/asset/a.txt: -------------------------------------------------------------------------------- 1 | 在的低剂量辐射导致罹患癌症、智力不足、神经系统疾病和遗传突变的人口逐年增加。 2 | ——白俄罗斯百科全书 3 | 一九八六年四月二十九日,波兰、德国、奥地利和罗马尼亚都检测到高剂量辐射。四月三十日,瑞士和意大利北部,五月一日、二日,法国、比利时、荷兰、英国和希腊北部,五月三日,以色列、科威特和土耳其,也陆续检测到辐射。辐射粒子飘散到全球:五月二日,日本,五月五日,印度,五月五日、六日,美国和加拿大,都陆续检测到辐射。不到一个星期,切尔诺贝利就成为全世界的问题。 4 | ——《切尔诺贝利灾变的影响》,明斯克,萨哈罗夫国际辐射生态学学院 5 | 目前用石棺封住的四号反应炉炉心,仍有大约二十吨核燃料,没有人知道里面的情况究竟如何... 6 | 我们是空气,我们不是土地…… 7 | ——马马达舒维利 8 | 我不知道该说什么,关于死亡还是爱情?也许两者是一样的,我该讲哪一种? 9 | 我们才刚结婚,连到商店买东西都还会牵手。我告诉他:“我爱你。”但当时我不知道自己有多爱他,我不知道……我们住在消防局的二楼宿舍,和三对年轻夫妇共享一间厨房,红色的消防车就停在一楼。那是他的工作,我向来知道他发生了什么事——他人在哪里,他好不好。 10 | 那天晚上我听到声响,探头望向窗外。他看到我就说:“把窗户关上,回去睡觉。反应炉失火了,我马上回来。” 11 | 我没有亲眼看到爆炸,只看到火焰。所有东西都在发亮。火光冲天,烟雾弥漫,热气逼人。他一直没回来。 12 | 屋顶的沥青燃烧,产生烟雾。他后来说,感... 13 | 可是我怎么能离开他?他说:“快走!离开这里!你要保护宝宝。” 14 | “我先帮你买牛奶,再决定怎么做。” 15 | 这时我的朋友唐雅·克比诺克和她爸爸跑了进来,她的丈夫也在同一间病房。我们跳上她爸爸的车,开到大约三公里外的镇上,买了六瓶三升的牛奶给大家喝。但是他们喝了之后就开始呕吐,频频失去知觉。医生只好帮他们打点滴。医生说他们是瓦斯中毒,没人提到和辐射有关的事。 16 | 没多久,整座城市就被军车淹没,所有道路封闭,电车火车停驶,军人用白色粉末清洗街道。我很担心第二天怎么出城买新鲜牛奶。没人提到辐射的事,只有军人戴着口罩。城里人依旧到店里买面包,提着袋口敞开的面包在街上走,还有人吃放在盘子上的纸杯蛋糕。 17 | 那天晚上我进不... -------------------------------------------------------------------------------- /app/src/main/java/com/example/overscroll/GridActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.overscroll; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | import android.os.PersistableBundle; 6 | import android.support.v7.app.AppCompatActivity; 7 | 8 | import com.example.overscroll.adapter.MyAdapter; 9 | import com.example.overscrolllib.OverScrollGridView; 10 | 11 | /** 12 | * Created by changyou on 2016/3/1. 13 | */ 14 | public class GridActivity extends AppCompatActivity { 15 | 16 | @Override 17 | protected void onCreate(Bundle savedInstanceState) { 18 | super.onCreate(savedInstanceState); 19 | setContentView(R.layout.grid_activity); 20 | OverScrollGridView gridView = (OverScrollGridView) findViewById(R.id.grid_view); 21 | MyAdapter adapter = new MyAdapter(this, 10); 22 | gridView.setAdapter(adapter); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/overscroll/ListViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.overscroll; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.view.Menu; 6 | 7 | import com.example.overscroll.adapter.MyAdapter; 8 | import com.example.overscrolllib.OverScrollListView; 9 | 10 | /** 11 | * Created by changyou on 2016/3/1. 12 | */ 13 | public class ListViewActivity extends AppCompatActivity { 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.list_activity); 19 | OverScrollListView listView = (OverScrollListView) findViewById(R.id.list_view); 20 | MyAdapter adapter = new MyAdapter(this, 3); 21 | listView.setAdapter(adapter); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/overscroll/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.overscroll; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | import android.support.design.widget.FloatingActionButton; 6 | import android.support.design.widget.Snackbar; 7 | import android.support.v7.app.AppCompatActivity; 8 | import android.support.v7.widget.Toolbar; 9 | import android.view.View; 10 | import android.view.Menu; 11 | import android.view.MenuItem; 12 | 13 | public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 14 | 15 | @Override 16 | protected void onCreate(Bundle savedInstanceState) { 17 | super.onCreate(savedInstanceState); 18 | setContentView(R.layout.content_main); 19 | findViewById(R.id.list_view).setOnClickListener(this); 20 | findViewById(R.id.grid_view).setOnClickListener(this); 21 | findViewById(R.id.scroll_view).setOnClickListener(this); 22 | } 23 | 24 | @Override 25 | public void onClick(View v) { 26 | Intent intent = new Intent(); 27 | switch (v.getId()){ 28 | case R.id.list_view: 29 | intent.setClass(this,ListViewActivity.class); 30 | break; 31 | case R.id.grid_view: 32 | intent.setClass(this,GridActivity.class); 33 | break; 34 | case R.id.scroll_view: 35 | intent.setClass(this,ScrollViewActivity.class); 36 | break; 37 | } 38 | startActivity(intent); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/overscroll/ScrollViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.overscroll; 2 | 3 | import android.os.Bundle; 4 | import android.support.v7.app.AppCompatActivity; 5 | import android.widget.TextView; 6 | 7 | /** 8 | * Created by changyou on 2016/3/1. 9 | */ 10 | public class ScrollViewActivity extends AppCompatActivity { 11 | String str = "在的低剂量辐射导致罹患癌症、智力不足、神经系统疾病和遗传突变的人口逐年增加。\n" + 12 | "——白俄罗斯百科全书\n" + 13 | "一九八六年四月二十九日,波兰、德国、奥地利和罗马尼亚都检测到高剂量辐射。四月三十日,瑞士和意大利北部,五月一日、二日,法国、比利时、荷兰、英国和希腊北部,五月三日,以色列、科威特和土耳其,也陆续检测到辐射。辐射粒子飘散到全球:五月二日,日本,五月五日,印度,五月五日、六日,美国和加拿大,都陆续检测到辐射。不到一个星期,切尔诺贝利就成为全世界的问题。\n" + 14 | "——《切尔诺贝利灾变的影响》,明斯克,萨哈罗夫国际辐射生态学学院\n" + 15 | "目前用石棺封住的四号反应炉炉心,仍有大约二十吨核燃料,没有人知道里面的情况究竟如何...\n" + 16 | "我们是空气,我们不是土地……\n" + 17 | "——马马达舒维利\n" + 18 | "我不知道该说什么,关于死亡还是爱情?也许两者是一样的,我该讲哪一种?\n" + 19 | "我们才刚结婚,连到商店买东西都还会牵手。我告诉他:“我爱你。”但当时我不知道自己有多爱他,我不知道……我们住在消防局的二楼宿舍,和三对年轻夫妇共享一间厨房,红色的消防车就停在一楼。那是他的工作,我向来知道他发生了什么事——他人在哪里,他好不好。\n" + 20 | "那天晚上我听到声响,探头望向窗外。他看到我就说:“把窗户关上,回去睡觉。反应炉失火了,我马上回来。”\n" + 21 | "我没有亲眼看到爆炸,只看到火焰。所有东西都在发亮。火光冲天,烟雾弥漫,热气逼人。他一直没回来。\n" + 22 | "屋顶的沥青燃烧,产生烟雾。他后来说,感...\n" + 23 | "可是我怎么能离开他?他说:“快走!离开这里!你要保护宝宝。”\n" + 24 | "“我先帮你买牛奶,再决定怎么做。”\n" + 25 | "这时我的朋友唐雅·克比诺克和她爸爸跑了进来,她的丈夫也在同一间病房。我们跳上她爸爸的车,开到大约三公里外的镇上,买了六瓶三升的牛奶给大家喝。但是他们喝了之后就开始呕吐,频频失去知觉。医生只好帮他们打点滴。医生说他们是瓦斯中毒,没人提到和辐射有关的事。\n" + 26 | "没多久,整座城市就被军车淹没,所有道路封闭,电车火车停驶,军人用白色粉末清洗街道。我很担心第二天怎么出城买新鲜牛奶。没人提到辐射的事,只有军人戴着口罩。城里人依旧到店里买面包,提着袋口敞开的面包在街上走,还有人吃放在盘子上的纸杯蛋糕。\n" + 27 | "那天晚上我进不..."; 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.scrollview_layout); 32 | TextView t = (TextView)findViewById(R.id.text); 33 | t.setText(str); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/example/overscroll/adapter/MyAdapter.java: -------------------------------------------------------------------------------- 1 | package com.example.overscroll.adapter; 2 | 3 | import android.content.Context; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | import android.widget.BaseAdapter; 8 | 9 | import com.example.overscroll.R; 10 | 11 | /** 12 | * Created by changyou on 2016/3/1. 13 | */ 14 | public class MyAdapter extends BaseAdapter { 15 | private int size; 16 | private Context context; 17 | 18 | public MyAdapter(Context context, int size) { 19 | this.context = context; 20 | this.size = size; 21 | } 22 | 23 | @Override 24 | public int getCount() { 25 | return size; 26 | } 27 | 28 | @Override 29 | public Object getItem(int position) { 30 | return size; 31 | } 32 | 33 | @Override 34 | public long getItemId(int position) { 35 | return position; 36 | } 37 | 38 | @Override 39 | public View getView(int position, View convertView, ViewGroup parent) { 40 | if (convertView == null) { 41 | convertView = LayoutInflater.from(context).inflate(R.layout.list_item, null); 42 | } 43 | return convertView; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/res/layout/content_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |