平滑调整图表和地图视图的大小

我在屏幕上有一个饼图和mapview。 在chart和mapview之间,有一个小的imageview。 当imageview移动时,图表和mapview应该会增长和缩小。 它的工作原理,但是当我移动ImageView时,应用程序正在晃动。 我希望他们的尺寸能够顺利地改变。 我认为这是由于饼图。 我怎样才能解决这个问题? 谢谢。 这是我的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> 

你不需要animation来做到这一点。 不要每次计算height 。 这个解决scheme将帮助你

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

您可以尝试使用animation来调整此视图的大小。 相反,要设置高度和宽度等于一个值,也许你必须从起始高度/宽度animation到你想要使用的高度/宽度。

在这里检查https://stackoverflow.com/a/8162779/6093353 。 这个用户写了一个非常简单的自定义animation来调整视图的大小,但是你可以写你想要的animation。

让我知道这是否有助于你!

尝试用这个replaceOnScroll函数(我没有尝试过,也没有在java IDE中input它,所以也许我没有正确访问属性,因为我更习惯于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; } }); 

这应该只有一种方法(到顶部),但有一段时间,你应该能够获得你正在寻找的东西。