Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Que sería lo mejor para hacer una aplicación de desplazamiento horizontal en android?

Tengo que hacer una aplicación en la que el usuario se mueve alrededor de una pantalla, que es como nuestra pantalla de inicio de Android.

Hay una lista de imágenes que vienen, y podemos desplazarnos por las imágenes en un desplazamiento horizontal er.

  • ¿Cuál es el equivalente de setTimeOut () javascript a Android?
  • MService.consumePurchase (3, packageName, purchaseToken) devuelve siempre RESULT_DEVELOPER_ERROR = 5 - argumentos no válidos proporcionados a la API
  • Extensible lista-vista de Android, establecer personalizado drawables
  • La plataforma L es una vista previa y requiere el manifiesto de aplicación para establecer minSdkVersion en 'L'
  • Formato Flotación a n decimales
  • TextInputLayout: color diferente para la etiqueta de indicación cuando no está enfocado
  • El usuario no puede cambiar la ubicación de las imágenes, es como algunas miniaturas dispuestas sobre una pantalla horizontal

    Esto es como el control de paginación en el desarrollo de aplicaciones iPhone.

    He tratado de encontrar maneras de hacer esto, pero soy bastante nuevo en android y quería saber la mejor manera de lograr lo anterior?

    He oído hablar del control de la galería, pero no estoy seguro si se adaptará a mis propósitos.

    También si puedes dar enlaces a las respuestas que sugieres .. sería genial como si hay un nuevo controlador involucrado, voy a ser capaz de entender mejor como todavía estoy un más fresco. Gracias de antemano.

    Editar: Para aquellos que no están familiarizados con la vista de paginación del iPhone, aquí hay un ejemplo de vídeo.

  • Generic OR en lugar de AND <T extends Number | CharSequence>
  • Android ProgressBar.setProgressDrawable sólo funciona una vez?
  • Utilizar mockito para probar la función que utiliza un contexto
  • Reemplazar un fragmento mediante programación
  • ¿Cómo puedo comprobar el consumo de red de mi aplicación Android?
  • Firebase + Permisos
  • 10 Solutions collect form web for “Que sería lo mejor para hacer una aplicación de desplazamiento horizontal en android?”

    Bueno, usted podría mirar el código fuente para la pantalla de inicio de Android , ya que es de código abierto. Tal vez usted puede obtener algunas ideas de allí.

    La biblioteca GreenDroid (una colección de componentes Android útiles) ha añadido recientemente una clase PagedView que hace exactamente lo que está buscando. También incluye un PageIndicator que funciona como los puntos iOS.

    Utiliza un sistema de adaptador, similar a ListView (con eficiente reutilización de vista, etc), que no he visto en ninguna de las otras implementaciones de este patrón.


    Código fuente : https://github.com/cyrilmottier/GreenDroid

    Aplicación de demostración : https://market.android.com/details?id=com.cyrilmottier.android.gdcatalog

    Puede utilizar un HorizontalScrollView para contener un LinearLayout que contenga todas las vistas de imagen.

    Creo que quieres como el control de paginación en el desarrollo de la aplicación iphone, en android esta funcionalidad está disponible mediante ViewFlipper . Puede ayudarle a que desee implementar.

    Al igual que dmon dijo que puede probar algo con la aplicación de pantalla de inicio de Android o probar esta http://code.google.com/p/deezapps-widgets/

    Esto me parece una implementación personalizada de la pantalla de inicio de android .. y tiene el control de página, así como jus como el iphone .. Creo que esto es lo que está buscando …

    He hackeado alrededor con los artículos publicados aquí: Horizontal "tab" ish desplazamiento entre las vistas

    Tuve buena suerte replicando un tipo de desplazamiento horizontal navegación que su descripción.

    Aquí hay una solución a este problema con un montón de código útil.

    He publicado código para hacer algo como la pantalla de inicio de Android antes: Desarrollo de una pantalla de inicio de Android

    Tenga en cuenta que hará que la pantalla entera voltear entre las páginas, no funcionará si desea voltear sólo parte de la pantalla como se muestra en el video que vinculado.

    Primero el código fuente

     package com.matthieu.launcher; import android.content.Context; import android.util.Log; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewGroup; import android.view.ViewConfiguration; import android.widget.Scroller; public class DragableSpace extends ViewGroup { private Scroller mScroller; private VelocityTracker mVelocityTracker; private int mScrollX = 0; private int mCurrentScreen = 0; private float mLastMotionX; private static final String LOG_TAG = "DragableSpace"; private static final int SNAP_VELOCITY = 1000; private final static int TOUCH_STATE_REST = 0; private final static int TOUCH_STATE_SCROLLING = 1; private int mTouchState = TOUCH_STATE_REST; private int mTouchSlop = 0; public DragableSpace(Context context) { super(context); mScroller = new Scroller(context); mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); this.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.FILL_PARENT)); } public DragableSpace(Context context, AttributeSet attrs) { super(context, attrs); mScroller = new Scroller(context); mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); this.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT , ViewGroup.LayoutParams.FILL_PARENT)); TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.DragableSpace); mCurrentScreen = a.getInteger(R.styleable.DragableSpace_default_screen, 0); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { /* * This method JUST determines whether we want to intercept the motion. * If we return true, onTouchEvent will be called and we do the actual * scrolling there. */ /* * Shortcut the most recurring case: the user is in the dragging state * and he is moving his finger. We want to intercept this motion. */ final int action = ev.getAction(); if ((action == MotionEvent.ACTION_MOVE) && (mTouchState != TOUCH_STATE_REST)) { return true; } final float x = ev.getX(); switch (action) { case MotionEvent.ACTION_MOVE: /* * mIsBeingDragged == false, otherwise the shortcut would have caught it. Check * whether the user has moved far enough from his original down touch. */ /* * Locally do absolute value. mLastMotionX is set to the y value * of the down event. */ final int xDiff = (int) Math.abs(x - mLastMotionX); boolean xMoved = xDiff > mTouchSlop; if (xMoved) { // Scroll if the user moved far enough along the X axis mTouchState = TOUCH_STATE_SCROLLING; } break; case MotionEvent.ACTION_DOWN: // Remember location of down touch mLastMotionX = x; /* * If being flinged and user touches the screen, initiate drag; * otherwise don't. mScroller.isFinished should be false when * being flinged. */ mTouchState = mScroller.isFinished() ? TOUCH_STATE_REST : TOUCH_STATE_SCROLLING; break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: // Release the drag mTouchState = TOUCH_STATE_REST; break; } /* * The only time we want to intercept motion events is if we are in the * drag mode. */ return mTouchState != TOUCH_STATE_REST; } @Override public boolean onTouchEvent(MotionEvent event) { if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } mVelocityTracker.addMovement(event); final int action = event.getAction(); final float x = event.getX(); switch (action) { case MotionEvent.ACTION_DOWN: Log.i(LOG_TAG, "event : down"); /* * If being flinged and user touches, stop the fling. isFinished * will be false if being flinged. */ if (!mScroller.isFinished()) { mScroller.abortAnimation(); } // Remember where the motion event started mLastMotionX = x; break; case MotionEvent.ACTION_MOVE: // Log.i(LOG_TAG,"event : move"); // if (mTouchState == TOUCH_STATE_SCROLLING) { // Scroll to follow the motion event final int deltaX = (int) (mLastMotionX - x); mLastMotionX = x; //Log.i(LOG_TAG, "event : move, deltaX " + deltaX + ", mScrollX " + mScrollX); if (deltaX < 0) { if (mScrollX > 0) { scrollBy(Math.max(-mScrollX, deltaX), 0); } } else if (deltaX > 0) { final int availableToScroll = getChildAt(getChildCount() - 1) .getRight() - mScrollX - getWidth(); if (availableToScroll > 0) { scrollBy(Math.min(availableToScroll, deltaX), 0); } } // } break; case MotionEvent.ACTION_UP: Log.i(LOG_TAG, "event : up"); // if (mTouchState == TOUCH_STATE_SCROLLING) { final VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000); int velocityX = (int) velocityTracker.getXVelocity(); if (velocityX > SNAP_VELOCITY && mCurrentScreen > 0) { // Fling hard enough to move left snapToScreen(mCurrentScreen - 1); } else if (velocityX < -SNAP_VELOCITY && mCurrentScreen < getChildCount() - 1) { // Fling hard enough to move right snapToScreen(mCurrentScreen + 1); } else { snapToDestination(); } if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } // } mTouchState = TOUCH_STATE_REST; break; case MotionEvent.ACTION_CANCEL: Log.i(LOG_TAG, "event : cancel"); mTouchState = TOUCH_STATE_REST; } mScrollX = this.getScrollX(); return true; } private void snapToDestination() { final int screenWidth = getWidth(); final int whichScreen = (mScrollX + (screenWidth / 2)) / screenWidth; Log.i(LOG_TAG, "from des"); snapToScreen(whichScreen); } public void snapToScreen(int whichScreen) { Log.i(LOG_TAG, "snap To Screen " + whichScreen); mCurrentScreen = whichScreen; final int newX = whichScreen * getWidth(); final int delta = newX - mScrollX; mScroller.startScroll(mScrollX, 0, delta, 0, Math.abs(delta) * 2); invalidate(); } public void setToScreen(int whichScreen) { Log.i(LOG_TAG, "set To Screen " + whichScreen); mCurrentScreen = whichScreen; final int newX = whichScreen * getWidth(); mScroller.startScroll(newX, 0, 0, 0, 10); invalidate(); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childLeft = 0; final int count = getChildCount(); for (int i = 0; i < count; i++) { final View child = getChildAt(i); if (child.getVisibility() != View.GONE) { final int childWidth = child.getMeasuredWidth(); child.layout(childLeft, 0, childLeft + childWidth, child .getMeasuredHeight()); childLeft += childWidth; } } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); final int width = MeasureSpec.getSize(widthMeasureSpec); final int widthMode = MeasureSpec.getMode(widthMeasureSpec); if (widthMode != MeasureSpec.EXACTLY) { throw new IllegalStateException("error mode."); } final int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (heightMode != MeasureSpec.EXACTLY) { throw new IllegalStateException("error mode."); } // The children are given the same width and height as the workspace final int count = getChildCount(); for (int i = 0; i < count; i++) { getChildAt(i).measure(widthMeasureSpec, heightMeasureSpec); } Log.i(LOG_TAG, "moving to screen "+mCurrentScreen); scrollTo(mCurrentScreen * width, 0); } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { mScrollX = mScroller.getCurrX(); scrollTo(mScrollX, 0); postInvalidate(); } } } 

    Y el archivo de diseño:

     <?xml version="1.0" encoding="utf-8"?> <com.matthieu.launcher.DragableSpace xmlns:app="http://schemas.android.com/apk/res/com.matthieu.launcher" xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/space" android:layout_width="fill_parent" android:layout_height="fill_parent" app:default_screen="1" > <include android:id="@+id/left" layout="@layout/left_screen" /> <include android:id="@+id/center" layout="@layout/initial_screen" /> <include android:id="@+id/right" layout="@layout/right_screen" /> </com.matthieu.launcher.DragableSpace> 

    Para poder tener el atributo extra en el archivo xml, desea guardarlo en res / values ​​/ attrs.xml

     <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="DragableSpace"> <attr name="default_screen" format="integer"/> </declare-styleable> </resources> 

    El original SO post también tiene algunos comentarios para que funcione correctamente …

    Si está interesado en duplicar el control de paginación de estilo de pantalla de inicio, eche un vistazo a esto , con fuente en Github . Incluso incluye código para hacer los pequeños puntos de página en la parte inferior.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.