在做项目的时候,根据客户需求,在一个很长的ScrollView中,他滑动,一下就滑动了很多,他想让这个ScrollView慢一点滑动,就提出了添加阻尼的说法。
虽然不是我研究出来的,但是我也同样的去研究了ListView添加阻尼,没研究明白,ListView和ScrollView一起用还要出现不少问题,让我也没弄清楚,如果有高手可以给解答一下。
下面说一下怎么去实现ScrollView:
package com.text.ui.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;
/**
* 快/慢滑动ScrollView
*
*/
public class SlowScrollView extends ScrollView {
public SlowScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public SlowScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SlowScrollView(Context context) {
super(context);
}
@Override
public void fling(int velocityY) {
super.fling(velocityY / 4);
}
}
自己定义一个ScrollView的类,重写fling方法,实现父类方法的时候,让velocityY增减幅度变为原来想要变慢,或者加快的倍数,即可,阻尼就加上了。
我也试图着用Listview,一个方法也是使用listview的方法重写,能改变增减幅度的方法:(不知道怎么效果不好?)
package com.test.ui.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ListView;
import android.widget.Scroller;
/**
*
*
* @author over1
*
*/
public class SerarchListView extends ListView {
public mScroller mscroller;
private Context context;
public class mScroller extends Scroller {
public mScroller(Context context) {
super(context);
}
@Override
public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) {
// TODO Auto-generated method stub
super.fling(startX, startY, velocityX, velocityY / 4, minX, maxX, minY, maxY);
}
}
public SerarchListView(Context context) {
super(context);
this.context = context;
}
public SerarchListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SerarchListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void onScrollChanged(int l, int t, int oldl, int oldt) {
// TODO Auto-generated method stub
super.scrollBy(l, t);
super.scrollTo(((oldl - l) / 10 + l), ((oldt - t) / 10 + t));
super.onScrollChanged(l, t, ((oldl - l) / 10 + l), ((oldt - t) / 10 + t));
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int act = ev.getAction();
if (act == MotionEvent.ACTION_UP || act == MotionEvent.ACTION_CANCEL) {
//scroll back
}
// mscroller = new mScroller(context);
// if (mscroller.computeScrollOffset()) {
// scrollTo(mscroller.getCurrX(), mscroller.getCurrY() + (mscroller.getFinalY() - mscroller.getCurrY()) / 4);
// postInvalidate();
// }
return super.onTouchEvent(ev);
}
}
想的另一个方法也是给这个listview的对象加监听:(使用一个Layout)
mscroller = new mScroller(this);
lay = (LinearLayout) findViewById(R.id.listslow);
lay = new LinearLayout(this) {
@Override
public void addView(View child) {
// TODO Auto-generated method stub
LinearLayout lay1 = (LinearLayout) findViewById(R.id.listslow);
super.addView(lay1);
}
@Override
public void computeScroll() {
scrollTo(mscroller.getCurrX(), mscroller.getCurrY() + (mscroller.getFinalY() - mscroller.getCurrY())
/ 100);
}
};
// mListView.setOnScrollListener(new ListView.OnScrollListener() {
//
// @Override
// public void onScrollStateChanged(AbsListView paramAbsListView, int paramInt) {
// //当屏幕停止滚动时为0;当屏幕滚动且用户使用的触碰或手指还在屏幕上时为1;
// //由于用户的操作,屏幕产生惯性滑动时为2
// switch (paramInt) {
// case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
// //mBusy = false;
// break;
// case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
// //mBusy = true;
// break;
// case AbsListView.OnScrollListener.SCROLL_STATE_FLING:
// //mBusy = true;
// this.onScroll(paramAbsListView, mListView.getLastVisiblePosition(), (mListView
// .getLastVisiblePosition() - mListView.getFirstVisiblePosition())
// + mListView.getLastVisiblePosition(), mListView.getCount());
// break;
// }
// }
//
// @Override
// public void onScroll(AbsListView paramAbsListView, int firstVisibleItem, int visibleItemCount,
// int totalItemCount) {
//
// }
// });
load();
}
public class mScroller extends Scroller {
public mScroller(Context context) {
super(context);
}
@Override
public void fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY) {
// TODO Auto-generated method stub
super.fling(startX, startY, velocityX, velocityY / 4, minX, maxX, minY, maxY);
}
}
还请高人解答?