我想通过单击箭头键在运行时动态调整地图大小。我的布局是:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MapActivity" >
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.MapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
我想我必须使用MapView和setLayoutParams,但我不确定如何。有人可以帮我怎样做吗? 提前谢谢。
答案 0 :(得分:4)
试试这个: 1)在xml中: -
<com.google.android.gms.maps.MapView
android:id="@+id/map_view"
android:layout_width="fill_parent"
android:layout_height="150dip"
android:background="@android:color/white" />
2)在活动中: -
private GoogleMap mMap;
private MapView mMapView;
private boolean mMapViewExpanded = false;
mMapView = (MapView)findViewById(R.id.map_view);
mMap = mMapView.getMap();
mMap.setOnMapClickListener(new OnMapClickListener() {
@Override
public void onMapClick(LatLng point) {
animateMapView();
}
});
private void animateMapView() {
Logging.d(LOG_TAG, "CLICKED ON THE MAPVIEW");
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) mMapView.getLayoutParams();
ResizeAnimation a = new ResizeAnimation(mMapView);
a.setDuration(250);
if (!getMapViewStatus()) {
mMapViewExpanded = true;
a.setParams(lp.height, dpToPx(getResources(), 300));
} else {
mMapViewExpanded = false;
a.setParams(lp.height, dpToPx(getResources(), 150));
}
mMapView.startAnimation(a);
}
private boolean getMapViewStatus() {
return mMapViewExpanded;
}
public int dpToPx(Resources res, int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, res.getDisplayMetrics());
}
3)ResizeAnimation.java
public class ResizeAnimation extends Animation {
private int startHeight;
private int deltaHeight; // distance between start and end height
private View view;
/**
* constructor, do not forget to use the setParams(int, int) method before
* starting the animation
*
* @param v
*/
public ResizeAnimation(View v) {
this.view = v;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
view.getLayoutParams().height = (int) (startHeight + deltaHeight * interpolatedTime);
view.requestLayout();
}
/**
* set the starting and ending height for the resize animation starting
* height is usually the views current height, the end height is the height
* we want to reach after the animation is completed
*
* @param start
* height in pixels
* @param end
* height in pixels
*/
public void setParams(int start, int end) {
this.startHeight = start;
deltaHeight = end - startHeight;
}
/**
* set the duration for the hideshowanimation
*/
@Override
public void setDuration(long durationMillis) {
super.setDuration(durationMillis);
}
@Override
public boolean willChangeBounds() {
return true;
}
}
答案 1 :(得分:3)
尝试以下方法:
GoogleMap mGoogleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(
R.id.map)).getMap();
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(100, 100);
// I have taken width and hieght 100X100 you can change it as per your need
((SupportMapFragment) getSupportFragmentManager().findFragmentById(
R.id.map)).getView().setLayoutParams(layoutParams);
我在Nexus 4中对此进行了测试,这肯定会有效。
答案 2 :(得分:1)
使用onKeyDown()
方法的基本示例。
GoogleMap mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {
ViewGroup.LayoutParams params = mMap.getView().getLayoutParams();
params.height = 50;
mMap.getView().setLayoutParams(params);
} else if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {
ViewGroup.LayoutParams params = mMap.getView().getLayoutParams();
params.height = 100;
mMap.getView().setLayoutParams(params);
}
return false;
}