在运行时重新调整地图大小

时间:2014-02-11 04:41:07

标签: android android-maps-v2

我想通过单击箭头键在运行时动态调整地图大小。我的布局是:

<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,但我不确定如何。有人可以帮我怎样做吗? 提前谢谢。

3 个答案:

答案 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;
}