Android
[ Android ] 페이지 슬라이딩
cat_cat
2020. 3. 31. 16:18
이 글은 부스트코스 강의를 공부하며 요약한 글입니다.
CatServant
Page Sliding
페이지 슬라이딩은 버튼 등을 눌렀을 때 보이지 않던 뷰가 슬라이딩 방식으로 보이는 것으로 여러 뷰를 하나씩 전환하면서 보여주는 방식에 애니메이션을 결합한 것입니다. 겹쳐져 있는 여러 뷰를 하나씩 전환하면서 보여주기 위한 방법으로는 Frame Layout을 사용합니다.
Code
- res / anim / translate_left.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%p"
android:toXDelta="0%p"
android:duration="1500"/>
</set>
<translate> tag는 View가 위, 아래 또는 좌, 우로 이동하도록 만듭니다. 여기서는 fromXDelta 속성과 toXDelta 속성이 사용되었으므로 X 방향 ( = 좌/우 ) 로 이동하게 됩니다.
만약 Y 방향 ( = 위 / 아래 )로 이동하도록 만들고 싶다면 fromYDelta 속성과 toYDelta 속성을 사용하면 됩니다.
duration 속성은 Animation이 얼마나 지속될지 시간을 지정하는 속성입니다. ( 1000ms = 1초 )
이외에도 repeatCount 속성과 filter 속성이 있습니다.
repeatCount 속성은 Animation 반복 횟수입니다. 여러 번 반복하도록 하고 싶다면 이 속성을 사용할 수 있습니다.
filter 속성은 Animation 동작이 끝난 후에 원래의 모양대로 화면에 보여줄 것인지를 지정합니다.
- res / anim / translate_right.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0%p"
android:toXDelta="100%p"
android:duration="1500"/>
</set>
- res / layout / activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ff5555ff">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Base Area"
android:textSize="30dp"
android:textColor="#ffffff"/>
</LinearLayout>
<LinearLayout
android:id="@+id/page"
android:layout_width="200dp"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_gravity="right"
android:background="#ffffff66"
android:visibility="invisible">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sliding Area"
android:textSize="30dp"
android:textColor="#000000"/>
</LinearLayout>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open"
android:layout_gravity="center_vertical|right"/>
</FrameLayout>
visibility 속성의 값을 gone 또는 invisible로 하면 보이지 않는다.
- MainActivity.java
public class MainActivity extends AppCompatActivity {
LinearLayout page;
Animation translateLeft;
Animation translateRight;
Button button;
boolean isPageOpen = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
page = (LinearLayout) findViewById(R.id.page);
translateLeft = AnimationUtils.loadAnimation(this, R.anim.translate_left);
translateRight = AnimationUtils.loadAnimation(this, R.anim.translate_right);
SlidingAnimationListener listener = new SlidingAnimationListener();
translateLeft.setAnimationListener(listener);
translateRight.setAnimationListener(listener);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isPageOpen) {
page.startAnimation(translateRight);
}
else {
page.setVisibility(View.VISIBLE);
page.startAnimation(translateLeft);
}
}
});
}
class SlidingAnimationListener implements Animation.AnimationListener {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (isPageOpen) {
page.setVisibility(View.INVISIBLE);
button.setText("Open");
isPageOpen = false;
}
else {
button.setText("Close");
isPageOpen = true;
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
}
}
실행화면