3
我的应用程序有一个父布局,显示当前位置的谷歌地图,并有一个从谷歌地图屏幕底部动画的子布局,但只有一半的屏幕。我设法用下面的代码完成了这一切。从底部滑动视图在另一个布局
动画为向上滑动和向下滑动:
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聊天窗口。当我们点击其中的键盘时, 聊天窗口会自动向上滑动或Friend Locator App。
我已经回答了类似的东西,看看这个http://stackoverflow.com/questions/25235681/how-can-i-create-a-keyboard-listener-in- android/25236782#25236782 你可以检测到键盘出现和工作分别 –
http://stackoverflow.com/questions/23925907/slidedown-and-slideup-layout-with-animation-android/23926196#23926196查看此答案 –
@ SyedNazarMuhammad:但我怎样才能将它用于Google地图放大和动画分别? –