Intereting Posts
Почему для местоположения игровых сервисов необходимы разрешения android.permission.WRITE_EXTERNAL_STORAGE и android.permission.READ_EXTERNAL_STORAGE? Android – Как динамически менять текст в настройках? Почему @Override необходимо в Java или Android? Как масштабировать / изменять размер текста в соответствии с TextView? Как обновить зависимости Gradle до их последней версии Обнаружение аппаратного ускорения во время выполнения: Android StartActivityForResult и Intents Дополнительно, кажется, что дополнительные функции не отбрасываются Adb обновить нерыночный apk? Событие масштабирования для карт google на Android Android и Facebook: как получить изображение зарегистрированного пользователя Один файл .apk, который устанавливает два приложения Проблема с Android 2.2 VideoView Перенастройка растрового изображения на Google Maps v2 для Android Android-браузер: touchcancel уволен, хотя touchmove предотвращаетDefault Переход анимации между действиями с использованием FLAG_ACTIVITY_CLEAR_TOP

Плавное изменение размера карты и карты

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

Solutions Collecting From Web of "Плавное изменение размера карты и карты"

Для этого вам не нужна анимация. Не вычисляйте 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); } 

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

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

Дайте мне знать, если это вам поможет!

Попробуйте заменить функцию 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; } }); 

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