给ScrollView添加阻尼,但是给ListView怎么添加阻尼?

    在做项目的时候,根据客户需求,在一个很长的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);
		}

	}


还请高人解答?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值