Schieben Sie ein Layout vom unteren Bildschirmrand nach oben


92

Ich habe ein Layout vor der Ansicht versteckt. Wenn Sie auf eine Schaltfläche klicken, soll sie von unten nach oben verschoben werden und den gesamten Bildschirminhalt nach oben verschieben, ähnlich wie WhatsApp das Emoticons-Bedienfeld im Chat-Bildschirm anzeigt.

Ich habe SlidingDrawer gesehen, das funktioniert bei mir nicht. Es erfordert ein Bild als Griff, das in der Mitte des Bildschirms angezeigt wird. Das möchte ich nicht. Es gleitet auch über den vorhandenen Bildschirminhalt. Ich suche nach einer Möglichkeit, den vorhandenen Inhalt nach oben zu verschieben.

Update 1:

Ich habe versucht, die von Sanket Kachhela vorgeschlagenen Animationen zu verwenden. Das versteckte Layout wird jedoch nie angezeigt. Hier ist der Code.

Layout (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>

Aktivität (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;
    }
}

}

Animationen:

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>

Irgendwelche Ideen, wie das gemacht werden kann?

Vielen Dank.


1
Hast du versucht zu antworten?
Sanket Kachhela

1
Ihr Layout hidden_panel steht möglicherweise hinter einem anderen Layout. Rufen Sie an, hiddenPanel.bringToFront()bevor Sie mit der Animation beginnen, und prüfen Sie, ob sie funktioniert. Lassen Sie uns auch wissen, ob Sie die Ansicht hidden_panel im grafischen Layout für erhalten activity_main.xml.
Imthegiga

1
@Babar bedeutet, wenn Sie auf die Auf- / Ab-Schaltfläche klicken, sollte das ausgeblendete Layout entsprechend erweitert oder reduziert werden?
TheFlash

1
@Babar funktioniert meine Antwort?
Superuser

1
Sie können sich github.com/Ali-Rezaei/SlidingDrawer ansehen , das es Ihnen ermöglicht, von jeder Seite zu rutschen.
Ali

Antworten:


151

Verwenden Sie diese Animationen:

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>

Verwenden Sie diesen Code in Ihrer Aktivität, um Ihre Ansicht auszublenden / zu animieren:

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
Ich habe versucht, den obigen Code zu verwenden, aber die versteckte Ansicht wurde nie angezeigt. Ich habe die Frage aktualisiert und das Layout und den Java-Code hinzugefügt. Vielen Dank.
Babar

2
.setVisibility(View.VISIBLE)hat meinen Tag gerettet!
Si8

1
@sanket Hallo, ich habe deinen Code verwendet, er funktioniert gut, aber ich muss den Thread für eine Weile zum Schlafen bringen, dann muss ich eine Animation von unten nach unten verwenden. Kannst du mir also helfen, wie das geht?
Anas Reza

1
Ich denke, Sie können startOffset verwenden .. siehe dieses Dokument developer.android.com/reference/android/view/animation/…
Sanket Kachhela

6
Bevor die Animation beginnt, gibt es eine leere Stelle, an der meine Ansicht angezeigt wird. irgendeine Idee ?
An-Droide

42

Du warst nah. Der Schlüssel ist, dass das verborgene Layout match_parentsowohl in der Größe als auch im Gewicht aufgeblasen wird . Starten Sie es einfach als View.GONE. Auf diese Weise funktioniert die Verwendung des Prozentsatzes in den Animatoren ordnungsgemäß.

Layout (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>

Aktivität (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;
    }

}

Das einzige, was ich geändert habe, war in bottom_up.xml. Anstatt

android:fromYDelta="75%p"

Ich benutzte:

android:fromYDelta="100%p"

Aber das ist wohl eine Frage der Präferenz.


Dies hat bei mir nicht funktioniert, das ausgeblendete Bedienfeld wird angezeigt, aber der bereits angezeigte Text auf dem Bildschirm wurde ausgeblendet, und die Schaltfläche "Nach oben / unten schieben" wurde horizontal von der Ecke in die Mitte des Bildschirms verschoben.
Babar

Können Sie erkennen, warum das gleitende Layout nicht alle anderen Komponenten im übergeordneten Layout abdecken kann? Ich habe Ihren Code erfolgreich implementiert. Für meine Anforderungen habe ich dem übergeordneten Layout einige andere lineare Layouts hinzugefügt. Aber wenn ein gleitendes Layout
angezeigt wird

@gabby Möglicherweise müssen Sie android:zAdjustment="top"auf Ihrem Animationoder einstellen AnimtionSet.
Paul Burke

es hat nicht funktioniert. Meine Animationen sind wie folgt: <? 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
Dies sollte als richtige Antwort markiert werden. Vielen Dank @PaulBurke
RmK


7

Hier ist, was am Ende für mich funktioniert hat.

Layouts:

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: Paket 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 was ist die Wurzel
1baga

1
Es ist das übergeordnete Layout, das main_screen einschließt. Scheint, als hätte ich versucht, die überschüssigen UI-Elemente zu entfernen. Am Ende habe ich sie aus dem Code entfernt, den ich hier eingefügt habe. Es war entweder ein lineares oder ein relatives Layout.
Babar

Es ist eine akzeptierte Antwort und hat nicht das Wurzelelement und nichts ???? Wie kann das akzeptiert werden?
Zahan Safallwa

5

Verwenden Sie dieses Layout. Wenn Sie das Verkleinern der Hauptansicht animieren möchten, müssen Sie der Höhe der ausgeblendeten Leiste eine Animation hinzufügen. Kaufen Sie diese möglicherweise, um die Übersetzungsanimation für die Leiste zu verwenden, und lassen Sie die Höhe der Hauptansicht springen, anstatt sie zu animieren.

<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>

Beim Klicken auf die Schaltfläche "Nach oben" ändere ich programmgesteuert die Position von main_screen und des ausgeblendeten Bedienfelds nach oben, indem ich die Layoutmethode aufrufe, und rufe dann startAnimation in der ausgeblendeten Ansicht auf. Dadurch wird das ausgeblendete Bedienfeld angezeigt. Aus irgendeinem Grund wird die Schaltfläche im Bedienfeld jedoch nicht angezeigt. Das Panel ist leer. Gibt es Hinweise, warum die Schaltfläche nicht angezeigt wird?
Babar

Sie sollten nur die Sichtbarkeit des ausgeblendeten Bedienfelds in sichtbar ändern. Aus Ihrer Beschreibung geht hervor, dass die Sichtbarkeit der Schaltfläche geändert wurde oder die Breite / Höhe der Schaltfläche Null ist
yoah

4

Ok, es gibt zwei mögliche Ansätze. Am einfachsten ist es, ein Schiebemenü zu verwenden verwenden. Es ermöglicht das Erstellen eines unteren Schiebemenüs, es kann den oberen Container animieren, um den unteren sichtbar zu machen, es unterstützt sowohl das Ziehen mit dem Finger als auch das programmgesteuerte Animieren über die Schaltfläche (StaticDrawer).

Schwieriger - wenn Sie Animationen verwenden möchten, wie bereits vorgeschlagen. Bei Animationen müssen Sie ZUERST Ihre Layouts ändern. Versuchen Sie also zunächst, Ihr Layout ohne Animationen in den endgültigen Zustand zu versetzen. Da es sehr wahrscheinlich ist, dass Sie Ihre Ansichten in RelativeLayout nicht richtig anordnen, bleibt die Ansicht von unten verdeckt, obwohl Sie Ihre Ansicht von unten anzeigen. Sobald Sie die richtige Layoutänderung erreicht haben, müssen Sie sich nur noch die Übersetzungen vor dem Layout merken und die Übersetzungsanimation NACH dem Layout anwenden.


Die Schaltfläche auf dem ausgeblendeten Bedienfeld wurde nicht angezeigt, wahrscheinlich weil das Bedienfeld nicht auf dem Bildschirm angezeigt wurde. Was ich getan habe, war, das Layout versteckt und auf dem Bildschirm zu halten und dann die Animationen zu verwenden, um es an der richtigen Stelle zu platzieren.
Babar

4
Ich glaube nicht, dass SlidingMenu von unten erlaubt; links, nur rechts, glaube ich
wkhatch

2
@wkhatch ist korrekt, ein UNTEN SlidingMenu löst die Ausnahme aus: "Der SlidingMenu-Modus muss LINKS, RECHTS oder LEFT_RIGHT sein", was der Dokumentation entspricht und dieser Antwort widerspricht.
Ajwest

4

Mein Code, damit die Animation ohne XML nach oben und unten gleitet

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

Verwenden für For nach unten schieben

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

Zum Hochrutschen

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

Geben Sie hier die Bildbeschreibung ein


3

Versuchen Sie diesen folgenden Code, es ist sehr kurz und einfach.

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 des Bildes


2

Hier ist eine Lösung als Erweiterung von [ https://stackoverflow.com/a/46644736/10249774]

Das untere Bedienfeld drückt den Hauptinhalt nach oben

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>

Hauptaktivität:

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

Sie können den Hauptbildschirm und den anderen Bildschirm, nach dem Sie scrollen möchten, als Fragmente definieren. Wenn die Schaltfläche auf dem Hauptbildschirm gedrückt wird, sendet das Fragment eine Nachricht an die Aktivität, die dann den Hauptbildschirm durch den ersetzt, den Sie nach oben scrollen und den Ersatz animieren möchten.


1
Ich möchte nur, dass der Bildschirm durch das ausgeblendete Bedienfeld nach oben gedrückt wird, sobald er auf dem Bildschirm angezeigt wird. Ich möchte keine Bildschirminhalte / -fragmente ersetzen. Ich habe es geschafft, es mit Animationen und Layout-Bastelarbeiten zum Laufen zu bringen.
Babar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.