Redimensionamiento suave de un gráfico y una vista de mapa

Tengo un gráfico circular y un mapa en la pantalla. Entre gráfico y mapa, hay una pequeña imagen. Cuando se mueve la vista de la imagen, se supone que el gráfico y la vista del mapa crecen y se contraen. Funciona, pero cuando muevo imageview, app está temblando. Quiero que sus tamaños cambien suavemente. Creo que se debe al gráfico circular. ¿Cómo puedo arreglar esto? Gracias. Aquí está mi código Java:

final LinearLayout aboveLinear = (LinearLayout) findViewById(R.id.aboveLinear); final LinearLayout belowLinear = (LinearLayout) findViewById(R.id.belowLinear); final ImageView imageView2 = (ImageView) findViewById(R.id.imageView2); detector = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if ( aboveLinear == null || belowLinear == null ) { return true; } distanceY*=-1; int height = aboveLinear.getHeight ( ) + mapview.getHeight ( ); ViewGroup.LayoutParams layoutParams = aboveLinear.getLayoutParams ( ); if ( ( int ) distanceY + layoutParams.height < minH ) layoutParams.height = minH; else if ( ( int ) distanceY + layoutParams.height > height - minH ) layoutParams.height = height - minH; else layoutParams.height = ( int ) distanceY + layoutParams.height; ViewGroup.LayoutParams layoutParams2 = belowLinear.getLayoutParams ( ); layoutParams2.height = height - layoutParams.height; aboveLinear.setLayoutParams ( layoutParams ); belowLinear.setLayoutParams ( layoutParams2 ); return true; } }); imageView2.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(final View view, final MotionEvent motionEvent) { return detector.onTouchEvent(motionEvent); } }); mapview = (MapView) findViewById(R.id.mapview); mapview.onCreate(savedInstanceState); chart1 = (PieChart) findViewById(R.id.chart1); chart1.setUsePercentValues(true); chart1.setDescription(""); chart1.setExtraOffsets(5, 10, 5, 5); chart1.setDragDecelerationFrictionCoef(0.95f); 

Aquí está mi código xml:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:mapbox="http://schemas.android.com/apk/res-auto" android:id="@+id/root"> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/aboveLinear"> <com.github.mikephil.charting.charts.PieChart android:id="@+id/chart1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentTop="true" android:scaleType="fitXY"/> </LinearLayout> <ImageView android:id="@+id/imageView2" android:layout_width="match_parent" android:layout_height="25dp" android:layout_alignParentTop="true" android:clickable="true" android:scaleType="fitXY" android:src="@drawable/red"/> <LinearLayout android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:id="@+id/belowLinear"> <com.mapbox.mapboxsdk.maps.MapView android:layout_height="match_parent" android:scaleType="fitXY" android:id="@+id/mapview" android:layout_width="fill_parent" mapbox:access_token="@string/accessToken" mapbox:style_url="@string/style_mapbox_streets" mapbox:center_latitude="41.885" mapbox:center_longitude="-87.679" mapbox:zoom="12" mapbox:tilt="20"/> </LinearLayout> </LinearLayout> 

3 Solutions collect form web for “Redimensionamiento suave de un gráfico y una vista de mapa”

Usted no necesita animación para hacer esto. No calcular height cada vez. Esta solución le ayudará

  private MapView mapview; PieChart chart1; GestureDetectorCompat detector; int minH = 100; int height = 0; private LinearLayout aboveLinear; private LinearLayout belowLinear; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mappie); aboveLinear = (LinearLayout) findViewById(R.id.aboveLinear); belowLinear = (LinearLayout) findViewById(R.id.belowLinear); final ImageView imageView2 = (ImageView) findViewById(R.id.imageView2); detector = new GestureDetectorCompat(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if ( aboveLinear == null || belowLinear == null ) { return true; } if(distanceY > 90){ distanceY = 90; } else if(distanceY < -90){ distanceY = -90; } distanceY*=-1; if(height == 0){ height = aboveLinear.getMeasuredHeight()+belowLinear.getMeasuredHeight();// calculate only once } Log.wtf("Mapie","Height :"+height); int toHeightAL, toHeightBl; ViewGroup.LayoutParams layoutParams = aboveLinear.getLayoutParams ( ); if(layoutParams.height == 0){ layoutParams.height = height/2; // params.height returns 0 before setting the value for it } if ( ( int ) distanceY + layoutParams.height < minH ) toHeightAL = minH; else if ( ( int ) distanceY + layoutParams.height > height - minH ) toHeightAL = height - minH ; else toHeightAL = ( int ) distanceY + layoutParams.height; ViewGroup.LayoutParams layoutParams2 = belowLinear.getLayoutParams (); toHeightBl = height - layoutParams.height; layoutParams.height = toHeightAL; layoutParams2.height = toHeightBl; aboveLinear.setLayoutParams ( layoutParams ); belowLinear.setLayoutParams ( layoutParams2 ); return true; } }); imageView2.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(final View view, final MotionEvent motionEvent) { return detector.onTouchEvent(motionEvent); } }); mapview = (MapView) findViewById(R.id.mapview); mapview.onCreate(savedInstanceState); chart1 = (PieChart) findViewById(R.id.chart1); chart1.setUsePercentValues(true); chart1.setDescription(""); chart1.setExtraOffsets(5, 10, 5, 5); chart1.setDragDecelerationFrictionCoef(0.95f); } 

Puede intentar utilizar una animación para cambiar el tamaño de esta vista. En lugar de establecer altura y ancho es igual a un valor, tal vez usted tiene que animar desde la altura de inicio / ancho a la altura / ancho que desea utilizar.

Compruebe aquí https://stackoverflow.com/a/8162779/6093353 . Este usuario escribió una animación personalizada muy simple para cambiar el tamaño de una vista, pero puede escribir la animación que desee.

¡Déjeme saber si esto le ayuda!

Intenta reemplazar la función OnScroll con esto (no lo intenté, ni lo escribí en un IDE de Java, así que tal vez no esté accediendo a las propiedades de la manera correcta, ya que estoy más acostumbrado a C #):

 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (aboveLinear == null || belowLinear == null) { return true; } int currentY = e1.getY(); float ratio = abovelinear.getHeight() / (aboveLinear.Bottom - currentY); aboveLinear.SetScaleY( aboveLinear.GetScaleY()- ratio); belowLinear.SetScaleY(belowLinear.GetScaleY() +ratio); return true; } }); 

Esto debe funcionar sólo de una manera (hacia abajo a la parte superior), pero con algún tiempo debe ser capaz de obtener lo que está buscando.

  • ¿Cómo obtengo la altura de la pantalla en Android?
  • ¿Cómo calcula Android el caché y el tamaño de los datos?
  • Java: Tamaño de un vector en bytes
  • Obtener altura real de la vista
  • ¿Cómo hacer varias vistas del mismo ancho?
  • Tamaño físico de la fuente en puntos en Android
  • Ancho de notificación de Android
  • ¿Qué teléfonos Android tienen tamaños de pantalla grande
  • Java (Android) Insertar icono en lienzo
  • Tamaño de la aplicación es significativamente mayor de lo esperado?
  • JNI: Cómo obtener el tamaño jbyteArray
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.