Transferir evento de desplazamiento de vista deslizante a ScrollView – Panel deslizante con ScrollView como Google Maps
Así que estoy usando la Biblioteca de Panel deslizante en mi aplicación, y estoy tratando de implementar un ScrollView
dentro del panel deslizante. Dado que tanto el panel deslizante como el ScrollView son controlados por desplazamientos verticales, esto me está causando algunos problemas.
He conseguido que funcione parcialmente conmutando el dragview del panel una vez que el panel ha sido deslizado todo el camino hacia arriba, y cuando el ScrollView se ha desplazado a la parte superior.
- Tag <uses-permission> nombre de atributo tiene un carácter no válido ''
- Java.lang.RuntimeException: falló la toma de imagen
- ¿Existe una clase integrada de Android para crear XML de forma no continua?
- Java Regex lookahead toma demasiado tiempo
- Samsung Galaxy 7 "(GT-P6210) no detecta la depuración USB?
El problema que enfrento ahora es que, al desplazar el panel hacia arriba, el desplazamiento no se transfiere al ScrollView, como lo hace en Google Maps. Poco difícil de explicar, así que mira el video aquí: www.youtube.com/watch?v=9MUsmQzusX8&feature=youtu.be
Este es el listener de diapositivas del panel:
... slidePanel.setEnableDragViewTouchEvents(true); slidePanel.setPanelSlideListener(new SlidingUpPanelLayout.PanelSlideListener() { @Override public void onPanelSlide(View panel, float slideOffset) { // Change the dragview to panelheader when panel is fully expanded // I'm doing this here instead of in onPanelExpanded, // because onPanelExpanded first gets called once scroll // is released. if (slideOffset <= 0) { slidePanel.setDragView(layoutPanelTop); } // If the panel is not fully expanded set the whole // panel as dragview else if(slideOffset > 0) { slidePanel.setDragView(layoutPanel); } } } @Override public void onPanelExpanded(View panel) { // layout.setDragView(layoutPanelTop); panelCollapsed = false; panelExpanded = true; panelAnchored = false; Log.v("TAG, "panelExpanded"); } @Override public void onPanelCollapsed(View panel) { slidePanel.setDragView(layoutPanel); panelCollapsed = true; panelExpanded = false; panelAnchored = false; Log.v(TAG, "panelCollapsed"); } @Override public void onPanelAnchored(View panel) { slidePanel.setDragView(layoutPanel); panelCollapsed = false; panelExpanded = false; panelAnchored = true; Log.v(TAG, "panelAnchored"); } });
Y he conseguido crear un oyente scrollview totalmente funcional extendiendo scrollview, que puede detectar la dirección de desplazamiento y eventos de movimiento onDown y onUp:
private boolean atScrollViewTop = false; @Override public void onScrollChanged(int scrollY) { scrollY = Math.min(mMaxScrollY, scrollY); if (scrollY <= 0) { Log.v("myTag", "You at scrollview top"); atScrollViewTop = true; } else { atScrollViewTop = false; } mScrollSettleHandler.onScroll(scrollY); switch (mState) { case STATE_SCROLL_UP: if (panelExpanded && atScrollViewTop) { slidePanel.setDragView(layoutPanel); } else { slidePanel.setDragView(layoutPanelTop); } Log.v("myTag", "scrolling up"); break; case STATE_SCROLL_DOWN: slidePanel.setDragView(layoutPanelTop); Log.v("myTag", "scrolling down"); break; } } @Override public void onDownMotionEvent() { } @Override public void onUpOrCancelMotionEvent() { }
He estado luchando con esto los últimos dos días .. Así que realmente espero que en algún puntero por lo menos. Muchas gracias de antemano. Recuerdos Jakob Harteg.
- Tipos incompatibles de Android Fragment Manager
- Native Crash SIGSEGV en Android JNI
- Android: ¿Cómo evitar que la imagen sea escalada en ImageView o ImageButton?
- OnSaveInstanceState no se llama después de rotación de pantalla
- HashMap da una lista desordenada de valores?
- Cambiar permisos de archivo en DDMS (Android)
- ¿Cómo animar el ancho y la altura de un Layout?
- NoClassDefFoundError cuando uso lambda para recorrer String array
Echa un vistazo a esta respuesta (implica algunos cambios en el SlidingUpPanelLayout): https://stackoverflow.com/a/22720204/466937
Lo siento por retraso .. i encontrar la solución.
image = (ImageView) findViewById(R.id.image); //Layout to slide SlidingUpPanelLayout layout = (SlidingUpPanelLayout) findViewById(R.id.sliding_layout); layout.setDragView(image); /*This method sets the layout to be used only in the sliding panel, while all layouts children are able to perform other functions such as scrolling */
Y este es el diseño
<..SlidingUpPanelLayout android:id="@+id/sliding_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center" /> <LinearLayout android:id="@+id/slide_view" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="35dp" android:background="@drawable/ec_image"/> <!-- FINALLY SCROLLVIEW --> <ScrollView .... />
Espero que sea útil.
Supongo que ScrollView
es el hijo de SlidingPanel
?
En ese caso, onInterceptTouchEvent
a su SlidingPanel
para interceptar el evento onTouch
de su ScrollView
cuando y = 0
.
onInterceptTouchEvent
hace las dos siguientes:
- Niño obtiene acción cancelar evento
- El padre consigue el acontecimiento a través de
onTouch
No sé si llegué tarde pero después de trabajar duro algunos días he encontrado que el panel de AndroidSlidingUp tiene un método llamado setScrollView que maneja eventos de desplazamiento correctamente.
Espero que este post sea útil porque estaba pasando mucho tiempo buscando y no encontré algún consejo que me ayude.
- ERROR No hay identificador de paquete al obtener valor para el número de recurso
- Android MediaMetadataRetriever devuelve valores nulos de la mayoría de las claves