【发布时间】:2016-01-07 01:38:03
【问题描述】:
我的应用程序有一个父布局,它显示带有当前位置的谷歌地图,还有一个子布局,它从屏幕底部向上动画到谷歌地图,但只到屏幕的一半。我设法用以下代码做到了这一切。
上下滑动动画:
slide_down.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="yFraction"
android:valueType="floatType"
android:valueFrom="0.58"
android:valueTo="1.0"
android:duration="@android:integer/config_mediumAnimTime"/>
<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="alpha"
android:valueType="floatType"
android:valueFrom="1"
android:valueTo="0"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
slide_up.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="yFraction"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="0.58"
android:duration="@android:integer/config_mediumAnimTime"/>
<objectAnimator
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:propertyName="alpha"
android:valueType="floatType"
android:valueFrom="0.58"
android:valueTo="1.0"
android:duration="@android:integer/config_mediumAnimTime"/>
</set>
主要活动:
public class MainActivity extends FragmentActivity implements LocationListener{
GoogleMap googleMap;
private static final String LIST_FRAGMENT_TAG = "list_fragment";
Location mlocation;
String mLastUpdateTime;
double latitude;
double longitude;
int Radius = 100;
Boolean flag = false ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.maps);
googleMap = mapFragment.getMap();
googleMap.setMyLocationEnabled(true);
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String bestProvider = locationManager.getBestProvider(criteria, true);
mlocation = locationManager.getLastKnownLocation(bestProvider);
if (mlocation != null) {
onLocationChanged(mlocation);
}
locationManager.requestLocationUpdates(bestProvider, 20000, 0, this);
}
@Override
public void onLocationChanged(Location location) {
mlocation = location;
latitude = location.getLatitude();
longitude = location.getLongitude();
LatLng latLng = new LatLng(latitude, longitude);
long atTime = mlocation.getTime();
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date(atTime));
googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
View marker = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.custom_marker_layout, null);
CameraPosition INIT =
new CameraPosition.Builder()
.target(latLng)
.zoom(17.5F)
.bearing(300F) // orientation
.tilt(50F) // viewing angle
.build();
googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(INIT));
googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 13));
googleMap.addMarker(new MarkerOptions()
.position(latLng)
// .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE))
.icon(BitmapDescriptorFactory.fromBitmap(createDrawableFromView(this, marker)))
.title(getAdress())
.snippet("Radius: " + Radius)).showInfoWindow();
googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
flag = true;
toggleList();
return true;
}
});
if(flag == false){
googleMap.getUiSettings().setAllGesturesEnabled(true);
}
private void toggleList() {
Fragment f = getFragmentManager().findFragmentByTag(LIST_FRAGMENT_TAG);
googleMap.getUiSettings().setAllGesturesEnabled(true);
if (f != null) {
getFragmentManager().popBackStack();
} else {
getFragmentManager().beginTransaction()
.setCustomAnimations(R.animator.slide_up,
R.animator.slide_down,
R.animator.slide_up,
R.animator.slide_down)
.add(R.id.list_fragment_container, SlidingListFragment
.instantiate(this, SlidingListFragment.class.getName()),
LIST_FRAGMENT_TAG
)
.addToBackStack(null).commit();
googleMap.getUiSettings().setAllGesturesEnabled(false);
}
子布局
<?xml version="1.0" encoding="utf-8"?>
<com.trickyandroid.fragmenttranslate.app.view.SlidingRelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:id="@+id/hidden_panel"
android:background="#ffffffff">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</com.trickyandroid.fragmenttranslate.app.view.SlidingRelativeLayout>
父布局
<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"
tools:context="com.trickyandroid.fragmenttranslate.app.MainActivity">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/maps"
class="com.google.android.gms.maps.SupportMapFragment"/>
<FrameLayout
android:id="@+id/list_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
问题是
如果地图是放大的,如果子布局向上滑动,那么我的地图 标记隐藏在子布局后面。我想在这种情况下, 我的地图应该不会自动向上滑动。
就像 Whatsspp 聊天窗口一样。当我们点击其中的键盘时, 聊天窗口自动向上滑动或朋友定位器应用程序。
【问题讨论】:
-
我已经回答了类似的问题,看看这个stackoverflow.com/questions/25235681/…你可以分别检测键盘何时出现和工作
-
@SyedNazarMuhammad:但是我如何分别将它用于 Google 地图放大和动画?
-
@AndoMasahashi:嘿,问题不在于动画到 center 。我的问题是,当我的视图在放大的谷歌地图(父布局)上进行动画处理时,它会在谷歌地图上隐藏我的标记。我希望我的谷歌地图自动向上滑动,以便我的动画视图也标记
-
我可以建议您在上下滑动时更改地图的相机位置。 @young_08
标签: android google-maps android-animation google-maps-android-api-2