My App has a Parent Layout which shows Google Map with current location and there is a child layout which animate up from bottom of screen over google Map but only to half of screen . I managed to do that all with following code .
Animations for slide up and slide down :
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>
Main Activity:
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);
}
Child Layout
<?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>
Parent Layout
<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>
Problem is
if Map is zoom-in to extend that if child layout slide up then my map marker gets hide behind the child layout . I want in this situation , my map should little slide up automatically .
Just like Whatsspp chat window . When we click for keyboard in it , chat window slide upward automatically or Friend Locator App .