화면 하단에서 레이아웃을 위로 슬라이드


92

뷰에서 숨겨진 레이아웃이 있습니다. 버튼을 클릭하면 채팅 화면에서 whatsapp이 이모티콘 패널을 표시하는 방식과 매우 유사하게 전체 화면 콘텐츠를 위로 밀어 아래에서 위로 슬라이드합니다.

나는 나를 위해 작동하지 않는 SlidingDrawer를 보았다. 화면 중앙에 표시되는 핸들로 이미지가 필요합니다. 또한 기존 화면 콘텐츠 위로 슬라이드하므로 기존 콘텐츠를 위로 이동하는 방법을 찾고 있습니다.

업데이트 1 :

저는 Sanket Kachhela가 제안한 애니메이션을 사용해 보았습니다. 그러나 숨겨진 레이아웃은 표시되지 않습니다. 다음은 코드입니다.

레이아웃 (activity_main.xml) :

<RelativeLayout
    android:id="@+id/main_screen"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" 
        android:layout_alignParentTop="true"/>

     <TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="@string/hello_world" 
       android:layout_centerInParent="true"/>

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Slide up / down"
        android:layout_alignParentBottom="true" 
        android:onClick="slideUpDown"/>

</RelativeLayout>

<RelativeLayout
    android:id="@+id/hidden_panel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:layout_below="@id/main_screen">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name" />

</RelativeLayout>

활동 (MainActivity.java) :

package com.example.slideuplayout;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;

public class MainActivity extends Activity {

private ViewGroup hiddenPanel;
private boolean isPanelShown;

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

    hiddenPanel = (ViewGroup)findViewById(R.id.hidden_panel);
    hiddenPanel.setVisibility(View.INVISIBLE);
    isPanelShown = false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void slideUpDown(final View view) {
    if(!isPanelShown) {
        // Show the panel
        Animation bottomUp = AnimationUtils.loadAnimation(this,
                R.anim.bottom_up);

        hiddenPanel.startAnimation(bottomUp);
        hiddenPanel.setVisibility(View.VISIBLE);
        isPanelShown = true;
    }
    else {
        // Hide the Panel
        Animation bottomDown = AnimationUtils.loadAnimation(this,
                R.anim.bottom_down);

        hiddenPanel.startAnimation(bottomDown);
        hiddenPanel.setVisibility(View.INVISIBLE);
        isPanelShown = false;
    }
}

}

애니메이션 :

bottom_up.xml :

<?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate 
       android:fromYDelta="75%p"
       android:toYDelta="0%p"
       android:fillAfter="true"
       android:duration="500" />
</set>

bottom_down.xml :

<?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android">
<translate 
    android:fromYDelta="0%p" 
    android:toYDelta="100%p" 
    android:fillAfter="true"
    android:interpolator="@android:anim/linear_interpolator"
    android:duration="500" />
</set>

이것이 어떻게 할 수 있는지 어떤 아이디어?

감사.


1
대답을 시도해 보셨습니까?
Sanket Kachhela

1
hidden_panel 레이아웃이 다른 레이아웃보다 뒤처 질 수 있습니다. hiddenPanel.bringToFront()애니메이션을 시작하기 전에 호출 하여 작동하는지 확인하십시오. 또한 그래픽 레이아웃에서 hidden_panel보기를 받고 activity_main.xml있습니까?
imthegiga

1
@Babar는 위 / 아래로 슬라이딩 버튼을 클릭하면 숨겨진 레이아웃이 그에 따라 확장되거나 축소되어야 함을 의미합니까? i 전화 유형 슬라이더?
TheFlash

1
@Babar 내 대답이 작동합니까?
수퍼 유저

1
당신은 볼 수 github.com/Ali-Rezaei/SlidingDrawer 당신이 어떤 측면에서 슬라이드 가능을 mekes.
Ali

답변:


151

다음 애니메이션을 사용하십시오.

bottom_up.xml

<?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android">
   <translate android:fromYDelta="75%p" android:toYDelta="0%p" 
    android:fillAfter="true"
 android:duration="500"/>
</set>

bottom_down.xml

 <?xml version="1.0" encoding="utf-8"?>
 <set xmlns:android="http://schemas.android.com/apk/res/android">

<translate android:fromYDelta="0%p" android:toYDelta="100%p" android:fillAfter="true"
            android:interpolator="@android:anim/linear_interpolator"
    android:duration="500" />

</set>

보기를 숨기거나 애니메이션하려면 활동에서이 코드를 사용하십시오.

Animation bottomUp = AnimationUtils.loadAnimation(getContext(),
            R.anim.bottom_up);
ViewGroup hiddenPanel = (ViewGroup)findViewById(R.id.hidden_panel);
hiddenPanel.startAnimation(bottomUp);
hiddenPanel.setVisibility(View.VISIBLE);

1
위의 코드를 사용해 보았지만 숨겨진 뷰가 나타나지 않았습니다. 질문을 업데이트하고 레이아웃과 자바 코드를 추가했습니다. 감사.
Babar

2
.setVisibility(View.VISIBLE)내 하루를 구했습니다!
Si8 2013-10-11

1
@sanket 안녕 나는 그것이 잘 작동하는 당신의 코드를 사용했지만 잠시 동안 잠자기 위해 스레드를 만들어야하고 아래의 애님을 사용해야하므로 어떻게 할 수 있습니까?
Anas Reza 2014

1
난 당신이 startOffset을 uset 수 있다고 생각합니다 ..이 문서의 참조 developer.android.com/reference/android/view/animation/...
Sanket Kachhela

6
애니메이션이 시작되기 전에 내 뷰가 이동할 빈 공간이 있습니다. 어떤 생각?
An-droid 2014

42

당신은 가까웠습니다. 핵심은 숨겨진 레이아웃을 match_parent높이와 무게 모두에서 팽창시키는 것 입니다. 간단히 View.GONE. 이렇게하면 애니메이터의 백분율 사용이 제대로 작동합니다.

레이아웃 (activity_main.xml) :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_screen"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="@string/hello_world" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/hello_world" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:onClick="slideUpDown"
        android:text="Slide up / down" />

    <RelativeLayout
        android:id="@+id/hidden_panel"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/white"
        android:visibility="gone" >

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/app_name"
            android:layout_centerInParent="true"
            android:onClick="slideUpDown" />
    </RelativeLayout>

</RelativeLayout>

활동 (MainActivity.java) :

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;

public class OffscreenActivity extends Activity {
    private View hiddenPanel;

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

        hiddenPanel = findViewById(R.id.hidden_panel);
    }

    public void slideUpDown(final View view) {
        if (!isPanelShown()) {
            // Show the panel
            Animation bottomUp = AnimationUtils.loadAnimation(this,
                    R.anim.bottom_up);

            hiddenPanel.startAnimation(bottomUp);
            hiddenPanel.setVisibility(View.VISIBLE);
        }
        else {
            // Hide the Panel
            Animation bottomDown = AnimationUtils.loadAnimation(this,
                    R.anim.bottom_down);

            hiddenPanel.startAnimation(bottomDown);
            hiddenPanel.setVisibility(View.GONE);
        }
    }

    private boolean isPanelShown() {
        return hiddenPanel.getVisibility() == View.VISIBLE;
    }

}

내가 바꾼 다른 것은 bottom_up.xml. 대신에

android:fromYDelta="75%p"

나는 사용했다 :

android:fromYDelta="100%p"

그러나 그것은 선호의 문제라고 생각합니다.


이것은 나를 위해 작동하지 않았고 숨겨진 패널이 나타나지만 화면에 이미 표시된 텍스트가 숨겨져 있었고 '슬라이드 위 / 아래'버튼이 화면 모서리에서 수평으로 중앙으로 이동했습니다.
Babar

슬라이딩 레이아웃이 부모 레이아웃의 다른 모든 구성 요소를 덮을 수없는 이유를 알 수 있습니까? 귀하의 코드를 성공적으로 구현했습니다. 그러나 내 요구 사항을 위해 부모 레이아웃에 다른 선형 레이아웃을 추가했습니다. 레이아웃이 나타납니다 슬라이딩 때, 그것은 이러한 레이아웃을 포함 할 수 없습니다
개비

@gabby 당신은 설정해야 할 수 있습니다 android:zAdjustment="top"당신에 Animation또는 AnimtionSet.
Paul Burke

작동하지 않았습니다. .my 애니메이션은 다음과 같습니다. <? xml version = "1.0"encoding = "utf-8"?> <set xmlns : android = " schemas.android.com/apk/res/android "> <translate android : fromYDelta = "0 % p"android : toYDelta = "100 % p"android : fillAfter = "true"android : interpolator = "@ android : anim / linear_interpolator"android : duration = "400"android : zAdjustment = "top"/> < / set>
gabby

3
이것은 정답으로 표시되어야합니다. 감사 @PaulBurke
RMK


7

결국 나를 위해 일한 것이 있습니다.

레이아웃 :

activity_main.xml

<RelativeLayout
    android:id="@+id/main_screen"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" 
        android:layout_alignParentTop="true"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world"
        android:layout_centerInParent="true" />

    <Button
        android:id="@+id/slideButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Slide up / down"
        android:layout_alignParentBottom="true" 
        android:onClick="slideUpDown"/>

</RelativeLayout>

hidden_panel.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/hidden_panel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
    <Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Test" />
</LinearLayout>

자바 : com.example.slideuplayout 패키지;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;

public class MainActivity extends Activity {

private ViewGroup hiddenPanel;
private ViewGroup mainScreen;
private boolean isPanelShown;
private ViewGroup root;

int screenHeight = 0;

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

    mainScreen = (ViewGroup)findViewById(R.id.main_screen);
    ViewTreeObserver vto = mainScreen.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
        @Override 
        public void onGlobalLayout() { 
            screenHeight = mainScreen.getHeight();
            mainScreen.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
        } 
    }); 

    root = (ViewGroup)findViewById(R.id.root);

    hiddenPanel = (ViewGroup)getLayoutInflater().inflate(R.layout.hidden_panel, root, false);
    hiddenPanel.setVisibility(View.INVISIBLE);

    root.addView(hiddenPanel);

    isPanelShown = false;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

public void slideUpDown(final View view) {
    if(!isPanelShown) {
        // Show the panel
        mainScreen.layout(mainScreen.getLeft(),
                          mainScreen.getTop() - (screenHeight * 25/100), 
                          mainScreen.getRight(),
                          mainScreen.getBottom() - (screenHeight * 25/100));



        hiddenPanel.layout(mainScreen.getLeft(), mainScreen.getBottom(), mainScreen.getRight(), screenHeight);
        hiddenPanel.setVisibility(View.VISIBLE);

        Animation bottomUp = AnimationUtils.loadAnimation(this,
                R.anim.bottom_up);

        hiddenPanel.startAnimation(bottomUp);

        isPanelShown = true;
    }
    else {
        isPanelShown = false;

        // Hide the Panel
        Animation bottomDown = AnimationUtils.loadAnimation(this,
                R.anim.bottom_down);
        bottomDown.setAnimationListener(new AnimationListener() {

            @Override
            public void onAnimationStart(Animation arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationRepeat(Animation arg0) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onAnimationEnd(Animation arg0) {
                isPanelShown = false;

                mainScreen.layout(mainScreen.getLeft(),
                          mainScreen.getTop() + (screenHeight * 25/100), 
                          mainScreen.getRight(),
                          mainScreen.getBottom() + (screenHeight * 25/100));

                hiddenPanel.layout(mainScreen.getLeft(), mainScreen.getBottom(), mainScreen.getRight(), screenHeight);
            }
        });
        hiddenPanel.startAnimation(bottomDown);
    }
}
}

1
루트 무엇 @Babar
1baga

1
main_screen을 캡슐화하는 부모 레이아웃입니다. 초과 UI 요소를 제거하려고 할 때 여기에 붙여 넣은 코드에서 제거하게 된 것 같습니다. 선형 또는 상대 레이아웃이었습니다.
Babar

그 대답은 받아 들여지고 루트 요소가 없으며 아무것도 없습니다 ???? 이것이 어떻게 받아 들여질 수 있습니까 ??
Zahan Safallwa

5

이 레이아웃을 사용하십시오. 메인 뷰 축소를 애니메이션하려면 숨겨진 막대의 높이에 애니메이션을 추가해야합니다. 막대에서 애니메이션 변환을 사용하고 애니메이션 대신 메인 뷰 높이 점프를 사용하는 것이 좋을 수도 있습니다.

<LinearLayout 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"
android:orientation="vertical" >

<RelativeLayout
    android:id="@+id/main_screen"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="@string/hello_world" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="@string/hello_world" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:onClick="slideUpDown"
        android:text="Slide up / down" />
</RelativeLayout>

<RelativeLayout
    android:id="@+id/hidden_panel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:background="#fcc"
    android:visibility="visible" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name" />
</RelativeLayout>

</LinearLayout>

'슬라이드 업'버튼을 클릭하면 레이아웃 메서드를 호출하여 프로그래밍 방식으로 main_screen 및 숨겨진 패널의 위치를 ​​위쪽으로 변경 한 다음 숨겨진 뷰에서 startAnimation을 호출합니다. 이렇게하면 숨겨진 패널이 제자리에 나타납니다. 그러나 어떤 이유로 패널 내부의 버튼이 표시되지 않습니다. 패널이 비어 있습니다. 버튼이 표시되지 않는 이유는 무엇입니까?
Babar

숨겨진 패널의 가시성을 표시로 변경해야합니다. 당신의 설명에서, 나는 버튼의 가시성이 변경되었거나 버튼 너비 / 높이가 제로의 추측입니다
yoah

4

두 가지 가능한 접근 방식이 있습니다. 가장 간단한 방법은 슬라이딩 메뉴 라이브러리 를 사용하는 것 입니다. 하단 슬라이딩 메뉴를 만들 수 있고 상단 컨테이너를 애니메이션하여 하단을 표시 할 수 있으며 손가락으로 드래그하거나 버튼 (StaticDrawer)을 통해 프로그래밍 방식으로 애니메이션 할 수 있습니다.

더 어려운 방법-이미 제안 된대로 애니메이션을 사용하려는 경우. 애니메이션을 사용하려면 먼저 레이아웃을 변경해야합니다. 따라서 먼저 애니메이션없이 레이아웃을 최종 상태로 변경하십시오. RelativeLayout에서 뷰를 제대로 배치하지 않을 가능성이 매우 높기 때문에 아래쪽 뷰를 표시하더라도 위쪽 뷰에 가려진 상태로 남아 있습니다. 레이아웃을 적절하게 변경했으면 레이아웃 전에 번역을 기억하고 레이아웃 후에 번역 애니메이션을 적용하기 만하면됩니다.


숨겨진 패널의 버튼이 표시되지 않았습니다. 패널이 화면을 벗어 났기 때문일 수 있습니다. 내가 한 일은 레이아웃을 숨기고 화면에 유지 한 다음 애니메이션을 사용하여 올바른 위치에 배치했습니다.
Babar

4
나는 SlidingMenu가 바닥에서 허용한다고 생각하지 않습니다. 왼쪽, 오른쪽 만, 나는 믿는다
wkhatch

2
@wkhatch가 정확합니다. BOTTOM SlidingMenu는 "SlidingMenu 모드는 LEFT, RIGHT 또는 LEFT_RIGHT 여야합니다"라는 예외가 발생합니다. 이는 문서와 일치하며이 답변과 반대입니다.
ajwest

4

애니메이션을 위로 슬라이드하고 XML없이 아래로 슬라이드하는 코드

private static ObjectAnimator createBottomUpAnimation(View view,
        AnimatorListenerAdapter listener, float distance) {
    ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationY", -distance);
//        animator.setDuration(???)
    animator.removeAllListeners();
    if (listener != null) {
        animator.addListener(listener);
    }
    return animator;
}

public static ObjectAnimator createTopDownAnimation(View view, AnimatorListenerAdapter listener,
        float distance) {
    view.setTranslationY(-distance);
    ObjectAnimator animator = ObjectAnimator.ofFloat(view, "translationY", 0);
    animator.removeAllListeners();
    if (listener != null) {
        animator.addListener(listener);
    }
    return animator;
}

아래로 슬라이드 사용

createTopDownAnimation(myYellowView, null, myYellowView.getHeight()).start();

위로 슬라이드

createBottomUpAnimation(myYellowView, null, myYellowView.getHeight()).start();

여기에 이미지 설명 입력


3

아래 코드를 시도해보십시오. 매우 짧고 간단합니다.

transalate_anim.xml

<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2013 The Android Open Source Project

     Licensed under the Apache License, Version 2.0 (the "License");
     you may not use this file except in compliance with the License.
     You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     See the License for the specific language governing permissions and
     limitations under the License.
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="4000"
        android:fromXDelta="0"
        android:fromYDelta="0"
        android:repeatCount="infinite"
        android:toXDelta="0"
        android:toYDelta="-90%p" />

    <alpha xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="4000"
        android:fromAlpha="0.0"
        android:repeatCount="infinite"
        android:toAlpha="1.0" />
</set>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.naveen.congratulations.MainActivity">


    <ImageView
        android:id="@+id/image_1"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginBottom="8dp"
        android:layout_marginStart="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:srcCompat="@drawable/balloons" />
</android.support.constraint.ConstraintLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ImageView imageView1 = (ImageView) findViewById(R.id.image_1);
        imageView1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startBottomToTopAnimation(imageView1);
            }
        });

    }

    private void startBottomToTopAnimation(View view) {
        view.startAnimation(AnimationUtils.loadAnimation(this, R.anim.translate_anim));
    }
}

이미지의 bottom_up_navigation


2

다음은 [ https://stackoverflow.com/a/46644736/10249774] 의 확장으로 솔루션입니다 .

하단 패널은 주요 콘텐츠를 위로 밀어 냅니다.

https://imgur.com/a/6nxewE0

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
<Button
    android:id="@+id/my_button"
    android:layout_marginTop="10dp"
    android:onClick="onSlideViewButtonClick"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
<LinearLayout
android:id="@+id/main_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal">
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="main "
    android:textSize="70dp"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="main "
    android:textSize="70dp"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="main "
    android:textSize="70dp"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="main"
    android:textSize="70dp"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="main"
    android:textSize="70dp"/>
</LinearLayout>
<LinearLayout
    android:id="@+id/footer_view"
    android:background="#a6e1aa"
    android:orientation="vertical"
    android:gravity="center_horizontal"
    android:layout_alignParentBottom="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="footer content"
        android:textSize="40dp" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="footer content"
        android:textSize="40dp" />
  </LinearLayout>
</RelativeLayout>

주요 활동:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {
private Button myButton;
private View footerView;
private View mainView;
private boolean isUp;
private int anim_duration = 700;

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

    footerView = findViewById(R.id.footer_view);
    mainView = findViewById(R.id.main_view);
    myButton = findViewById(R.id.my_button);

    // initialize as invisible (could also do in xml)
    footerView.setVisibility(View.INVISIBLE);
    myButton.setText("Slide up");
    isUp = false;
}
public void slideUp(View mainView , View footer_view){
    footer_view.setVisibility(View.VISIBLE);
    TranslateAnimation animate_footer = new TranslateAnimation(
            0,                 // fromXDelta
            0,                 // toXDelta
            footer_view.getHeight(),  // fromYDelta
            0);                // toYDelta
    animate_footer.setDuration(anim_duration);
    animate_footer.setFillAfter(true);
    footer_view.startAnimation(animate_footer);

    mainView.setVisibility(View.VISIBLE);
    TranslateAnimation animate_main = new TranslateAnimation(
            0,                 // fromXDelta
            0,                 // toXDelta
            0,  // fromYDelta
            (0-footer_view.getHeight()));                // toYDelta
    animate_main.setDuration(anim_duration);
    animate_main.setFillAfter(true);
    mainView.startAnimation(animate_main);
}
public void slideDown(View mainView , View footer_view){
    TranslateAnimation animate_footer = new TranslateAnimation(
            0,                 // fromXDelta
            0,                 // toXDelta
            0,                 // fromYDelta
            footer_view.getHeight()); // toYDelta
    animate_footer.setDuration(anim_duration);
    animate_footer.setFillAfter(true);
    footer_view.startAnimation(animate_footer);


    TranslateAnimation animate_main = new TranslateAnimation(
            0,                 // fromXDelta
            0,                 // toXDelta
            (0-footer_view.getHeight()),  // fromYDelta
            0);                // toYDelta
    animate_main.setDuration(anim_duration);
    animate_main.setFillAfter(true);
    mainView.startAnimation(animate_main);
}

public void onSlideViewButtonClick(View view) {
    if (isUp) {
        slideDown(mainView , footerView);
        myButton.setText("Slide up");
    } else {
        slideUp(mainView , footerView);
        myButton.setText("Slide down");
    }
    isUp = !isUp;
}
}

1

메인 화면과 위로 스크롤하려는 다른 화면을 조각으로 정의 할 수 있습니다. 메인 화면의 버튼을 누르면 프래그먼트가 활동에 메시지를 보내고 메인 화면을 위로 스크롤하고 교체를 애니메이션하려는 것으로 대체합니다.


1
화면에 표시되면 숨겨진 패널에 의해 화면이 위쪽으로 밀리기를 원합니다. 화면 내용 / 조각을 바꾸고 싶지 않습니다. 애니메이션과 레이아웃 땜질로 작업 할 수있었습니다.
Babar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.