滚动方法:
目前知道滚动有两种方法
第一种为根据触摸事件发生滚动:
即在View里面运用
public boolean dispatchTouchEvent(MotionEvent ev) 这个方法来分发触摸事件;然后根据
public boolean onTouchEvent(MotionEvent ev) 方法来实现事件的动作;
这个dispatchTouchEvent 与onTouchEvent有什么关系呢;那么这里就还需要在谈到一个方法为onInterceptTouchEvent;
即一个触摸事件来到就会先到最上面的一层View里的dispatchTouchEvent方法,如果此方法返回True;就交给这个View里的OntouchEvent方法来执行;如果返回False就交给OnInterceptTouchEvent方法来执行;如果OnIntercept这个方法返回True;又交给本View的OntouchEvent方法执行;如果返回False;就交给子View的dispatchTouchEvent方法执行;。。。。又到子View的OnTouchEvnet方法;如果这个方法返回True;则执行完毕;如果返回False;则又找父View的OnTouchEvent方法执行;如果还不懂请参照这个大神的网址:http://mobile.51cto.com/abased-374715.htm;
两个事件的方法:
public boolean dispatchTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
// 假如scroller滚动还没有结束,我们直接返回
if (!scroller.isFinished()) {
return super.dispatchTouchEvent(ev);
}
downx = (int) ev.getX();
downy = (int) ev.getY();
mPosition = pointToPosition(downx, downy);
int firstposition = getFirstVisiblePosition();
itemview = getChildAt(mPosition - firstposition);
break;
case MotionEvent.ACTION_MOVE:
int movex = (int) ev.getX();
int movey = (int) ev.getY();
detailx = movex - downx;
int detaily = movey - downy;
downx = movex;
downy = movey;
//System.out.println(detaily);
if (Math.abs(detailx) > mTouchSlop && Math.abs(detaily) < mTouchSlop) {
isSlide = true;
}
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
int action = ev.getAction();
if (isSlide) {
addVelocityTracker(ev);
switch (action) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
itemview .scrollBy(-detailx, 0);
break;
case MotionEvent.ACTION_UP:
scrollByDistanceX();
isSlide = false;
break;
default:
break;
}
}
return super.onTouchEvent(ev);
}
这是两个例子方法;
第二种滚动方法是通过Scroller这个类来实现 : 引自 http://blog.youkuaiyun.com/xiaanming/article/details/17483273
大致原理为:Scroller.start(原X位置,原Y位置,需要移动的X位置距离,Y位置距离,持续时间);
postInvalidate();;重画
继承computeScroll(); 方法
在computeScroll()方法里循环如:
@Override
public void computeScroll() {
while(scroller.computeScrollOffset()) {
int scrox = scroller.getCurrX();
int scroy = scroller.getCurrY();
itemview.scrollTo(scrox,scroller.getCurrY());
// System.out.println(scroller.getCurrX() + "-----" +scroller.getCurrY());
postInvalidate();
if (scroller.isFinished()) {
// itemview.scrollTo(0, 0);
removeItemListener.remvoeItenListener(mPosition);
}
}
}
求大神指导这里
scroller.startScroll(itemview.getScrollX(), 0, -delta, 0,
1000);
postInvalidate();
我运用了这个Start方法,然后又用上面的循环代码;我的ItemView不是持续运动;而是等 1后,ItemView在直接到最后,也就是没有中间的运动过程?????
然后在说一个设置接口问题
在类里写一个内部接口:
如:public interface RemoveItemListener{
public void remvoeItenListener(int potition);
}
在到此类里写一个成员变量
private RemoveItemListene removeItemListener;
在实现一个方法 :setOnRemoveItemListerer( RemoveItemListener listener ) {
this.removeItemListerner = listener;
}
最后在类里需要Remove的地方 运用这个方法就行:remvoeItenListener(int potition);