Android 自定义ScrollView的滑动监听事件
项目结构:
1.LazyScrollView类(自定义ScrollView)
package android.zhh.com.myapplicationscrollview; /**
* Created by sky on 2017/3/19.
*/ import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ScrollView; /**
* Created by sky on 2017/3/17.
*/
public class LazyScrollView extends ScrollView {
private static final long DELAY = 100; private int currentScroll; private Runnable scrollCheckTask; /**
* @param context
*/
public LazyScrollView(Context context) {
super(context);
init();
} /**
* @param context
* @param attrs
*/
public LazyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} /**
* @param context
* @param attrs
* @param defStyle
*/
public LazyScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} private void init() {
scrollCheckTask = new Runnable() {
@Override
public void run() {
int newScroll = getScrollY();
if (currentScroll == newScroll) {
if (onScrollListener != null) {
onScrollListener.onScrollStopped();
}
} else {
if (onScrollListener != null) {
onScrollListener.onScrolling();
}
currentScroll = getScrollY();
postDelayed(scrollCheckTask, DELAY);
}
}
};
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
currentScroll = getScrollY();
postDelayed(scrollCheckTask, DELAY);
}
return false;
}
});
} public interface OnScrollListener {
public void onScrollChanged(int x, int y, int oldX, int oldY); public void onScrollStopped(); public void onScrolling();
} private OnScrollListener onScrollListener; /**
* @param onScrollListener
*/
public void setOnScrollListener(OnScrollListener onScrollListener) {
this.onScrollListener = onScrollListener;
} @Override
protected void onScrollChanged(int x, int y, int oldX, int oldY) {
super.onScrollChanged(x, y, oldX, oldY);
if (onScrollListener != null) {
onScrollListener.onScrollChanged(x, y, oldX, oldY);
}
} /**
* @param child
* @return
*/
public boolean isChildVisible(View child) {
if (child == null) {
return false;
}
Rect scrollBounds = new Rect();
getHitRect(scrollBounds);
return child.getLocalVisibleRect(scrollBounds);
} /**
* @return
*/
public boolean isAtTop() {
return getScrollY() <= 0;
} /**
* @return
*/
public boolean isAtBottom() {
return getChildAt(getChildCount() - 1).getBottom() + getPaddingBottom() == getHeight() + getScrollY();
}
}
2.activity_main.xml(布局文件中引用)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.zhh.com.myapplicationscrollview.LazyScrollView
android:id="@+id/myScrollView"
android:layout_width="match_parent"
android:layout_height="match_parent"> <LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="match_parent"
android:layout_height="30dp"
android:text="我是zhujiabin"
android:gravity="center"
/> .......
</LinearLayout>
</android.zhh.com.myapplicationscrollview.LazyScrollView> </RelativeLayout> </LinearLayout>
3.MainActivity(调用监听事件)
package android.zhh.com.myapplicationscrollview; import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity {
// 初始化自定义的ScrollView
private LazyScrollView myScrollView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myScrollView = (LazyScrollView)findViewById(R.id.myScrollView);
// 自定义的ScrollView的滑动监听事件
myScrollView.setOnScrollListener(new LazyScrollView.OnScrollListener() {
@Override
public void onScrollChanged(int x, int y, int oldX, int oldY) {
Log.e("@", "x:" + oldX + "->" + x + ", y:" + oldY + "->" + y);
} @Override
public void onScrollStopped() {
if (myScrollView.isAtTop()) {
Toast.makeText(MainActivity.this, "Stopped at top", Toast.LENGTH_SHORT).show();
} else if (myScrollView.isAtBottom()) {
Toast.makeText(MainActivity.this, "Stopped at bottom", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Stopped", Toast.LENGTH_SHORT).show();
}
} @Override
public void onScrolling() {
Log.e("@", "scrolling...");
}
});
} }
Android 自定义ScrollView的滑动监听事件的更多相关文章
- Android开发入门——Button绑定监听事件三种方式
import android.app.Activity; import android.os.Bundle;import android.view.View;import android.widget ...
- swiper 使用参考 禁止手动滑动 监听事件
最外层容器加类名 swiper-no-swiping 监听切换事件 onTransitionEnd: function(swiper){ console.log('过渡结束'); }
- js监听事件 上滑消失下滑出现的效果 触摸与手势事件
https://www.w3cmm.com/javascript/touch.html //触摸与手势事件连接tinyscrollbar //方法1var _this = $('#fabu');var ...
- Android 自定义ScrollView ListView 体验各种纵向滑动的需求
分类: [android 进阶之路]2014-08-31 12:59 6190人阅读 评论(10) 收藏 举报 Android自定义ScrollView纵向拖动 转载请标明出处:http: ...
- Android——监听事件总结
各种监听事件 1.按钮 Button(1)点击监听 btn_1.setOnClickListener(new View.OnClickListener() { (2)长按监听 btn_1.setOnL ...
- 横向滑动的listview和其中用到的触摸监听事件详解
一.首先把横向的listview的代码放上来 HorizontalListView: package com.common.cklibrary.utils.myview; import java.ut ...
- UI设计篇·入门篇·简单动画的实现,透明动画/旋转动画/移动动画/缩放动画,混合动画效果的实现,为动画设置监听事件,自定义动画的方法
基本的动画构成共有四种:透明动画/旋转动画/移动动画/缩放动画. 配置动画的方式有两种,一种是直接使用代码来配置动画效果,另一种是使用xml文档配置动画效果 相比而言,用xml文档写出来的动画效果,写 ...
- [Android]Fragment自定义动画、动画监听以及兼容性包使用
Fragment是Android在API 11之后加入的一个组件,对提高Android开发中的布局合理性和布局效率都有很大作用,尤其是在Android平板等大屏幕设备的开发中,Fragment的引入能 ...
- Android中Button的五种监听事件
简单聊一下Android中Button的五种监听事件: 1.在布局文件中为button添加onClick属性,Activity实现其方法2.匿名内部类作为事件监听器类3.内部类作为监听器4.Activ ...
随机推荐
- tomcat 使用常见问题
tomcat 下目录的介绍: 参考地址: http://blog.csdn.net/u013132035/article/details/54949593 参考书籍:tomcat权威指南 (1) 非w ...
- salt-master迁移
1.在迁移到的目标机器上先安装salt-master 2.把原master机器上的/etc/salt/pki目录打包发送到迁移的机器上的同等目录下面 3.在原master机器上批量修改minion的配 ...
- js 或运算
表达式a && 表达式b : 计算表达式a(也可以是函数)的运算结果, 如果为 True, 执行表达式b(或函数),并返回b的结果: 如果为 False,返回a的结果: 表达式a || ...
- UWP 利用DataGrid控件创建表格
通过 Nuget 搜索 Microsoft.Toolkit.Uwp.UI.Controls.DataGrid 安装库,在XAML文件中添加引用库 xmlns:controls="using: ...
- Oracle下rman备份和还原到数据库任意一个时间点
Rman备份为物理备份,启用rman备份必须开启数据库归档,开启归档后相当于给数据库加了一层双保险.Rman备份主要备份数据库的数据文件,控制文件,归档日志. RMAN 备份 一. 检查数据库是否启用 ...
- IOS - 零碎
---恢复内容开始--- 1.模拟器目录: ProjectNameApk.documents.library(cache.preference.cookies).temp 2.Edit-Refacto ...
- django rest-farme-work 的使用(3)
请求和响应 Requests and Responses 从这一片来说,我们将真正开始覆盖REST框架的核心.我们来介绍一些基本的构建块 Request objects REST框架引入了一个Requ ...
- preload、prefetch的认识
预加载 现在的网络情况虽然很乐观,但是 defer和async 当浏览器碰到 script 脚本的时候: <script src="script.js"></sc ...
- 【Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) C】
[链接] 我是链接,点我呀:) [题意] 给你一个字符串s. 让你在其中的某一些位置进行操作.. 把[1..i]和[i+1..n]翻转. 使得里面01交替出现的那种子串的长度最长. [题解] 可以用a ...
- [置顶]
QQ空间技术架构之深刻揭密
QQ空间作为腾讯海量互联网服务产品,经过近七年的发展,实现了从十万级到亿级同时在线的飞跃.在这个过程中,QQ空间团队遇到了哪些技术挑战?其站点前后台架构随着业务规模的变化又进行了怎样的演进与变迁?成长 ...