スクロールイベントの受け取り方

Viewクラスではタッチ処理を受け取りたいときにはonTouchListenerなどイベントに応じたリスナーを実装しますが、スクロールイベントにはそれに相当するものが存在しません。

そこでスクロールを受け取るには自分でスクロールイベントを定義する必要があります。

例えば次のようにタッチイベントを受け取るメソッドとしてonViewScrollというメソッドを作り、それをOnTouchListener内の適切なタイミングで呼び出します。

public class MyView extends View 
{
    public MyView(Context context)
    {
        super(context);
        init();
    }
    
    public MyView(Context context, AttributeSet attrs) 
    {
        super(context, attrs);
        init();
    }
    
    private void init()
    {
        
        setOnTouchListener(new View.OnTouchListener() 
        {
            int oldX = 0, oldY = 0;
                //スクロールイベントが起こる前の座標
            int originX, originY;
                //スクロールイベントの発生座標
            
            @Override
            public boolean onTouch(View v, MotionEvent event) 
            {
                switch(event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    oldX = (int) event.getX();
                    oldY = (int) event.getY();
                    
                    break;
                case MotionEvent.ACTION_MOVE:
                    originX = (int) event.getX();
                    originY = (int) event.getY();
                    onViewScroll(originX, originY, oldX, oldY);
                        //スクロールイベントの発生を知らせる
                    oldX = originX;
                    oldY = originY;
                    
                    break;
                }
                return false;
            }
        });
        
    }
    
    /**タッチイベントが起こったら呼ばれる*/
    public void onViewScroll(int orgX, int orgY, int oldX, int oldY)
    {
        Log.d("MyView : ", "orgX = " + orgX + "  orgY = " + orgY + 
                            "   oldX = " + oldX + "   oldY = " + oldY);
    }
}

この例ではMotionEvent.ACTION_DOWNが発生したら発生元の座標を記録しておき、その後にMotionEvent.ACTION_MODEが発生したときに発生場所とその前の座標をonViewScrollメソッドに渡してタッチイベントを感知しています。

このようにスクロールイベントを受け取るためのメソッドは用意されていないのでタッチイベントなどを通してスクロール処理を自作するのが一番手っ取り早いです。

関連項目
プライバシーポリシー