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:
- El texto de error en TextInputLayout está cubierto por el teclado
- Android: textAllCaps = "false" no funciona para el diseño de TabLayout
- Android ¿Por qué no se muestra el botón de salida de Facebook SDK?
- Obtener excepción: java.lang.NoClassDefFoundError: android.support.v7.app.AppCompatDelegateImplV14
- Tabla de soporte de diseño de Android Contenido solapado de superposición
<?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>
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.
- ¿Cómo crear un diseño de barra de herramientas doblado?
- Establecimiento de la escucha de compensación en CollapsingToolbarLayout
- Barra de herramientas "Oculto" visible debajo de la barra de estado
- ¿Cómo obtener el nuevo NavigationView para jugar agradable con la barra de estado scrim?
- Obtención de la excepción Nullpointer después de actualizar a la compatibilidad con el diseño de Android 22.2.1
- CollapsingToolbarLayout subtitle
- TextInputLayout: ¿Cómo dar relleno o margen para sugerir?
- Fab.show () no animado por primera vez después de inicializar nueva actividad
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.
- Firebase Database – la técnica "Fan Out"
- EXCEPCIÓN INESPERADA DE SUPERIOR NIVEL: java.lang.IllegalArgumentException: ya agregado