15

HorizontalScrollViewをスクロールしたときにイベントを聴こうとしています。これを試しましたが、何も印刷されません。

HorizontalScrollView headerScrollView = new HorizontalScrollView(this);

    headerScrollView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            Log.i("hv1",event.toString());
            Log.i("hv1","HELLO");
            return false;
        }
    });

実際の問題は、一度に2つスクロールしたいということHorizontalScrollViewです。少なくとも一方がスクロールしたときに、両方を同時にスクロールする必要があります。回避策はありますか?

以下の答えを使用して、これを実装しようとしましたが、クラスのメソッドをどのように使用する必要があるのか​​わかりません。

TestHorizontalScrollView headerScrollView = (TestHorizontalScrollView) findViewById(R.id.headerHv); 

これは、レイアウトファイルのhsv要素を指す必要がある方法ですか?

4

5 に答える 5

28

ホリゾンタルスクロールビューを拡張する独自のカスタムクラスを作成し、onScrollChanged()関数をそのようにオーバーライドしてみてください。

public class TestHorizontalScrollView extends HorizontalScrollView {

    public TestHorizontalScrollView(Context context) {
        super(context);
    }


    @Override
    protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        // TODO Auto-generated method stub
        Log.i("Scrolling", "X from ["+oldl+"] to ["+l+"]");
        super.onScrollChanged(l, t, oldl, oldt);
    }

}

このオーバーライドされた関数は、ビューがタッチされていない場合でも、スクロール位置へのすべての変更をキャッチします。これにより、スクロールビューの同期が維持されます。

于 2011-06-24T02:11:16.540 に答える
8

古い質問ですが、多分役に立ちます。あなたはこのようなことをすることができます:

scrollOne = (HorizontalScrollView)findViewById(R.id.horizontal_one);
scrollTwo = (HorizontalScrollView)findViewById(R.id.horizontal_two);

scrollTwo.setOnTouchListener(new OnTouchListener(){

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        // TODO Auto-generated method stub

        int scrollX = view.getScrollX();
        int scrollY = view.getScrollY();

        scrollOne.scrollTo(scrollX, scrollY);
                    return false;
        }

    });
于 2012-08-10T05:10:03.030 に答える
4

リスナー付きのScrollView、API <23

あなたのコードに以下を書いてください

MyHorizontalScrollView scrollView = (MyHorizontalScrollView)view.findViewById(R.id.scrollViewBrowse);
        scrollView.setOnScrollChangedListener(new MyHorizontalScrollView.OnScrollChangedListener() {
            @Override
            public void onScrollChanged(int l, int t, int oldl, int oldt) {

            }
        });

MyHorizo​​ntalScrollView

   public class MyHorizontalScrollView extends ScrollView {

        public OnScrollChangedListener mOnScrollChangedListener;

        public MyHorizontalScrollView(Context context) {
            super(context);
        }

        public MyHorizontalScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        public MyHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }

        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);

            if (mOnScrollChangedListener != null) {
                mOnScrollChangedListener.onScrollChanged(l, t, oldl, oldt);
            }
        }

        public void setOnScrollChangedListener(OnScrollChangedListener onScrollChangedListener){
            this.mOnScrollChangedListener = onScrollChangedListener;
        }

        public interface OnScrollChangedListener{
            void onScrollChanged(int l, int t, int oldl, int oldt);
        }

    }

*Xmlファイル*

<MyHorizontalScrollView
        android:id="@+id/scrollViewBrowse"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/backgroung"
        android:padding="10dp">
 </MyHorizontalScrollView>
于 2016-01-27T20:38:14.677 に答える
1

APIレベルの問題を回避するには...これに従ってください。

scrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
        @Override
        public void onScrollChanged() {
            int scrollY = scrollView.getScrollY(); 
            int scrollX = scrollView.getScrollX();

            if (scrollY > 500) {

            } else {

            }
        }
    });
于 2020-01-04T04:02:06.747 に答える
0

あなたはこれを試すことができます、私はたくさんの方法を試しました、しかしそれらのどれも私のニーズを満たしていません、そして私はそれを自分でやろうとしました、そして私は成功します、そしてそれは良いようです、それはスムーズです。

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal">

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <com.szl.fundlistdemo.WrapContentListView
            android:id="@+id/left_lv"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:scrollbars="none"/>

        <HorizontalScrollView
            android:id="@+id/hscrollview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <com.szl.fundlistdemo.WrapContentListView
                android:id="@+id/right_lv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

        </HorizontalScrollView>
    </LinearLayout>


</ScrollView>

public class WrapContentListView extends ListView{
public WrapContentListView(Context context) {
    super(context);
}

public WrapContentListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public WrapContentListView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}


@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, expandSpec);
}
}
于 2016-05-10T01:20:59.287 に答える