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.
hiddenPanel.bringToFront()
sebelum memulai animasi dan lihat apakah berhasil. Beri tahu kami juga, apakah Anda mendapatkan tampilan hidden_panel dalam tata letak grafisactivity_main.xml
?Jawaban:
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:
sumber
.setVisibility(View.VISIBLE)
menyelamatkan hariku!Anda sudah dekat. Kuncinya adalah membuat tata letak tersembunyi berkembang menjadi
match_parent
tinggi dan berat. Cukup mulai sebagaiView.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 padaandroid:fromYDelta="75%p"
Saya menggunakan:
android:fromYDelta="100%p"
Tapi itu masalah preferensi, kurasa.
sumber
android:zAdjustment="top"
pada AndaAnimation
atauAnimtionSet
.Anda hanya perlu menambahkan beberapa baris di aplikasi Anda, silakan temukan dari tautan di bawah ini:
Menampilkan dan menyembunyikan Tampilan dengan animasi geser ke atas / bawah
Cukup tambahkan animasi ke tata letak Anda seperti ini:
mLayoutTab.animate() .translationYBy(120) .translationY(0) .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime));
sumber
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); } } }
sumber
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>
sumber
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.
sumber
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();
sumber
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)); } }
sumber
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; } }
sumber
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.
sumber