android滚动事件
‘壹’ android listview 为什么会自动触发滚动事件 我还没滚动事件就触发了
是不是你的ListView里数据改变了,你不动是不会出发滚动事件的
‘贰’ android的touch事件怎么获取滚动距离
可以设置ListView的滚动事件
ListView.setOnScrollListener(OnScrollListener listener)
OnScrollListener是滚动事件监听接口
有两个需要实现的方法
public void onScrollStateChanged(AbsListView view, int scrollState) ;
public void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) ;
几个参数的意义分别为
AbsListView view所监听的listview对象
int firstVisibleItem能看见的第一个item的位置
int visibleItemCount能看见的item的数量
int totalItemCount所有item的总数
代码如下,我们在onScroll中进行判断
lvMatch.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(firstVisibleItem == 0){
//已滚动到最顶部
}
if(firstVisibleItem+visibleItemCount == totalItemCount){
//滚动到底部
}
}
});
‘叁’ android 的ListView中,如何判断其内容已滚动到最顶部或者最底部
是通过ListView的OnScrollListener事件中判断的。当listView滚动的时候就会回调OnScrollListener方法。
以下为示例代码(完整代码查看附件):
得到lisView实例
ListViewlistView = (ListView) findViewById(R.id.listview);
2.给ListView注册OnScrollListener事件
listView.setOnScrollListener(new OnScrollListenerImple());
3.实现OnScrollListener 接口,处理事件。
private class OnScrollListenerImple implements OnScrollListener {
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//如果当前列表的数量等于查询的总数量,则不做任何操作
if(mSimpleAdapter.getCount() >= page.getRowCount()){
return;
}
if (view.getLastVisiblePosition() == (totalItemCount - 1)) { //判断是否滑动到最底部
//已经滑动最底部了。
}
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
}
‘肆’ android 模拟滑动事件,用代码实现
用这个包java.awt.Robot
mouseMove()方法
当前位置点击后 调mouseMove() 到目标位置 不就相当于滑动么
‘伍’ 如何解决Android中WebView上下滑动事件
getScrollY()方法返回的是当前可见区域的顶端距整个页面顶端的距离,也就是当前内容滚动的距离。
getHeight()或者getBottom()方法都返回当前webview这个容器的高度
getContentHeight返回的是整个html的高度,但并不等同于当前整个页面的高度,因为webview有缩放功能,所以当前整个页面的高度实际上应该是原始html的高度再乘上缩放比例。
因此,更正后的结果,准确的判断方法应该是:
if(webview.getContentHeight*webview.getScale() -(webvi ew.getHeight()+webview.getScrollY())){
//已经chǔ于底端
}
‘陆’ workspace android 怎么去掉滑动事件
Launcher桌面的一大功能就是支持左右滑动,这样的功能在现在的应用中使用非常广泛,并且有很多实现的方式,可以通过使用Fragment来实现也可以通过自定义的控件来实现。
Launcher采用了后者,这一功能的实现在Workspace来完成。首先来看一下Workspace的继承关系:
从图中可以看出Workspace是PagedView的子类,而实际上滑动功能的实现是在PagedView中实现的。在Launcher中,Workspace中有五个CellLayout,分别代表五个分屏。
当左右拖动CellLayout时,就能实现滑动的效果。但实际上CellLayout中还有其他的子View,PagedView是如何避免了来自子View的干扰的呢?这里就需要讨论另一个问题,Android对touch事件的拦截制度。而拦截发生在ViewGroup的onInterceptTouchEvent()和onTouchEvent()以及View的onTouchEvent中。当发生touch事件时,系统会产生一个MotionEvent并且沿着View Tree开始传递。首先获取MotionEvent是View Tree的根节点,根节点通常是一个ViewGroup,ViewGroup将在onInterceptTouchEvent()中获取MotionEvent并决定是否继续向下传递。当在ViewGroup.onInterceptEvent()中返回true时,将截获MotionEvent,View Tree下面的View将无法获得MotionEvent,转而交给当前ViewGroup的onTouchEvent()方法。如果onTouchEvent中返回false,那么MotionEvent将沿着View Tree向上传给上一层。拦截的过程草图如下:
有了touch事件的拦截机制之后,View tree中的各个层之间的分工也就更加明确了。在Launcher的View tree中,从上到下的主要的节点有,DragLayer,Workspace,CellLayout。DragLayer层的主要任务是负责对图标和AppWidget进行拖拽,Workspace则主要负责左右滑动,CellLayout则用于容纳各种桌面的快捷方式。大概的分工如下:
那么现在就进入PagedView中去了解实现的过程吧。
滑动功能主要分两步:1、在onInterceptTouchEvent中进行拦截。2、在onTouchEvent中进行滑动。
1,onInterceptTouchEvent(MotionEvent en)
在这个方法中,决定了什么时候截获MotionEvent来实现滑动,避免了子View的其他事件的影响(如点击事件)。
[java] view plain
public boolean onInterceptTouchEvent(MotionEvent ev) {
/**
* This method JUST determines whether we want to intercept the motion.
* If we return true, onTouchEvent will be called and we do the actual
* scrolling there.
**/
//获取速度跟踪器,记录各个时刻的速度。并且添加当前的MotionEvent以记录更行速度值。
(ev);
......
/**
* Shortcut the most recurring case: the user is in the dragging
* state and he is moving his finger. We want to intercept this
* motion.
* 最常见的需要拦截的情况:用户已经进入滑动状态,并且正在滑动手指。
* 对这种情况直接进行拦截,执行onTouchEvent()继续执行滑动操作。
**/
final int action = ev.getAction();
if ((action == MotionEvent.ACTION_MOVE) &&
(mTouchState == TOUCH_STATE_SCROLLING)) {
return true;
}
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_MOVE: {
/**
* mIsBeingDragged == false, otherwise the shortcut would have caught it. Check
* whether the user has moved far enough from his original down touch.
*/
/**
* 当在这里接受到ACTION_MOVE时,说明mTouchState!=TOUCH_STATE_SCROLLING并且mIsBeingDragged的值应该为false,
* 否则DragLayer就应该截获了MotionEvent用于实现拖拽。
* 此时还没有进入滑动状态,当mActivePointerId == INVALID_POINTER时,也就是在此之前没有接收到任何touch事件。
* 这种情况发生在Workspace变小时,也就是之前Workspace处于SPRING_LOADED状态。当出现这种情况时直接把当前的事件当作ACTION_DOWN进行处理。
* 反之,则通过determineScrollingStart()尝试能够进入滑动状态。
*/
if (mActivePointerId != INVALID_POINTER) {
determineScrollingStart(ev);
break;
}
// if mActivePointerId is INVALID_POINTER, then we must have missed an ACTION_DOWN
// event. in that case, treat the first occurence of a move event as a ACTION_DOWN
// i.e. fall through to the next case (don't break)
// (We sometimes miss ACTION_DOWN events in Workspace because it ignores all events
// while it's small- this was causing a crash before we checked for INVALID_POINTER)
}
case MotionEvent.ACTION_DOWN: {
final float x = ev.getX();
final float y = ev.getY();
// Remembe