1

我的布局中有一个水平滚动视图。它包含一个线性布局(垂直方向),它又包含按钮。在这个区域中,我可以水平滚动(在大多数手机中,按钮一次无法在一个屏幕中组合在一起)。Android 为我提供了这种舒适感。现在在这个水平滚动视图下方,有一个相对布局。
现在我想要的是,当我在相对布局中水平滑动时,我希望水平滚动视图中的按钮滚动。
我试图通过覆盖onTouchEvent(). 问题在于,按钮无限滚动(它们离开屏幕)。我无法设置限制。我试图设定一个限制。但是有些它如何超过限制 1 并停止。然后我无法滚动。
这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:focusableInTouchMode="true" >

    <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content" android:layout_height="wrap_content">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"  
        android:id="@+id/llt"
        >

        <Button
        android:id="@+id/login"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:background="@drawable/button1"
        style="@style/ButtonText"
       android:text="Groups" />

        <Button 
            android:id="@+id/login1"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:background="@drawable/button1"
        style="@style/ButtonText"
            android:text="QandA"/>
                <Button 
            android:id="@+id/login2"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:background="@drawable/button1"
            style="@style/ButtonText" 
            android:text="Pending Requests"/>
            <Button
            android:id="@+id/login3"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:background="@drawable/button1"
            style="@style/ButtonText"
            android:text="Settings"
            ></Button>
                        <Button 
            android:id="@+id/login4"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:background="@drawable/button1"
        style="@style/ButtonText" 
            android:text="Help"/>
    </LinearLayout>        
        </HorizontalScrollView>

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:id="@+id/rl1"
     android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
   >
    .
    .
    .


这是我尝试过的:

@Override 
 public boolean onTouchEvent(MotionEvent event) {
   switch (event.getAction()) {
       case MotionEvent.ACTION_DOWN: {
           currentX = (int) event.getRawX();
           currentY = (int) event.getRawY();
           break;
       }

       case MotionEvent.ACTION_MOVE: {
           int x2 = (int) event.getRawX();
           int y2 = (int) event.getRawY();
           if(location1[0]<=leftconst&&(location2[0]+rightmost.getWidth())>=rightconst)
           {
           llt.scrollBy(currentX - x2 ,0);
           }
           currentX = x2;
           currentY = y2;
           break;
       }   
       case MotionEvent.ACTION_UP: {
           break;
       }
   }
     return true; 
 }


leftconstrightconst分别等于 3 和screenwidth。但是当滚动它时它会停止两端。然后在那之后滚动是不可能的。leftmost是带有 id 的按钮loginrightmost是带有 id 的按钮login4

4

2 回答 2

1

而不是scrollByuse scrollTo(x2),这将更准确地滚动。在您的代码中使用 scrollBy 会让人感到困惑。

scrollTo可以这样计算的参数

final float ratio = horizontalscrollView_width/relativelayout_width;

然后在 onTouch

scrollTo( x2 * ratio, 0);

VelocityTracker成功完成滚动后,您可以使用来实现投掷功能..

于 2012-09-22T14:40:45.343 回答
1

在更深入地分析了我自己的代码之后,我发现限制使滚动永远停止(如果用户以另一种方式滚动,它不应该停止)。所以我在 if 语句中添加了另一个检查来检查滚动方向(通过存储前一个位置)。

case MotionEvent.ACTION_MOVE: {
           int x2 = (int) event.getRawX();
           int y2 = (int) event.getRawY();
           int location1[] = new int[2];
           int location2[]=new int[2];
           leftmost.getLocationOnScreen(location1);
           rightmost.getLocationOnScreen(location2);
          Toast.LENGTH_SHORT).show();
           if((x2-currentX<0||location1[0]+1<leftconst)&&((location2[0]+rightmost.getWidth())+1>rightconst||x2-currentX>0))
           {
           llt.scrollBy(currentX - x2 ,0);
           }
           currentX = x2;
           currentY = y2;
           break;
       }


编辑
没有 if 语句本身的更好和更简单的解决方案。而不是滚动LinearLayout(llt),只需滚动它**HorizontalScrollView**本身!无需指定任何限制,因为它HorizontalScrollView会照顾到这一点。

case MotionEvent.ACTION_MOVE: {
           int x2 = (int) event.getRawX();
           int y2 = (int) event.getRawY();
           hscrv.scrollBy(currentX - x2 ,0);
           currentX = x2;
           currentY = y2;
           break;
       }


hscrv是包含线性布局和按钮的水平滚动视图。

于 2012-09-22T16:21:54.517 回答