向上拖动时隐藏视图

时间:2014-09-26 08:31:02

标签: android

我有2个LinearLayout的布局。第一个用作包含图形的容器,第二个包含几个按钮。

1

当应用启动时,首次包含图表的LinearLayout1将被隐藏View.GONE

2

然后当我触摸LinearLayout2的按钮时,此布局会使用翻译动画返回原始位置。

3

最后,我应该能够再次隐藏LinearLayout1。我想通过向上拉动LinearLayout2来实现这一点,所以当用户向上移动一点LinearLayout2时,LinearLayouy1将再次被View.GONE隐藏。

4

最后一部分是我需要一些帮助的部分。我用OnTochListener()尝试了一些东西,但是我没有用太多的东西,我不知道怎么做。这是我执行此操作的代码snnipet:

/*Layout views*/
private View graphContainer;  //This is the LinearLayout1
private View valuesContainer; //This is the LinearLayout2
private float oldY;
private float newY;

...

valuesContainer.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                float y = event.getY();
                oldY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                float y2 = event.getRawY();
                newY = y2;
                if (oldY < newY) {
                    graphContainer.setVisibility(View.GONE);
                }
                break;
         }
         return true;
    }
});

根据我触摸的位置进行移动,我可以将可见性设置为GONE,但移动不是我想要的,我不会移动LinearLayout2。

2 个答案:

答案 0 :(得分:1)

当用户移动手指时,你上面所做的就是隐藏layout2。

你说那是&#34;你不能移动LinearLayout2&#34; - &GT;为了移动视图,您需要更新它的LayoutParams。您可以在此处查看示例:How to move a view in Android?

这样你就可以推动&#34; layout2 up和某些时候隐藏layout1(使用动画或推送layout1)。希望这会有所帮助。

修改(请求的代码示例):

当视图的参数需要改变时,BTW - animations transitions是更好的方法。这不是你问题的答案,因为你想要一个真实的&#34;拖动&#34;感觉(上升时)。 另外 - android L has some beautiful animations(我还没有使用过)我们应该留意。

所以...使用如下布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MyActivity">

    <LinearLayout
        android:id="@+id/first_layout"
        android:background="@android:color/darker_gray"
        android:layout_width="match_parent"
        android:layout_height="100dp" >
    </LinearLayout>

    <LinearLayout
        android:id="@+id/second_layout"
        android:background="@android:color/holo_green_dark"
        android:layout_width="match_parent"
        android:layout_height="100dp" >
    </LinearLayout>
</LinearLayout>

以及相应的活动如下:

    public class MyActivity extends Activity {

    int yDown = 0;
    int initialTopMargin = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        LinearLayout layout2 = (LinearLayout)findViewById(R.id.second_layout);

        layout2.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event)
            {
                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) view.getLayoutParams();

                switch (event.getAction())
                {
                    case MotionEvent.ACTION_MOVE:
                        params.topMargin = initialTopMargin - (yDown - (int)event.getRawY());
                        view.setLayoutParams(params);
                        break;

                    case MotionEvent.ACTION_DOWN:
                        yDown = (int)event.getRawY();
                        initialTopMargin = params.topMargin;
                        break;
                }

                return true;
            }
        });
    }
}

答案 1 :(得分:0)

如何使用onDragListener

    valuesContainer.setOnDragListener(new OnDragListener() {
    @Override
    public boolean onDrag(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                float y = event.getY();
                oldY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                float y2 = event.getRawY();
                newY = y2;
                if (oldY < newY) {
                    graphContainer.setVisibility(View.GONE);
                }
                break;
         }
         return true;
    }
});