Intereting Posts
Java.lang.NullPointerException: попытка вызвать метод интерфейса «java.util.Iterator java.lang.Iterable.iterator ()» при запуске уведомления Почему Android Studio говорит «Ожидание отладчика», если НЕ отлаживается? Android: AutoCompleteTextView с предложениями по умолчанию Android создает селектор программно Android Glide: как загружать и кэшировать растровые изображения? Запустить приложение камеры по умолчанию (без возврата) Android Как настроить макет в полноэкранном режиме, когда видна клавиатура Изменение размера DatePicker в android Как измеряется точность определения местоположения в Android? Он раздувает представление без поля Изменение позиции панели действий Android MPAndroidChart: нижняя ось x и несколько y-осей Выполнение определенного модульного теста с помощью градиента "Java.lang.IllegalStateException: не может быть вызван для доставки результата" Полезно ли использовать весь макет WebView в собственном приложении для Android?

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

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

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