Android ImageButton在ScrollView中慢速单击响应

时间:2015-01-27 18:49:02

标签: android performance scrollview imagebutton ontouchevent

我总是在ScrollView中使用按钮,但如果我使用以下代码,ImageButton的执行速度会大大降低。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/scrollView2"
        android:clickable="true"
        android:layout_gravity="center">
        <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
        android:paddingTop="10dip"
        android:background="@android:color/darker_gray">
            <ImageButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/custombtn"
                android:id="@+id/button5"
                android:src="@drawable/favorites"
                android:minHeight="90dip"
                android:singleLine="false"
                android:minWidth="90dip"
                android:layout_marginRight="10dp" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

如何保留ScrollView中的所有内容并使ImageButton onTouchEvent更快?

我认为ScrollView覆盖了整个图层,一旦我尝试按下ImageButton,它实际上首先与ScrollView进行交互,然后是ImageButton,这是&#34;背后&#34;它。我的假设是否正确?我该怎么做呢?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

ScrollView内的按钮在按下时响应相对较慢的原因是因为确定触摸是滚动/滑动事件的开始还是长按事件的开始有轻微的延迟。

如果用户实际滚动但恰好在按钮上开始滑动,则此延迟是为了避免按下动画按钮。

但是,如果您快速点按ScrollView内的按钮,则会看到响应良好。

要使按钮更具响应性,您可以按照How can I make a Button more responsive?中的建议扩展Button类并覆盖onTouchEnd方法。

public boolean onTouchEvent (MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        setPressed(true);
    }

    return super.onTouchEvent(event);
}