Program Tip

Android에서 화면 하단에서 중간으로 대화 슬라이드를 만드는 방법

programtip 2020. 11. 19. 21:57
반응형

Android에서 화면 하단에서 중간으로 대화 슬라이드를 만드는 방법


내 활동에 대한 대화를 애니메이션으로 표시하고 싶습니다. 내 대화 상자가 활동 하단에서 활동 중간으로 이동합니다.

/****편집하다****/

질문이 명확하지 않아서 죄송합니다. 내 대화는 아래에서 중간으로 슬라이드되지만 대화의 아래쪽은 다음 그림과 같이 활동의 ​​아래쪽에 배치됩니다.여기에 이미지 설명 입력


이를 위해서는 2 개의 애니메이션이 필요하고 이것을 res / anim 폴더에 넣습니다.

  1. slide_up_dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="50%p" android:toYDelta="0%p"
    android:duration="@android:integer/config_longAnimTime"/>

2.slide_out_down.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="100%p" />

이제 style.xml에서 사용자 정의 스타일을 만들어야합니다.

<style name="DialogAnimation">
        <item name="android:windowEnterAnimation">@anim/slide_up_dialog</item>
        <item name="android:windowExitAnimation">@anim/slide_out_down</item>
</style>

다음은 안드로이드 테마를 확장하는 것입니다. 동일한 style.xml에있는 대화 테마를 만들고 우리가 만든 사용자 지정 스타일에 대한 참조를 제공합니다.

<!-- Animation for dialog box -->
    <style name="DialogSlideAnim" parent="@android:style/Theme.Dialog">
        <item name="android:windowAnimationStyle">@style/DialogAnimation</item>
    </style>

마지막으로 다음과 같은 대화 상자를 만들 때이 스타일을 호출합니다.

dialog = new Dialog(new ContextThemeWrapper(this, R.style.DialogSlideAnim));

예 ... 이제 대화창을 슬라이드 할 준비가되었습니다 ..... !!

최신 정보:

@MichealP가 제안했듯이 이것은 하단에 창을 배치합니다

getWindow().setGravity(Gravity.BOTTOM); 

스타일을 수정하여 제목과 배경을 제거합니다.

<item name="android:windowBackground">@null</item> 
<item name="android:windowFrame">@null</item> 
<item name="android:windowNoTitle">true</item>

@ sikni8이 제안했듯이 검은 색 테두리를 투명하게 만듭니다.

getWindow().setBackgroundDrawableResource(android.R.color.transparent);

여기에서 모든 답변을 시도했지만 작동하지 않습니다. 나는 답변이 오래전에 쓰여졌다는 것을 알고 있습니다. 그래서 어떻게 작동하는지 보여 드리겠습니다. 나는이 기사를 따랐다.

요컨대 : res / anim / slide_up.xml 생성

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate 
      android:duration="@android:integer/config_mediumAnimTime" 
      android:fromYDelta="100%" 
      android:interpolator="@android:anim/accelerate_interpolator" 
      android:toYDelta="0">
    </translate>
</set>

그런 다음 res / anim / slide_bottom.xml을 만듭니다.

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate 
        android:duration="@android:integer/config_mediumAnimTime" 
        android:fromYDelta="0%p" 
        android:interpolator="@android:anim/accelerate_interpolator" 
        android:toYDelta="100%p">
    </translate>
</set>

그런 다음 res / values ​​/ styles.xml에 스타일을 추가합니다.

<style name="DialogAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_up_dialog</item>
    <item name="android:windowExitAnimation">@anim/slide_out_down</item>
</style>

이제이 애니메이션 스타일을 아래와 같이 대화 상자 또는 경고 대화 상자에 설정할 수 있습니다.

Dialog dialog = new Dialog(this);
dialog.getWindow().getAttributes().windowAnimations = animationSource;

또는,

Dialog dialog = new Dialog(this);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
lp.copyFrom(dialog.getWindow().getAttributes());
lp.width = WindowManager.LayoutParams.MATCH_PARENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
lp.gravity = Gravity.BOTTOM;
lp.windowAnimations = R.style.DialogAnimation;
dialog.getWindow().setAttributes(lp);

대화 상자에 대한 예제 만 보여 주었지만 앞서 말했듯이 경고 대화 상자에도이 방법을 사용할 수 있습니다.


하단 시트를 사용할 수 있습니다. 나는 그것에 대해 약간의 정보를 넣었다.

Android 지원 라이브러리 23.2를 통해 Google은 하단 시트에 대한 지원을 발표했습니다. 머티리얼 디자인에 따르면 하단 시트는 사용자가 시작한 작업의 결과로만 표시되는 요소이며 더 많은 콘텐츠를 표시하는 데 사용됩니다.

하단 시트에는 두 가지 주요 유형이 있습니다.

모달 하단 시트 는 메뉴 또는 간단한 대화 상자의 대안입니다. 또한 다른 앱에서 딥 링크 된 콘텐츠를 제공 할 수도 있습니다. 주로 모바일 용입니다.

인앱 콘텐츠를 제공하는 지속적인 하단 시트

간단한 예가 있습니다

Android에서 BottomSheet를 만드는 것은 매우 쉽습니다. CoordinatorLayout 을 레이아웃의 주요 요소로 사용하고 BottomSheet 동작을 뷰에 연결하기 만하면됩니다.

1 단계 -activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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"
android:background="#ffffff">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<Button
    android:id="@+id/btnButtonSheet"
    android:text="Camera"
    android:textColor="#1e1e1e"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_marginBottom="8dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<!-- Adding bottom sheet after main content -->
<include layout="@layout/bottom_sheet" />

</android.support.design.widget.CoordinatorLayout>

2 단계 -bottom_sheet.xml 추가

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/bottom_sheet"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#fff"
android:orientation="vertical"
app:behavior_hideable="true"
app:behavior_peekHeight="0dp"
app:layout_behavior="android.support.design.widget.BottomSheetBehavior">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_gravity="center_vertical">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Select your options!"
        android:gravity="center"
        android:textColor="#1e1e1e"
        android:textSize="16dp"
        android:layout_margin="8dp"
        android:textStyle="bold" />

</LinearLayout>
<Button
    android:id="@+id/btnPhoto"
    android:text="Photo"
    android:textColor="#1e1e1e"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_marginBottom="8dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<Button
    android:id="@+id/btnCamera"
    android:text="Camera"
    android:textColor="#1e1e1e"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_marginBottom="8dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<Button
    android:id="@+id/btnCancel"
    android:text="Cancel"
    android:background="#a2a2a3"
    android:textColor="#1e1e1e"
    android:layout_marginLeft="16dp"
    android:layout_marginRight="16dp"
    android:layout_marginBottom="8dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

</LinearLayout>

3 단계 -MainActivity를 다음과 같이 만드십시오.

public class MainActivity extends AppCompatActivity {

@BindView(R.id.btnButtonSheet)
Button btnBottomSheet;

@BindView(R.id.bottom_sheet)
LinearLayout layoutBottomSheet;

BottomSheetBehavior sheetBehavior;

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

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    sheetBehavior = BottomSheetBehavior.from(layoutBottomSheet);


    sheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            switch (newState) {
                case BottomSheetBehavior.STATE_HIDDEN:
                    break;
                case BottomSheetBehavior.STATE_EXPANDED: {
                    btnBottomSheet.setText("Close");
                }
                break;
                case BottomSheetBehavior.STATE_COLLAPSED: {
                    btnBottomSheet.setText("Expand");
                }
                break;
                case BottomSheetBehavior.STATE_DRAGGING:
                    break;
                case BottomSheetBehavior.STATE_SETTLING:
                    break;
            }
        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {

        }
    });
}

@OnClick(R.id.btnButtonSheet)
public void toggleBottomSheet() {
    if (sheetBehavior.getState() != BottomSheetBehavior.STATE_EXPANDED) {
        sheetBehavior.setState(BottomSheetBehavior.STATE_EXPANDED);
        btnBottomSheet.setText("Close Bottom sheet");
    } else {
        sheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
        btnBottomSheet.setText("Expand Bottom sheet");
    }
}
}

모달 하단 시트 ( 참조 )를 사용할 수 있습니다 .

  1. 디자인 지원 라이브러리 추가

    implementation "com.android.support:design:$version_support"
    
  2. Fragment확장 BottomSheetDialogFragment하고 재정의 하는 만들기onCreateView

    class BottomDialogFragment : BottomSheetDialogFragment() { 
    
        companion object {
            fun newInstance() = BottomDialogFragment()
        }
    
        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
            return inflater.inflate(R.layout.dialog_layout, container)
        }
    }
    
  3. 대화 표시

    val dialog = BottomDialogFragment.newInstance()
    dialog.show(supportFragmentManager, BottomDialogFragment::class.java.simpleName)
    

다음은 표시 할 때 대화 상자를 애니메이션하는 가장 간단한 방법입니다.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {

    @Override
    public void onShow(DialogInterface dialogInterface) {
        View view = dialog.getWindow().getDecorView();
        //for enter from left
        //ObjectAnimator.ofFloat(view, "translationX", -view.getWidth(), 0.0f).start(); 

        //for enter from bottom
        ObjectAnimator.ofFloat(view, "translationY", view.getHeight(), 0.0f).start();
    }

});

또한 하단에서 애니메이션 할 때 대화 상자 배경을 전체 화면으로 투명하게 만듭니다.

Window window = dialog.getWindow();
window.setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
window.setBackgroundDrawableResource(android.R.color.transparent);

arunsoorya의 답변 외에도 :

slide_up_dialog.xml 변경

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="0%p"
    android:toYDelta="100%p" />

그리고 slide_out_down.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromYDelta="0%p" 
    android:toYDelta="50%p"
    android:duration="@android:integer/config_longAnimTime"/>

새로운 머티리얼 디자인 라이브러리는 정확한 모양과 더 쉬운 구현을 위해 BottomSheetDialog제공합니다.

참고 URL : https://stackoverflow.com/questions/9305581/how-to-make-a-dialog-slide-from-bottom-to-middle-of-screen-in-android

반응형