2016-06-20 3 views
8

У меня есть круговая диаграмма и карта на экране. Между графиком и картой есть небольшое изображение. Когда перемещение изображения просматривается, диаграмма и изображение карты должны расти и сжиматься. Он работает, но когда я перемещаю изображение, приложение дрожит. Я хочу, чтобы их размеры менялись плавно. Я думаю, что это связано с круговой диаграммой. Как я могу это исправить? Благодарю. Вот мой 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); 

Вот мой 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

Вы когда-нибудь пробовали ValueAnimator ...? Это позволяет вам изменять свойства просмотра плавно .... – Moinkhan

ответ

4

Вы можете попробовать использовать анимацию для изменения размера этого вида. Вместо того, чтобы установить высоту и ширину, равную значению, возможно, вам нужно оживить от начала высоты/ширины до высоты/ширины, которую вы хотите использовать.

Просьба указать здесь https://stackoverflow.com/a/8162779/6093353. Этот пользователь написал очень простую пользовательскую анимацию для изменения размера представления, но вы можете написать анимацию, которую вы хотите использовать самостоятельно.

Сообщите мне, если это поможет вам!

+0

Спасибо, я предпочитаю использовать жесты вместо анимации. Потому что они более реалистичны. – jason

+0

Да, хорошо! Итак, возможно, вы можете попытаться нарисовать свой вид на холсте, а затем вы можете использовать метод scale() класса Canvas, чтобы изменить его размер во время вашего жеста. Вот пример https://developer.android.com/training/gestures/scale.html –

3

Попробуйте заменить функцию OnScroll этим (я не пробовал этого и не ввел его в Java IDE, поэтому, возможно, я не получаю доступ к свойствам правильно, поскольку я больше привык к 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; 
    } 
}); 

Это должно работать только в одном направлении (сверху вниз), но с некоторым временем вы сможете получить то, что ищете.

+0

Я взял код откуда-то, он работал с изображениями, но не работает с mapview и диаграммой. Поэтому я не очень хорошо знаю код. – jason

+0

Не могли бы вы добавить фотографии того, что происходит и что вы хотите, пожалуйста? Мне трудно понять, чего вы хотите достичь. Из того, что я понимаю, вы хотите масштабировать вверх и вниз по вашей диаграмме и вашему виду карты, когда вы видите изображение «перемещается». Это та часть, которую я не понимаю. Как ваш образ должен двигаться? Вверх и вниз ? Лево и право ? В любом направлении? Почему вы хотите изменить размер диаграммы и карты вместо того, чтобы просто выталкивать их из экрана? –

+0

Хорошо, я думаю, я понял! Если я правильно понял, вы хотите перетащить вверх и вниз по вашей красной линии, и таким образом сделайте свою диаграмму или ваш Mapview заполнить доступное пространство ниже и выше этой линии в зависимости от ее положения. Я прав ? –

5

Для этого вам не нужна анимация. Не вычисляйте height каждый раз. Это решение поможет вам

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