【问题标题】:horizontal scroll inside a vertical sliding layout垂直滑动布局内的水平滚动
【发布时间】:2019-12-11 14:16:20
【问题描述】:

我有一个类似于抽屉导航的custom view 类,但它是从下到上打开的。

在我的 XML 中,我有一个由这个自定义类包装的水平回收视图。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/video_cutter_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/videoview_bg"
    android:orientation="vertical"
    tools:ignore="RtlHardcoded">

    <RelativeLayout
        android:id="@+id/layout_surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/layout"
        android:background="@android:color/transparent"
        android:gravity="center"
        android:orientation="vertical">


        <com.devbrackets.android.exomedia.ui.widget.VideoView
            android:id="@+id/video_loader"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true" />


        <ImageView
            android:id="@+id/icon_video_play"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:background="@drawable/play_button"
            android:contentDescription="@null" />

    </RelativeLayout>


    <RelativeLayout
        android:id="@+id/layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="72dp"
        android:background="?attr/video_timeline_bg">


        <RelativeLayout
            android:id="@+id/timeText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/textTimeStart"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_marginStart="7dp"
                android:layout_marginLeft="7dp"
                android:gravity="left"
                android:text="@string/timer2" />

            <TextView
                android:id="@+id/textTime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:gravity="center"
                android:text="@string/timer2"
                android:textColor="?attr/color_accent" />

            <TextView
                android:id="@+id/textTimeEnd"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_marginEnd="7dp"
                android:layout_marginRight="7dp"
                android:layout_toEndOf="@+id/textTime"
                android:layout_toRightOf="@+id/textTime"
                android:gravity="right"
                android:text="@string/timer2" />

        </RelativeLayout>


        <androidx.appcompat.widget.AppCompatSeekBar
            android:id="@+id/handlerTop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:max="1000"
            android:paddingTop="30dp"
            android:progressDrawable="@android:color/transparent"
            android:secondaryProgress="0"
            android:thumb="@drawable/vector_apptheme_text_select_handle_middle" />


        <View
            android:id="@+id/lineTop"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_below="@+id/handlerTop"
            android:background="@color/line_button" />


    </RelativeLayout>


    <SlidingLayer xmlns:slidingLayer="http://schemas.android.com/apk/res-auto"
        android:id="@+id/slider_panel"
        android:layout_width="match_parent"
        android:layout_height="400dip"
        android:layout_below="@+id/layout_surface_view"
        android:layout_gravity="bottom"
        android:gravity="bottom"
        slidingLayer:openLayer="false"
        slidingLayer:stickTo="bottom">


        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="400dip"
            android:background="@color/slider_panel_color_trans98">


            <TextView
                android:id="@+id/added_clips_count"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_marginTop="7dp"
                android:padding="7dp"
                android:text="Selected 0 clips"
                android:textColor="?attr/text_color"
                android:textSize="@dimen/sp12"
                android:textStyle="bold" />

            <androidx.appcompat.widget.AppCompatImageView
                android:id="@+id/slider_iv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_gravity="top|center"
                android:background="?attr/selectableItemBackgroundBorderless"
                android:contentDescription="@null"
                android:padding="7dp"
                android:tint="?attr/color_accent"
                app:srcCompat="@drawable/vector_slide_down" />

            <Button
                android:id="@+id/btAdd"
                style="@style/BorderlessButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:gravity="center"
                android:shadowColor="?attr/textview_shadow"
                android:shadowDx="@integer/shadowDx"
                android:shadowDy="@integer/shadowDy"
                android:shadowRadius="@integer/shadowRadius"
                android:text="@string/add"
                android:textColor="?attr/color_accent"
                android:textSize="@dimen/sp14"
                android:textStyle="bold" />

            <Button
                android:id="@+id/btNext"
                style="@style/BorderlessButton"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_toLeftOf="@+id/btAdd"
                android:gravity="center"
                android:paddingLeft="15dp"
                android:paddingRight="15dp"
                android:shadowColor="?attr/textview_shadow"
                android:shadowDx="@integer/shadowDx"
                android:shadowDy="@integer/shadowDy"
                android:shadowRadius="@integer/shadowRadius"
                android:text="@string/next"
                android:textColor="?attr/color_accent"
                android:textSize="@dimen/sp14"
                android:textStyle="bold" />

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/mRecyclerView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/btAdd"
                android:background="@color/slider_panel_color_trans98"
                android:scrollbarSize="@dimen/scrollbar_size"
                android:scrollbarStyle="outsideInset"
                android:scrollbarThumbHorizontal="?attr/color_accent"
                android:scrollbars="horizontal" />


        </RelativeLayout>

    </SlidingLayer>


</RelativeLayout>

所以我有一个水平滚动(recyclerview),在垂直幻灯片中(自定义视图)。

问题是这样的,请看下面的GIF文件:

如您所见,我无法在 recyclerview 中正常滚动。

你有什么建议吗?

【问题讨论】:

    标签: android scrollview horizontal-scrolling horizontalscrollview vertical-scrolling


    【解决方案1】:

    onInterceptTouchEvent 方法内的SlidingLayer.java 类中,为MotionEvent.ACTION_MOVE 操作添加以下代码:

    if (xDiff > yDiff) {
        return false;
    }
    

    看起来像:

    switch (action) {
        case MotionEvent.ACTION_MOVE:
            .
            .
            .
    
            if (xDiff > yDiff) {
                return false;
            }
    
            if (validHorizontalDrag || validVerticalDrag) {
                mIsDragging = true;
                setDrawingCacheEnabled(true);
            }
    
            break;
    
        .
        .
        .
    

    【讨论】:

      【解决方案2】:

      您可以执行以下操作:

      1) MainActivity.class:

      public class MainActivity extends AppCompatActivity {
      
      private final String TAG = MainActivity.class.getSimpleName();
      private RecyclerView mRecyclerView;
      
      /*private float mDownMotionX = 0;
      private float mDownMotionY = 0;
      
      private final int SWIPE_SENSITIVITY = 100;
      
      private final int SWIPE_X_SENSITIVITY = 10;
      private final int SWIPE_Y_SENSITIVITY = 10;
      
      private final int SWIPE_X_SENSITIVITY_MIN = 0;
      private int SWIPE_X_SENSITIVITY_MAX = 0;
      private final int SWIPE_Y_SENSITIVITY_MIN = 0;
      private int SWIPE_Y_SENSITIVITY_MAX = 0;
      */
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
      
          mRecyclerView = (RecyclerView) findViewById(R.id.mRecyclerView);
      
          List<String> data = new ArrayList<>();
          for (int i = 0; i < 100; i++) {
              data.add("I " + (i + 1));
          }
          LinearLayoutManager layoutManager
                  = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
          mRecyclerView.setLayoutManager(layoutManager);
          HorizontalRecyclerViewAdapter horizontalRecyclerViewAdapter = new HorizontalRecyclerViewAdapter(MainActivity.this, data);
          mRecyclerView.setAdapter(horizontalRecyclerViewAdapter);
          mRecyclerView.setOnTouchListener(new View.OnTouchListener() {
              @Override
              public boolean onTouch(View v, MotionEvent ev) {
      
                  mRecyclerView.getParent().requestDisallowInterceptTouchEvent(true);
      
                  /**
                   * You can adjust sensitivity by doing something similar to the code below
                   */
                  /*final int action = ev.getAction();
      
                  switch (action & MotionEvent.ACTION_MASK) {
      
                      case MotionEvent.ACTION_DOWN:
                          // Remember where the motion event started
                          mDownMotionX = ev.getX();
                          mDownMotionY = ev.getY();
                          break;
                      case MotionEvent.ACTION_MOVE:
                          // Scroll to follow the motion event
                          final float x = ev.getX();
                          final float y = ev.getY();
                          if (Math.abs(x - mDownMotionX) >= SWIPE_SENSITIVITY &&
                                  mDownMotionX >= SWIPE_X_SENSITIVITY_MIN &&
                                  mDownMotionX <= SWIPE_X_SENSITIVITY_MAX &&
                                  Math.abs(y - mDownMotionY) <= SWIPE_Y_SENSITIVITY) {
      
                              mRecyclerView.getParent().requestDisallowInterceptTouchEvent(true);
      
                          } else{
      
                              mRecyclerView.getParent().requestDisallowInterceptTouchEvent(false);
                          }
                          break;
                      case MotionEvent.ACTION_UP:
                          break;
                      case MotionEvent.ACTION_CANCEL:
                          break;
                  }*/
                  return false;
              }
          });
      
          final Display display = ((WindowManager) MainActivity.this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
          final Point deviceDisplay = new Point();
          display.getSize(deviceDisplay);
      
          /*
          SWIPE_X_SENSITIVITY_MAX = deviceDisplay.x;
          SWIPE_Y_SENSITIVITY_MAX = mRecyclerView.getHeight();
          */
      
      }
      
      public class HorizontalRecyclerViewAdapter extends RecyclerView.Adapter<HorizontalRecyclerViewAdapter.MyViewHolder> {
      
          private final String TAG = HorizontalRecyclerViewAdapter.class.getSimpleName();
          private final Context context;
          private final List<String> data;
      
          public HorizontalRecyclerViewAdapter(Context context, List<String> data) {
              this.context = context;
              this.data = data;
          }
      
          @Override
          @NonNull
          public HorizontalRecyclerViewAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
              View view = getLayoutInflater().inflate(R.layout.horizontal_recycler_view_item, parent, false);
              return new HorizontalRecyclerViewAdapter.MyViewHolder(view);
          }
      
          @Override
          public void onBindViewHolder(@NonNull HorizontalRecyclerViewAdapter.MyViewHolder holder, int position) {
              holder.tv.setText(data.get(position));
          }
      
          @Override
          public int getItemCount() {
              return data.size();
          }
      
          class MyViewHolder extends RecyclerView.ViewHolder {
              final TextView tv;
      
              private MyViewHolder(View itemView) {
                  super(itemView);
                  tv = (TextView) itemView.findViewById(R.id.tv);
              }
          }
      
      }
      
      }
      

      2)activity_main.xml:

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      xmlns:tools="http://schemas.android.com/tools"
      android:id="@+id/video_cutter_root"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:background="@android:color/black"
      android:orientation="vertical"
      tools:ignore="RtlHardcoded">
      
      <RelativeLayout
          android:id="@+id/layout_surface_view"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_above="@+id/layout"
          android:background="@android:color/transparent"
          android:gravity="center"
          android:orientation="vertical">
      
          <VideoView
              android:id="@+id/video_loader"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_centerHorizontal="true"
              android:layout_centerVertical="true" />
      
          <ImageView
              android:id="@+id/icon_video_play"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_centerHorizontal="true"
              android:layout_centerVertical="true"
              android:contentDescription="@null" />
      
      </RelativeLayout>
      
      <com.wunderlist.slidinglayer.SlidingLayer
          android:id="@+id/layout"
          android:layout_alignParentBottom="true"
          android:layout_width="match_parent"
          android:layout_height="400dip"
          app:stickTo="bottom"
          app:offsetDistance="400dp"
          app:changeStateOnTap="true">
      
          <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="400dip"
              android:background="@android:color/black">
      
              <TextView
                  android:id="@+id/added_clips_count"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_alignParentLeft="true"
                  android:layout_marginTop="7dp"
                  android:padding="7dp"
                  android:text="Selected 0 clips"
                  android:textColor="@android:color/white"
                  android:textSize="12sp"
                  android:textStyle="bold" />
      
              <androidx.appcompat.widget.AppCompatImageView
                  android:id="@+id/slider_iv"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_centerHorizontal="true"
                  android:layout_gravity="top|center"
                  android:background="?attr/selectableItemBackgroundBorderless"
                  android:contentDescription="@null"
                  android:padding="7dp"
                  android:tint="@color/colorAccent"/>
      
              <Button
                  android:id="@+id/btAdd"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_alignParentRight="true"
                  android:gravity="center"
                  android:text="Add"
                  android:textColor="@color/colorAccent"
                  android:textSize="14sp"
                  android:textStyle="bold" />
      
              <Button
                  android:id="@+id/btNext"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_toLeftOf="@+id/btAdd"
                  android:gravity="center"
                  android:paddingLeft="15dp"
                  android:text="Next"
                  android:textColor="@color/colorAccent"
                  android:textSize="14sp"
                  android:textStyle="bold" />
      
              <androidx.recyclerview.widget.RecyclerView
                  android:id="@+id/mRecyclerView"
                  android:layout_width="match_parent"
                  android:layout_height="wrap_content"
                  android:layout_below="@+id/btAdd"
                  android:scrollbars="horizontal" />
      
          </RelativeLayout>
      
      </com.wunderlist.slidinglayer.SlidingLayer>
      
      </RelativeLayout>
      

      3)horizo​​ntal_recycler_view_item.xml:

      <?xml version="1.0" encoding="utf-8"?>
      <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_gravity="center_horizontal"
      android:layout_width="wrap_content"
      android:padding="20dp"
      android:background="@android:color/black"
      android:layout_height="wrap_content">
      
      <TextView
          android:layout_width="110dp"
          android:layout_height="130dp"
          android:id="@+id/tv"
          android:textSize="16sp"
          android:background="@android:color/holo_red_dark"
          android:textColor="@android:color/white"
          android:gravity="center"
          android:padding="40dp"/>
      
      </LinearLayout>
      

      4) 结果:

      【讨论】: