如何实现umano / AndroidSlidingUpPanel lib

时间:2015-11-25 09:27:08

标签: android android-layout android-animation slidingdrawer slidingpanelayout

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

  

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

到目前为止我已经完成了:点击标记时,将上滑动画调用到屏幕的一半。 :enter image description here

动画代码: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上调用此动画点击:

 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>

Custom_View:

  **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;
        }
    }**

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

1 个答案:

答案 0 :(得分:1)

我建议您使用 AndroidSlidingUpPanel 库,可以找到here。你没有必要再写同样的东西了。

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

如何使用

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