Pase el evento de desplazamiento a otra vista

He estado usando la biblioteca de soporte de diseño de Android para colapsar la disposición de la barra de herramientas. Todo funciona bien, excepto que quiero desplazar la vista completa de desplazamiento de contenido en colapsingBarlayout

Aquí está el diseño xml:

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> <android.support.design.widget.AppBarLayout android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="420dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" android:fitsSystemWindows="true"> <android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing_toolbar" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed" app:contentScrim="?attr/colorPrimary" app:expandedTitleMarginStart="48dp" app:expandedTitleMarginEnd="64dp" android:fitsSystemWindows="true"> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pager" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.8" android:fitsSystemWindows="true" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" app:layout_collapseMode="pin" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:id="@+id/scroll_view" android:layout_width="match_parent" android:layout_height="match_parent" android:clipToPadding="false" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <include layout="@layout/activity_item_detail" /> </android.support.v4.widget.NestedScrollView> <android.support.design.widget.FloatingActionButton android:id="@+id/fab_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="@dimen/activity_vertical_margin" android:clickable="true" android:src="@android:drawable/ic_menu_call" app:layout_anchor="@+id/appbar" app:layout_anchorGravity="bottom|right|end" style="@style/floating_action_button" /> </android.support.design.widget.CoordinatorLayout> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/drawer_header" app:menu="@menu/drawer"/> </android.support.v4.widget.DrawerLayout> 

Introduzca aquí la descripción de la imagen Introduzca aquí la descripción de la imagen

Desplazar el contenido funciona si se toca cualquier cosa, excepto viewpager / barra de herramientas. Necesito la misma experiencia de desplazamiento al tocar y desplazar verticalmente el buscapersonas también. Había intentado sobreponer onTouchEvent del paginador de vista para pasar el evento de movimiento ACTION_UP a scroll_view.

 nestedScrollView.post(new Runnable() { @Override public void run() { mPager.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { return nestedScrollView.onTouchEvent(event); } else { return v.onTouchEvent(event); } } }); } }); 

Pero no funciona. Por favor, ayuda con una solución / cualquier hack que pueda solucionar rápidamente esto.

Descubre la vista que está recibiendo el evento táctil. En este caso específico ViewPager está recibiendo el evento táctil que queremos anular. Una vez que tenga la vista que está recibiendo evento táctil, puede instalar un detector de gestos. Echa un vistazo a esta guía , en particular a la

Detección de un subconjunto de gestos compatibles

De esta manera se puede gestionar todos los gestos que se realizan en la vista exterior y se puede reaccionar al gesto de alguna manera.
Nota : al extender GestureDetector.SimpleOnGestureListener recuerde anular el método onDown , de lo contrario no obtendrá ningún otro evento.

Editar

He probado mi sugerencia sobre este proyecto github . Si modifica la CheeseDetailActivity de esta manera, recibirá el evento onScroll cuando se desplace dentro de la imagen del queso.

 public class CheeseDetailActivity extends AppCompatActivity { public static final String EXTRA_NAME = "cheese_name"; private GestureDetectorCompat mDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); MyGestureListener listener = new MyGestureListener(); mDetector = new GestureDetectorCompat(this, new MyGestureListener()); View root = findViewById(R.id.pager); root.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return mDetector.onTouchEvent(event); } }); Intent intent = getIntent(); final String cheeseName = intent.getStringExtra(EXTRA_NAME); final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); CollapsingToolbarLayout collapsingToolbar = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar); collapsingToolbar.setTitle(cheeseName); loadBackdrop(); } private void loadBackdrop() { final ImageView imageView = (ImageView) findViewById(R.id.backdrop); Glide.with(this).load(Cheeses.getRandomCheeseDrawable()).centerCrop().into(imageView); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.sample_actions, menu); return true; } class MyGestureListener extends GestureDetector.SimpleOnGestureListener { private static final String DEBUG_TAG = "Gestures"; @Override public boolean onDown(MotionEvent event) { Log.d(DEBUG_TAG,"onDown: " + event.toString()); return true; } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { Log.d(DEBUG_TAG, "onScroll: "); //Implement functionality you want eg horiontal scroll changes viewpager item, vertical scroll collpases the toolbar return true; } } } 

El contenido del buscapersonas debe tener activado el desplazamiento anidado. La forma más sencilla de lograr esto es simplemente envolverlo en un NestedScrollView :

Fragment_image.xml

 <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/backdrop" android:layout_width="match_parent" android:layout_height="@dimen/detail_backdrop_height" android:scaleType="centerCrop" /> </android.support.v4.widget.NestedScrollView> 

Sin embargo, esto hace que la altura de los padres del ImageView sea ​​indeterminada, por lo que debe establecerla en una altura fija.

  • No se puede usar srcCompat para ImageViews en android
  • Personalizar el relleno entre los elementos del menú Vista de navegación
  • Agregar el comportamiento de vista de desplazamiento de la barra de aplicaciones a varias vistas en CoordinatorLayout
  • Biblioteca de soporte VectorDrawable Resources $ NotFoundException
  • Establecer el ítem / id de elementos inicialmente seleccionado en BottomNavigationView
  • Una sola pestaña en TabLayout no cubre el ancho completo
  • Error al inflar la clase android.support.design.widget.NavigationView
  • Biblioteca de diseño de Android CoordinatorLayout, AppBarLayout y DrawerLayout
  • Bug con FloatingActionButton anclado en la biblioteca de soporte 24.2.1
  • ¿Cómo restablecer la posición de la barra de herramientas controlada por el CoordinatorLayout?
  • ViewPager dentro del fragmento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.