2016-06-20 26 views
8

Ho un grafico a torta e una vista mappa sullo schermo. Tra grafico e mapview, c'è una piccola visione d'immagine. Quando si muove la visualizzazione di immagini, si suppone che il grafico e il mapview crescano e si riducano. Funziona, ma quando sposto imageview, l'app sta tremando. Voglio che le loro dimensioni cambino senza problemi. Penso che sia dovuto al grafico a torta. Come posso risolvere questo? Grazie. Ecco il mio codice Java:Ridimensionamento uniforme di un grafico e di una vista mappa

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); 

Ecco il mio codice 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> 
+0

Hai mai provato ValueAnimator ...? Ti permette di cambiare le proprietà della vista senza problemi .... – Moinkhan

risposta

4

Si può provare ad usare un'animazione per ridimensionare questo punto di vista. Invece di impostare altezza e larghezza equivale a un valore, forse devi animare da iniziare altezza/larghezza all'altezza/larghezza che vuoi usare.

Controlla qui https://stackoverflow.com/a/8162779/6093353. Questo utente ha scritto un'animazione personalizzata molto semplice per ridimensionare una vista, ma puoi scrivere l'animazione che vuoi tu.

Fammi sapere se questo ti aiuta!

+0

Grazie, preferisco usare i gesti invece dell'animazione. Perché sono più realistici. – jason

+0

sì, ok! Quindi, forse puoi provare a disegnare la tua vista su una tela e poi puoi usare il metodo scale() della classe Canvas per ridimensionarla durante il tuo gesto. Qui c'è un esempio https://developer.android.com/training/gestures/scale.html –

3

Provare a sostituire la funzione OnScroll con questo (non l'ho provato, né l'ho digitato in un IDE java, quindi forse non accedo alle proprietà nel modo giusto in quanto sono più abituato 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; 
    } 
}); 

Questo dovrebbe funzionare solo in un modo (verso il basso), ma con un po 'di tempo dovresti essere in grado di ottenere ciò che stai cercando.

+0

Ho preso il codice da qualche parte, funzionava con le immagini ma non funziona con mapview e un grafico. Quindi non conosco molto il codice. – jason

+0

Potresti aggiungere immagini di ciò che accade e cosa vuoi che accada, per favore? È difficile per me capire cosa vuoi ottenere. Da quello che capisco vuoi scalare su e giù la tua Carta e la tua vista della mappa quando la tua immagine "muove". Questa è la parte che non capisco. Come si suppone che il tuo imageView si muova? Su e giù ? Sinistra e destra ? In qualsiasi direzione? Perché vuoi ridimensionare la tua Carta e mappa invece di spingerli fuori dallo schermo? –

+0

Ok penso di aver capito! Se ho capito bene, vuoi trascinare su e giù la tua linea rossa, e in questo modo fai in modo che il tuo grafico o il tuo Mapview riempiano lo spazio disponibile sotto e sopra questa linea a seconda della sua posizione. Ho ragione ? –

5

Non hai bisogno di animazione per farlo. Non calcolare height ogni volta. Questa soluzione ti aiuterà

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); 
} 
Problemi correlati