我在屏幕上有一个饼图和mapview。在图表和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>
答案 0 :(得分: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);
}
答案 1 :(得分:4)
您可以尝试使用动画来调整此视图的大小。 相反,要将高度和宽度设置为等于某个值,您可能需要从起始高度/宽度设置动画到要使用的高度/宽度。
点击此处https://stackoverflow.com/a/8162779/6093353。此用户编写了一个非常简单的自定义动画来调整视图大小,但您可以编写自己想要的动画。
请告诉我这是否对您有帮助!
答案 2 :(得分:3)
尝试用这个替换OnScroll函数(我没试过这个,也没有在java IDE中输入它,所以也许我没有以正确的方式访问属性,因为我更习惯于C#):
<!DOCTYPE html>
<html xmlns="htpp://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>Home pages</title>
</h:head>
<h:body>
<!-- #{mainBean.username} -->
<h:outputLabel value="Welcome back #{mainBean.username}" style="font-size: 25px;"/>
<footer style="margin-top: 300px; border: 1px solid red;">
<h:outputLabel value="#{msg['page.footer.copyright']}"/>
</footer>
</h:body>
</html>
这应该只有一种方式(从下到上),但有一段时间你应该能够获得你想要的东西。