Geser tata letak dari bawah layar

93

Saya memiliki tata letak yang tersembunyi dari tampilan. Pada satu tombol klik Saya ingin itu meluncur ke atas dari bawah mendorong seluruh konten layar ke atas, sangat mirip dengan bagaimana whatsapp menampilkan panel emotikon di layar obrolan.

Saya telah melihat SlidingDrawer, itu tidak berfungsi untuk saya. Ini membutuhkan gambar sebagai pegangan yang ditampilkan di tengah layar, saya tidak menginginkannya. Itu juga meluncur di atas konten layar yang ada, saya mencari cara untuk memindahkan konten yang ada ke atas.

Pembaruan 1:

Saya mencoba menggunakan animasi seperti yang disarankan oleh Sanket Kachhela. Tapi tata letak tersembunyi tidak pernah ditampilkan. Ini kodenya.

Tata letak (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>

Aktivitas (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;
    }
}

}

Animasi:

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>

Ada ide bagaimana ini bisa dilakukan?

Terima kasih.

Babar
sumber
1
sudahkah kamu mencoba menjawab?
Sanket Kachhela
1
Layout hidden_panel Anda mungkin berada di belakang layout lain. Panggil hiddenPanel.bringToFront()sebelum memulai animasi dan lihat apakah berhasil. Beri tahu kami juga, apakah Anda mendapatkan tampilan hidden_panel dalam tata letak grafis activity_main.xml?
imthegiga
1
@Babar berarti ketika Anda mengklik tombol geser atas / bawah, tata letak tersembunyi harus diperluas atau diciutkan sesuai? Saya ponsel jenis slider?
TheFlash
1
@Babar apakah jawaban saya berhasil?
superuser
1
Anda dapat melihat di github.com/Ali-Rezaei/SlidingDrawer , yang memungkinkan Anda untuk meluncur dari sisi mana pun.
Ali

Jawaban:

153

Gunakan animasi ini:

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>

Gunakan kode ini dalam aktivitas Anda untuk menyembunyikan / menganimasikan tampilan Anda:

Animation bottomUp = AnimationUtils.loadAnimation(getContext(),
            R.anim.bottom_up);
ViewGroup hiddenPanel = (ViewGroup)findViewById(R.id.hidden_panel);
hiddenPanel.startAnimation(bottomUp);
hiddenPanel.setVisibility(View.VISIBLE);
Sanket Kachhela
sumber
1
Saya mencoba menggunakan kode di atas tetapi tampilan tersembunyi tidak pernah muncul. Saya telah memperbarui pertanyaan dan menambahkan tata letak dan kode java. Terima kasih.
Babar
2
.setVisibility(View.VISIBLE)menyelamatkan hariku!
Si8
1
@sanket hai Saya telah menggunakan kode Anda itu berfungsi dengan baik tetapi saya harus membuat utas untuk tidur untuk sementara waktu kemudian saya harus menggunakan anim dari bawah ke bawah, jadi dapatkah Anda membantu saya bagaimana melakukan itu?
Anas Reza
1
saya pikir Anda dapat menggunakan startOffset .. lihat dokumen ini developer.android.com/reference/android/view/animation/…
Sanket Kachhela
6
Sebelum animasi dimulai, ada ruang kosong tempat tampilan saya akan ditampilkan. ada ide ?
An-droid
42

Anda sudah dekat. Kuncinya adalah membuat tata letak tersembunyi berkembang menjadi match_parenttinggi dan berat. Cukup mulai sebagai View.GONE. Dengan cara ini, menggunakan persentase di animator berfungsi dengan baik.

Tata letak (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>

Aktivitas (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;
    }

}

Hanya hal lain yang saya ubah bottom_up.xml. Dari pada

android:fromYDelta="75%p"

Saya menggunakan:

android:fromYDelta="100%p"

Tapi itu masalah preferensi, kurasa.

Paul Burke
sumber
Ini tidak berhasil untuk saya, panel tersembunyi muncul tetapi teks yang sudah ditampilkan di layar disembunyikan dan tombol 'geser ke atas / bawah' bergerak dari sudut ke tengah layar secara horizontal.
Babar
Dapatkah Anda mengetahui mengapa tata letak geser tidak dapat mencakup semua komponen lain dalam tata letak induk? Saya berhasil menerapkan kode Anda. Tetapi untuk kebutuhan saya, saya menambahkan beberapa tata letak linier lainnya ke tata letak induk. Tetapi ketika tata letak geser muncul, itu tidak dapat menutupi tata letak ini
gabby
@gabby Anda mungkin perlu mengatur android:zAdjustment="top"pada Anda Animationatau AnimtionSet.
Paul Burke
itu tidak berhasil. animasi .my seperti itu: <? 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: length = "400" android: zAdjustment = "top" /> < / set>
gabby
3
Ini harus ditandai sebagai jawaban yang benar. Terima kasih @PaulBurke
RmK
7

Inilah yang akhirnya berhasil bagi saya.

Tata Letak:

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>

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.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);
    }
}
}
Babar
sumber
1
@Babar apa akarnya
1baga
1
Ini adalah tata letak induk yang merangkum main_screen. Sepertinya dalam mencoba untuk menghapus elemen UI berlebih saya akhirnya menghapusnya dari kode yang saya tempelkan di sini. Itu adalah tata letak Linear atau Relatif.
Babar
Ini adalah jawaban yang diterima dan tidak memiliki elemen root dan tidak ada ???? bagaimana ini bisa diterima ??
Zahan Safallwa
5

Gunakan tata letak ini. Jika Anda ingin menganimasikan tampilan utama yang menyusut, Anda harus menambahkan animasi ke ketinggian bilah tersembunyi, membelinya mungkin cukup baik untuk menggunakan animasi terjemahan pada bilah, dan membuat lompatan tinggi tampilan utama alih-alih beranimasi.

<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>
yoah
sumber
Pada klik tombol 'geser ke atas', saya secara terprogram mengubah posisi main_screen dan panel tersembunyi ke atas dengan memanggil metode tata letak, lalu saya memanggil startAnimation pada tampilan tersembunyi. Ini membuat panel tersembunyi muncul di tempat itu. Tetapi untuk beberapa alasan tombol di dalam panel tidak muncul. Panelnya kosong. Adakah petunjuk mengapa tombol tidak muncul?
Babar
Anda hanya harus mengubah visibilitas panel tersembunyi menjadi terlihat. Dari uraian Anda, saya menduga bahwa visibilitas tombol telah diubah, atau lebar / tinggi tombol adalah nol
yoah
4

Oke, ada dua kemungkinan pendekatan. Yang paling sederhana - adalah dengan menggunakan perpustakaan menu geser . Ini memungkinkan membuat menu geser bawah, dapat menganimasikan wadah atas untuk membuat bagian bawah terlihat, mendukung baik menyeretnya dengan jari Anda, atau menganimasikannya secara terprogram melalui tombol (StaticDrawer).

Cara yang lebih sulit - jika Anda ingin menggunakan Animasi, seperti yang sudah disarankan. Dengan animasi, Anda harus terlebih dahulu mengubah tata letak Anda. Jadi cobalah terlebih dahulu untuk membuat tata letak Anda berubah ke keadaan akhir tanpa animasi apa pun. Karena sangat mungkin Anda tidak menata tampilan Anda dengan benar di RelativeLayout, jadi meskipun Anda menampilkan tampilan bawah, itu tetap dikaburkan oleh yang teratas. Setelah Anda mencapai perubahan tata letak yang tepat - yang perlu Anda lakukan hanyalah mengingat terjemahan sebelum tata letak dan menerapkan animasi terjemahan SETELAH tata letak.

EvilDuck
sumber
tombol pada panel tersembunyi tidak muncul, mungkin karena panel itu mati layar. Apa yang saya lakukan adalah menyembunyikan tata letak dan di layar, kemudian menggunakan animasi untuk meletakkannya di lokasi yang benar.
Babar
4
Saya tidak berpikir SlidingMenu memungkinkan dari bawah; kiri, kanan saja, saya percaya
wkhatch
2
@wkhatch benar, BOTTOM SlidingMenu memunculkan pengecualian: "Mode SlidingMenu harus LEFT, RIGHT, atau LEFT_RIGHT" yang sejalan dengan dokumentasi dan bertentangan dengan jawaban ini.
ajwest
4

Kode saya untuk membuat animasi geser ke atas, geser ke bawah tanpa 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;
}

Menggunakan Untuk geser ke bawah

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

Untuk meluncur ke atas

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

masukkan deskripsi gambar di sini

Phan Van Linh
sumber
3

Coba kode di bawah ini, Ini sangat singkat dan sederhana.

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 gambar

Naveen Kumar M
sumber
2

Berikut adalah solusi sebagai perpanjangan dari [ https://stackoverflow.com/a/46644736/10249774]

Panel bawah mendorong konten utama ke atas

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>

Aktifitas utama:

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;
}
}
Drasko
sumber
1

Anda dapat menentukan layar utama dan layar lain yang ingin Anda gulir ke atas sebagai fragmen. Saat tombol di layar utama ditekan, fragmen akan mengirim pesan ke aktivitas yang kemudian akan menggantikan layar utama dengan layar yang ingin Anda gulir ke atas dan menganimasikan penggantinya.

superuser
sumber
1
Saya hanya ingin layar didorong ke atas oleh panel tersembunyi begitu ada di layar. Saya tidak ingin mengganti konten / fragmen layar. Saya berhasil membuatnya bekerja dengan animasi dan tata letak yang mengutak-atik.
Babar