您的位置:首页 > 移动开发 > Android开发

在android4.1及之后版本如何恢复ListView/GridView下拉空白回弹的效果

2016-07-25 17:17 309 查看

在android4.1及之后版本如何恢复ListView/GridView下拉空白回弹的效果

[DESCRIPTION]

Android 4.0及以前的版本,MTK有在Google默认模糊边缘的基础上,做了一个下拉回弹的效果:在ListView和GridView等列表控件的界面上,当滑动画面到顶部或底部时,屏幕上方或下方处会有一个很长的空的区域,松手以后列表会自动弹回。但是android4.1及之后版本无此效果,因为这个效果会引起CTS
test fail!

如果不需要通过CTS测试,请问如何恢复ListView/GridView下拉空白回弹的效果?

效果图:



5.12tp-32.png (48.78 KB, 下载次数: 0 )

下载附件  保存到相册

2016-5-12 16:21 上传

[SOLUTION]

1.请修改alps/frameworks/base/core/JAVA/android/view/ViewConfiguration.java

修改如下两个变量:

/**

* Max distance to overscroll for edge effects

*/

private static final int OVERSCROLL_DISTANCE = 240; //将0改为240

/**

* Max distance to overfling for edge effects

*/

private static final int OVERFLING_DISTANCE = 240; //将6改为240

2.请修改alps/frameworks/base/core/java/android/widget/AbsListView.java,找到

FlingRunnable这个类的run()方法,找到其中的

private class FlingRunnable implements Runnable {

...

@Override

public void run() {

...

case TOUCH_MODE_OVERFLING: {

final OverScroller scroller = mScroller;

if (scroller.computeScrollOffset()) {

final int scrollY = mScrollY;

final int currY = scroller.getCurrY();

final int deltaY = currY - scrollY; /// 刪掉這行

/// 新增下面的代碼

/**

* M: If user flings on the list in an opposite direction during an over fling quickly,

* the scrollY will change from positive(negative) to negative(positive), so list

* run into abnormal state, view will be not displayed(only mScrollY changes).

*

* To fix this, we only let the list scroll by mScrollY distance to make the list

* restore the normal touch state, then fling the list using the current velocity. @{

*/

final int deltaY;

final boolean needChangeMode = ((mScrollY >= 0 && currY <= 0) || (mScrollY <= 0 &&

currY >= 0));

if (needChangeMode) {

deltaY = -mScrollY;

} else {

deltaY = currY - scrollY;

}

/** @} */

if (overScrollBy(0, deltaY, 0, scrollY, 0, 0,

0, mOverflingDistance, false))

......

......

} else {

Xlog.d(TAG, "FlingRunnable overfling intend to endfling: mScrollY = "+

mScrollY);

if(mScrollY !=0){ //mtk add

if(sDbgMotion) Log.d(TAG,"FlingRunnable TOUCH_MODE_OVERFLING,mScroller

animation fininshed,mScrollY !=0,will startSpringBack");

startSpringback(); //mtk add

}else{ //mtk add

endFling();

} //mtk add

}

break;

标注//mtk add的代码为新增代码

再次提醒,这个改动会导致CTS 测试AbsListViewTest.java中testSetOnScrollListener()这个test

case 测试失败,如果要过CTS,那务必不要做此FAQ的修改
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息