android 滚动与设置接口方法

来源:互联网 发布:淘宝上找不到的衣服 编辑:程序博客网 时间:2024/05/22 08:02

滚动方法:

目前知道滚动有两种方法

  第一种为根据触摸事件发生滚动:

    即在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.csdn.net/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);


0 0
原创粉丝点击