Trượt bố cục lên từ cuối màn hình


92

Tôi có một bố cục bị ẩn khỏi chế độ xem. Khi nhấp vào nút, tôi muốn nó trượt lên từ dưới cùng, đẩy toàn bộ nội dung màn hình lên trên, rất giống với cách whatsapp hiển thị bảng biểu tượng cảm xúc trong màn hình trò chuyện.

Tôi đã thấy SlidingDrawer, nó không phù hợp với tôi. Nó yêu cầu một hình ảnh làm tay cầm được hiển thị ở giữa màn hình, tôi không muốn điều đó. Nó cũng trượt qua nội dung màn hình hiện có, tôi đang tìm cách di chuyển nội dung hiện có lên trên.

Cập nhật 1:

Tôi đã thử sử dụng các hình ảnh động theo gợi ý của Sanket Kachhela. Nhưng bố cục ẩn không bao giờ được hiển thị. Đây là mã.

Bố cục (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>

Hoạt động (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;
    }
}

}

Ảnh động:

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>

Bất kỳ ý tưởng làm thế nào điều này có thể được thực hiện?

Cảm ơn.


1
bạn đã thử câu trả lời chưa?
Sanket Kachhela

1
Bố cục hidden_panel của bạn có thể nằm sau bố cục khác. Gọi hiddenPanel.bringToFront()trước khi bắt đầu hoạt ảnh và xem nó có hoạt động không. Cũng cho chúng tôi biết, bạn đang nhận được chế độ xem hidden_panel trong bố cục đồ họa cho activity_main.xml?
imthegiga

1
@Babar có nghĩa là khi bạn nhấp vào nút trượt lên / xuống, bố cục ẩn sẽ được mở rộng hoặc thu gọn cho phù hợp? Tôi loại thanh trượt?
TheFlash

1
@Babar câu trả lời của tôi có hoạt động không?
superuser

1
Bạn có thể xem github.com/Ali-Rezaei/SlidingDrawer , trang này cho rằng bạn có thể trượt từ bất kỳ phía nào.
Ali

Câu trả lời:


151

Sử dụng các hình ảnh động này:

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>

Sử dụng mã này trong hoạt động của bạn để ẩn / làm động chế độ xem của bạn:

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
Tôi đã thử sử dụng mã trên nhưng chế độ xem ẩn không bao giờ hiển thị. Tôi đã cập nhật câu hỏi và thêm bố cục và mã java. Cảm ơn.
Babar

2
.setVisibility(View.VISIBLE)đã cứu ngày của tôi!
Si8

1
@sanket xin chào, tôi đã sử dụng mã của bạn, nó hoạt động tốt nhưng tôi phải tạo luồng ngủ một lúc sau đó tôi phải sử dụng hình ảnh động từ dưới lên, vì vậy bạn có thể giúp tôi cách làm điều đó không?
Anas Reza

1
tôi nghĩ bạn có thể sử dụng startOffset .. xem tài liệu này developer.android.com/reference/android/view/animation/…
Sanket Kachhela

6
Trước khi hoạt ảnh bắt đầu, có một khoảng trống nơi chế độ xem của tôi sẽ đi vào. bất kỳ ý tưởng ?
An-droid

42

Bạn đã gần. Điều quan trọng là phải có bố cục ẩn tăng match_parentcả chiều cao và trọng lượng. Đơn giản chỉ cần bắt đầu nó như View.GONE. Bằng cách này, việc sử dụng tỷ lệ phần trăm trong các hoạt ảnh hoạt động đúng cách.

Bố cục (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>

Hoạt động (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;
    }

}

Chỉ có điều khác mà tôi đã thay đổi bottom_up.xml. Thay vì

android:fromYDelta="75%p"

Tôi đã sử dụng:

android:fromYDelta="100%p"

Nhưng đó là vấn đề sở thích, tôi cho là vậy.


Điều này không hiệu quả với tôi, bảng điều khiển ẩn bật lên nhưng văn bản đã hiển thị trên màn hình đang bị ẩn và nút 'trượt lên / xuống' đang di chuyển từ góc đến giữa màn hình theo chiều ngang.
Babar

Bạn có thể cho biết tại sao bố cục trượt không thể bao gồm tất cả các thành phần khác trong bố cục mẹ không? Tôi đã triển khai mã của bạn một cách thành công. Nhưng đối với các yêu cầu của tôi, tôi đã thêm một số bố cục tuyến tính khác vào bố cục mẹ. Nhưng khi trượt bố trí xuất hiện, nó không thể trang trải các bố trí
gabby

@gabby Bạn có thể cần thiết lập android:zAdjustment="top"trên Animationhoặc AnimtionSet.
Paul Burke,

nó đã không hoạt động. . Các anims của tôi là như vậy: <? xml version = "1.0" encoding = "utf-8"?> <set xmlns: android = " schemas.android.com/apk/res/android "> <dịch android: fromYDelta = "0% p" android: toYDelta = "100% p" android: fillAfter = "true" android: interpolator = "@ android: anim / linear_interpolator" android: time = "400" android: zAdjustment = "top" /> < / set>
gabby

3
Đây nên được đánh dấu câu trả lời đúng. Cảm ơn @PaulBurke
RmK


7

Đây là những gì cuối cùng đã làm việc cho tôi.

Bố cục:

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: gói 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 gốc là gì
1baga

1
Nó là bố cục mẹ đóng gói main_screen. Có vẻ như khi cố gắng xóa các phần tử giao diện người dùng dư thừa, tôi đã xóa nó khỏi mã mà tôi đã dán ở đây. Đó là bố cục tuyến tính hoặc tương đối.
Babar

Đó là một câu trả lời được chấp nhận và không có phần tử gốc và không có gì ???? Làm thế nào điều này có thể được chấp nhận ??
Zahan Safallwa

5

Sử dụng bố cục này. Nếu bạn muốn tạo hoạt ảnh khi thu nhỏ chế độ xem chính, bạn sẽ cần thêm hoạt ảnh vào chiều cao của thanh ẩn, hãy mua nó có thể đủ tốt để sử dụng hoạt ảnh dịch trên thanh và có bước nhảy độ cao của chế độ xem chính thay vì hoạt ảnh.

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

Khi nhấp vào nút 'trượt lên', tôi đang lập trình thay đổi vị trí của main_screen và bảng điều khiển ẩn lên trên bằng cách gọi phương thức bố cục, sau đó tôi đang gọi startAnimation trên chế độ xem ẩn. Điều này làm cho bảng điều khiển ẩn bật lên vào vị trí. Nhưng vì lý do nào đó mà nút bên trong bảng điều khiển không hiển thị. Bảng điều khiển trống. Bất kỳ manh mối tại sao nút không hiển thị?
Babar

Bạn chỉ nên thay đổi khả năng hiển thị của bảng điều khiển ẩn thành hiển thị. Từ mô tả của bạn, tôi đoán rằng mức độ hiển thị của nút đã bị thay đổi hoặc chiều rộng / chiều cao của nút bằng 0
yoah

4

Ok, có hai cách tiếp cận khả thi. Đơn giản nhất - là sử dụng thư viện menu trượt . Nó cho phép tạo một menu trượt dưới cùng, nó có thể tạo hiệu ứng cho vùng chứa trên cùng để hiển thị phía dưới, nó có thể kéo nó bằng ngón tay của bạn hoặc tạo hoạt ảnh cho nó theo chương trình thông qua nút (StaticDrawer).

Cách khó hơn - nếu bạn muốn sử dụng Ảnh động, như đã được đề xuất. Với hình ảnh động, bạn phải TRƯỚC TIÊN thay đổi bố cục của mình. Vì vậy, trước tiên hãy thử làm cho bố cục của bạn thay đổi về trạng thái cuối cùng mà không có bất kỳ hoạt ảnh nào. Bởi vì rất có thể bạn không bố trí các chế độ xem của mình một cách chính xác trong RelativeLayout, vì vậy mặc dù bạn hiển thị chế độ xem dưới cùng của mình, nó vẫn bị che bởi chế độ xem trên cùng. Khi bạn đã thay đổi được bố cục phù hợp - tất cả những gì bạn cần làm là ghi nhớ các bản dịch trước khi bố trí và áp dụng hoạt ảnh dịch SAU bố cục.


nút trên bảng điều khiển ẩn không hiển thị, có thể là do bảng điều khiển đã tắt màn hình. Những gì tôi đã làm là giữ bố cục ẩn và trên màn hình, sau đó sử dụng các hình ảnh động để đặt nó vào đúng vị trí.
Babar

4
Tôi không nghĩ rằng SlidingMenu cho phép từ dưới lên; trái, phải duy nhất, tôi tin rằng
wkhatch

2
@wkhatch đúng, BOTTOM SlidingMenu đưa ra ngoại lệ: "Chế độ SlidingMenu phải là LEFT, RIGHT hoặc LEFT_RIGHT" phù hợp với tài liệu và trái với câu trả lời này.
ajwest

4

Mã của tôi để tạo hoạt ảnh trượt lên, trượt xuống mà không cần 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;
}

Sử dụng Để trượt xuống

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

Để trượt lên

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

nhập mô tả hình ảnh ở đây


3

Hãy thử đoạn mã dưới đây, nó rất ngắn và đơn giản.

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 của hình ảnh


2

Đây là một giải pháp dưới dạng phần mở rộng của [ https://stackoverflow.com/a/46644736/10249774]

Bảng điều khiển dưới cùng đang đẩy nội dung chính lên trên

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>

Hoạt động chủ yêu:

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

Bạn có thể xác định màn hình chính và màn hình khác mà bạn muốn cuộn lên dưới dạng các đoạn. Khi nhấn nút trên màn hình chính, phân đoạn sẽ gửi một thông báo đến hoạt động mà sau đó sẽ thay thế màn hình chính bằng màn hình chính mà bạn muốn cuộn lên và tạo hoạt ảnh cho hoạt động thay thế.


1
Tôi chỉ muốn màn hình được đẩy lên trên bởi bảng điều khiển ẩn khi nó ở trên màn hình. Tôi không muốn thay thế nội dung / mảnh màn hình. Tôi đã cố gắng làm cho nó hoạt động với các hình ảnh động và bố cục.
Babar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.