1

我的应用程序有一个地图片段。在点击标记时,会从屏幕底部到屏幕的一半显示一个向上滑动的动画。它再次单击标记时向下滑动。

我想要:上滑菜单应该是可点击的或拖动山墙,以便它可以移动到屏幕顶部。更清楚地说,我的意思是单击或拖动位于屏幕一半的上滑菜单时,应该转到屏幕顶部。

到目前为止,我完成了:单击标记时,将向上滑动动画调用到屏幕的一半。:在此处输入图像描述

动画代码: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>

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>

Activity 中在 Marker click 上调用此动画的代码:

 public void toggleList() {
        Fragment f = getFragmentManager().findFragmentByTag(LIST_FRAGMENT_TAG);

        if (f != null) {
            getFragmentManager().popBackStack();
        } else {
            getFragmentManager()
                    .beginTransaction()
                    .setCustomAnimations(R.anim.slide_up,
                            R.anim.slide_down,
                            R.anim.slide_up,
                            R.anim.slide_down)
                    .add(R.id.list_fragment_container, BaseMapSlidingFragment
                                    .instantiate(this, BaseMapSlidingFragment.class.getName()),
                            LIST_FRAGMENT_TAG
                    )
                    .addToBackStack(null).commit();
            googleMap.getUiSettings().setAllGesturesEnabled(false);
            if(animCheck == false){
                animCheck = true;
                }else
            {
                    animCheck= false;
            }


        }}

menu_Sliding.up.xml

<?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="200dp"
        android:background="#7c7c7c">

    <ListView
            android:id="@android:id/list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

</com.trickyandroid.fragmenttranslate.app.view.SlidingRelativeLayout>

自定义视图:

  **package com.trickyandroid.fragmenttranslate.app.view;
    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.ViewTreeObserver;
    import android.widget.RelativeLayout;
    /**
     * Created by paveld on 4/13/14.
     */
    public class SlidingRelativeLayout extends RelativeLayout {
        private float yFraction = 0;
        public SlidingRelativeLayout(Context context) {
            super(context);
        }
        public SlidingRelativeLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
        public SlidingRelativeLayout(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
        private ViewTreeObserver.OnPreDrawListener preDrawListener = null;
        public void setYFraction(float fraction) {
            this.yFraction = fraction;
            if (getHeight() == 0) {
                if (preDrawListener == null) {
                    preDrawListener = new ViewTreeObserver.OnPreDrawListener() {
                        @Override
                        public boolean onPreDraw() {
                            getViewTreeObserver().removeOnPreDrawListener(preDrawListener);
                            setYFraction(yFraction);
                            return true;
                        }
                    };
                    getViewTreeObserver().addOnPreDrawListener(preDrawListener);
                }
                return;
            }
            float translationY = getHeight() * fraction;
            setTranslationY(translationY);
        }
        public float getYFraction() {
            return this.yFraction;
        }
    }**

现在如何在单击屏幕一半的上滑菜单时将此菜单置于屏幕顶部?

4

1 回答 1

1

我建议你使用AndroidSlidingUpPanel库,可以在这里找到。你再写同样的东西是没有意义的。

它有你需要的东西,还有更多。它易于使用和修改(我在我的项目中使用它)。

如何使用

  • 包含com.sothree.slidinguppanel.SlidingUpPanelLayout在您的活动布局中作为根元素。
  • 布局必须将重力设置为顶部或底部。
  • 确保它有两个孩子。第一个孩子是您的主要布局。第二个孩子是您向上滑动面板的布局。
  • 主布局应将宽度和高度设置为match_parent.
  • 滑动布局应将宽度设置为match_parent,将高度设置为match_parentwrap_content或最大期望高度。
  • 默认情况下,整个面板将充当拖动区域,并将拦截单击和拖动事件。setDragView您可以使用方法或umanoDragView属性将拖动区域限制为特定视图。
于 2015-11-26T13:27:12.177 回答