动画拖动视图以关闭它

时间:2017-05-27 09:39:11

标签: android android-layout android-fragments android-animation android-view

我有一个简单的黄色背景框,如下所示:

<LinearLayout
    android:id="@+id/filter_container"
    android:layout_width="match_parent"
    android:layout_height="400dp"
    android:background="@color/colorYellow"
    android:orientation="vertical">

</LinearLayout>

此布局位于片段内,位于屏幕中央,全宽并位于工具栏下方。 当我单击工具栏中的左上角按钮时,我从此视图顶部滑动,就像过滤器菜单一样:

它原来设置为“INVISIBLE”,当我点击左上角按钮时,我会用这个动画显示它:

slide_down_anim.xml

`<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/accelerate_interpolator"
    android:fromAlpha="0.1" android:toAlpha="1.0"
    android:duration="@android:integer/config_shortAnimTime" />
<translate
    android:duration="@android:integer/config_shortAnimTime"
    android:fromYDelta="-100%" android:toYDelta="0%"
    android:interpolator="@android:anim/accelerate_interpolator"
     />
</set>`

然后重新点击我用这个动画“隐藏”它:

`<?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android">    
    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_interpolator"
        android:fromAlpha="1.0" android:toAlpha="0.0"
        android:fillAfter="true"
        android:duration="@android:integer/config_shortAnimTime" />
    <translate
        android:duration="@android:integer/config_shortAnimTime"
        android:fromYDelta="0%" android:toYDelta="-100%"
        android:interpolator="@android:anim/accelerate_interpolator"
        />
 </set>`

执行此操作的Java代码是:

filterbtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (!isFilterPanelShown){
            filterContiner.bringToFront();
            Animation topDown =             
 AnimationUtils.loadAnimation(getContext(),
                            R.anim.slide_down_anim);
            filterContiner.startAnimation(topDown);
            isFilterPanelShown = true;
            filterContiner.setVisibility(View.VISIBLE);
         } else {
         // Hide filter panel.
         Animation bottomUp = 
AnimationUtils.loadAnimation(getContext(),
                        R.anim.slide_up_anim);
         filterContiner.startAnimation(bottomUp);
         isFilterPanelShown = false;
         }
    }
});

我正在努力实现的是滑动/向上拖动此视图以关闭它。我从使用从此论坛复制的代码处理OnTouchListener开始:

filterContiner.setOnTouchListener(new View.OnTouchListener() {
    float dX, dY;
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                dX = view.getX() - event.getRawX();
                dY = view.getY() - event.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                Log.e("Spostamento verticale",dY+"");
                view.animate()
                    .y(event.getRawY() + dY)
                    .setDuration(0)
                    .start();
                break;
            default:
                return false;
         }
         return true;
    }
});

但我唯一得到的是我可以在任何地方垂直拖动视图,但是当我隐藏并显示它与之前的位置相同时。 我想检查视图是否向顶部拖动一点阈值然后它将关闭动画,否则它应该回到完全显示。

谢谢。

0 个答案:

没有答案