我有一个使用HorizontalScrollView和horizontal-LinearLayout的简单布局,如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="100dp"
android:scrollbars="horizontal"
android:fadingEdge="none">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal">
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sed velit sed nisl pharetra consequat"/>
<TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sed velit sed nisl pharetra consequat"/>
<TextView ... (same text view repeated several times) />
</LinearLayout>
</HorizontalScrollView>
</RelativeLayout>
当我在模拟器上进行测试时,横向抖动效果很好。但是在三星Galaxy S2上进行测试时,fling表现得很奇怪:
当手指移动侧向和向上时,滚动视图开始投掷正常,但在停止之前,它会反弹并向后移动,尽管它有 NOT 走到了尽头。滚动视图在任何滚动级别都会弹跳。
如果我只是滚动(将手指移到侧面停止和向上),滚动就完成了。
有没有人经历过这个?这是三星实施中的任何错误吗?
有关如何解决此问题的任何想法?
我的应用是针对Android 2.2。 Galaxy S2有官方的三星Android 4.0.3。
提前致谢!
答案 0 :(得分:1)
经过大量测试后,我得出的结论是,在HorizontalScrollView上,这是三星固件(Galaxy S2 4.0.3)的一个错误。
看起来fling-gesture正朝着相反的方向发展: 例如,如果我向左移动并向左移动,然后释放屏幕,那么投掷效果(继续移动和减速)就完成了......正确!
所以我的解决方案一直是子类化HorizontalScrollView,并添加一个补丁以确保如果向右滚动,则向右移动,反之亦然。
public class PatchedHorizontalScrollView extends HorizontalScrollView {
public PatchedHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public PatchedHorizontalScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public PatchedHorizontalScrollView(Context context) {
super(context);
}
// store most recent scroll X positions
int olderScrollX = 0;
int lastScrollX = 0;
@Override
public boolean onTouchEvent(MotionEvent ev) {
// keep track of most recent scroll positions
olderScrollX = lastScrollX;
lastScrollX = getScrollX();
return super.onTouchEvent(ev);
}
@Override
public void fling(int velocityX) {
// ensure velocityX has the right sign
if (lastScrollX > olderScrollX) {
// to the right: velocity must be positive
if (velocityX < 0) {
velocityX = -velocityX;
}
} else if (lastScrollX < olderScrollX) {
// to the left: velocity must be negative
if (velocityX > 0) {
velocityX = -velocityX;
}
}
super.fling(velocityX);
}
}