32829


お世話になります。  
表題の通り、HorizontalScrollviewを継承したCustomViewを作成し、  
xmlにCustomViewを配置したのですが、何故か横スクロールされずに困っております。

CustomView

[code]

    public final class ScrollCustom extends HorizontalScrollView {
    
    
        public ScrollCustom(Context context) {
            super(context);
        }
        public ScrollCustom(Context context, AttributeSet att) {
            super(context, att);
        }
        public ScrollCustom(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public int getMaxScrollAmount() {
            return super.getMaxScrollAmount();
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    
        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
        }
    
        @Override
        public boolean onInterceptTouchEvent(MotionEvent event)  {
            Log.v("Test", "RecycleTest" + " onInterceptTouchEvent");
    
            int x = (int) event.getX();
            int y = (int) event.getY();
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    TaskRecyclerAdapter.downWidth = x;
                    TaskRecyclerAdapter.downHeight = y;
    
                    screenX = x;
                    screenY = y;
                    Log.v("Test", "RecycleTest" + ", ACTION_DOWN " + x + " : " + y);
                    break;
    
                case MotionEvent.ACTION_MOVE:
                    TaskRecyclerAdapter.moveWidth = x;
                    TaskRecyclerAdapter.moveHeight = y;
                    Log.v("Test", "RecycleTest" + ", ACTION_MOVE " + x + " : " + y);
                    break;
    
                case MotionEvent.ACTION_UP:
                    TaskRecyclerAdapter.upWidth = x;
                    TaskRecyclerAdapter.upHeight = y;
                    Log.v("Test", "RecycleTest" + ", ACTION_UP " + x + " : " + y);
                    break;
            }
            return false;
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event)  {
            Log.v("Test", "RecycleTest" + " onTouchEvent");
            return false;
        }
    }
    
[/code]

xml

[code]

     <number_8.co.jp.constructiontaskapp.view.ScrollCustom
        android:id="@+id/kanban_scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >
        <android.support.v7.widget.RecyclerView
            android:id="@+id/kanban_recyclerview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginEnd="10dp"
            android:layout_marginStart="10dp"
            android:paddingTop="10dp"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            />
    </number_8.co.jp.constructiontaskapp.view.ScrollCustom>
    
[/code]

初心者ですのでおかしな点はあると思いますが  
ご教示の程よろしくお願いします。


CC BY-SA 3.0
2017-02-21T02:13:38.717
32826
2017-02-23T03:03:59.837
2017-02-21T04:21:08.333
3068
20747
question
android java
AndroidでHorizontalScrollViewを継承したCustomViewが横スクロールしない


HorizontalScrollviewではonInterceptTouchEvent/onTouchEventで様々な処理を行っています。  
スクロール処理が動作しないのはonInterceptTouchEvent/onTouchEventをOverrideしているからではないでしょうか。

挙動を書き換えることが目的でないのであれば、それぞれのreturnを以下のように書き換えてあげるとスクロール処理が動作するのではないでしょうか。

[code]

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event)  {
        Log.v("Test", "RecycleTest" + " onInterceptTouchEvent");
    (中略)
    //    returnを書き換える
    //    return false;
        return super.onInterceptTouchEvent(event);
    }
    
[/code]

* * *
[code]

    @Override
    public boolean onTouchEvent(MotionEvent event)  {
        Log.v("Test", "RecycleTest" + " onTouchEvent");
    //    returnを書き換える
    //    return false;
        return super.onTouchEvent(event);
    }
    
[/code]


CC BY-SA 3.0
2017-02-21T04:20:48.300
32829
2017-02-23T02:32:19.013
2017-02-23T02:32:19.013
20272
20272
32826
answer


`CustomView`の中の`RecyclerView`が `LinearLayoutManager.VERTICAL` で設定されていたりしませんか？  
xmlの定義を見た限りでは、`RecyclerView`の横幅が`CustomView`の横幅と同じに設定されている(`match_parent`)ため、そもそもスクロールもしない気がしますが、縦にスクロールされているのは`RecyclerView`の中にある要素が縦にスクロールされているのではないかと思いました。

`RecyclerView`に設定している`LinearLayoutManager`を以下のように設定してみてはどうでしょう？

[code]

    LinearLayoutManager manager = new LinearLayoutManager(context);
    manager.setOrientation(LinearLayoutManager.HORIZONTAL);
    recyclerView.setLayoutManager(manager);
    
[/code]


CC BY-SA 3.0
2017-02-21T14:10:00.503
32849
2017-02-21T14:10:00.503
7655
32826
answer


maot様回答より

[code]

    @Override
    　public boolean onInterceptTouchEvent(MotionEvent event)
    @Override
    　public boolean onTouchEvent(MotionEvent event) 
    
[/code]

上記メソッドの返り値を以下に変更で動きました。

[code]

      return super.onInterceptTouchEvent(event);
      return super.onTouchEvent(event);
    
[/code]

解決したコード

[code]

    public final class ScrollCustom extends HorizontalScrollView {
    
    
      public ScrollCustom(Context context) {
         super(context);
      }
      public ScrollCustom(Context context, AttributeSet att) {
        super(context, att);
      }
      public ScrollCustom(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
      }
    
      @Override
       public int getMaxScrollAmount() {
         return super.getMaxScrollAmount();
      }
    
      @Override
      protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
      }
    
      @Override
      protected void onScrollChanged(int l, int t, int oldl, int oldt) {
        super.onScrollChanged(l, t, oldl, oldt);
      }
    
      @Override
      protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
      }
    
      @Override
      public boolean onInterceptTouchEvent(MotionEvent event)  {
        Log.v("Test", "RecycleTest" + " onInterceptTouchEvent");
    
        int x = (int) event.getX();
        int y = (int) event.getY();
    
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                TaskRecyclerAdapter.downWidth = x;
                TaskRecyclerAdapter.downHeight = y;
    
                screenX = x;
                screenY = y;
                Log.v("Test", "RecycleTest" + ", ACTION_DOWN " + x + " : " + y);
                break;
    
            case MotionEvent.ACTION_MOVE:
                TaskRecyclerAdapter.moveWidth = x;
                TaskRecyclerAdapter.moveHeight = y;
                Log.v("Test", "RecycleTest" + ", ACTION_MOVE " + x + " : " + y);
                break;
    
            case MotionEvent.ACTION_UP:
                TaskRecyclerAdapter.upWidth = x;
                TaskRecyclerAdapter.upHeight = y;
                Log.v("Test", "RecycleTest" + ", ACTION_UP " + x + " : " + y);
                break;
        }
        return super.onInterceptTouchEvent(event);
     }
    
      @Override
        public boolean onTouchEvent(MotionEvent event)  {
         Log.v("Test", "RecycleTest" + " onTouchEvent");
         return super.onTouchEvent(event);
      }
    
[/code]

}


CC BY-SA 3.0
2017-02-23T03:03:59.837
32886
2017-02-23T03:03:59.837
20747
32826
answer