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 ...
随机推荐
- a better git log
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d ...
- WCF - NetCtP 双工错误列表
1. 在服务 Transfer 实现的协定列表中找不到协定名称 "IMetadataExchange" 将 ServiceMetadataBehavior 添加到配置文件或直接添加 ...
- 生物信息之ME, HMM, MEMM, CRF
原文链接:http://bbs.sciencenet.cn/home.php?mod=space&uid=260809&do=blog&id=573755 注:有少量修改!如有 ...
- SaltStact自动化运维工具02
Grains基础:• Grains是saltstack最重要的组件之一• 存储minion端的基本信息,这些信息一般都是静态的,如CPU.内核.操作系统等• Grains存储在minion本地• 管 ...
- BZOJ 1305: [CQOI2009]dance跳舞 网络最大流_二分答案_建模
Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会 ...
- nyoj48-小明的调查作业
48-小明的调查作业 内存限制:64MB时间限制:1000msSpecial Judge: No accepted:3submit:4 题目描述: 小明的老师布置了一份调查作业,小明想在学校中请一些同 ...
- STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)
一.非DMA模式(转) 说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/arti ...
- mysql修改配置文件
在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量!同 ...
- UVA10200 Prime Time
/* UVA10200 Prime Time https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...
- hdu 1868 水
#include<stdio.h> int main() { int n,m,i,j,k; while(scanf("%d",&n)!=EOF) { k=2; ...