woong's
Android CoordinatorLayout Behavior 사용하기 본문
Android CoordinatorLayout Behavior 사용하기
android support design 라이브러리가 생기면서 behavior 라는 개념이 생겼습니다.
여태까지는 android 에서 정의한 behavior 를 사용 했습니다. 사용하면서 어떻게 만들었는지
의문이 있었지만 , 찾아보지 않아 이번에 기회가 있어 이렇게 찾아서 정리해보려 합니다.
behavior 는 view 에 의존하여 어떤뷰의 행동에 따라 위젯을 변경하는 것입니다.
이 포스트를 통해서는 간단한 behavior 를 작성하려합니다.
간단하지만 방법만 알면 얼마든지 응용이 가능한것 같습니다.
사전준비 작업
우선 간단하게 CoordinatorLayout 에 FloationgButton 선택시 snackBar 가 나타나는 화면을
구성해 보겠습니다. 위 위젯을 사용하기 위해서 design 라이브러리를 추가 합니다.
1 2 3 4 5 6 7 8 | dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.2.1' compile 'com.android.support:design:24.0.0-alpha1' } | cs |
design 라이브러리를 추가 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?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" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="16dp" /> </android.support.design.widget.CoordinatorLayout> | cs |
화면은 CoordinatorLayout 에 FloationgButton 을 만들었습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public class MainActivity extends AppCompatActivity { FloatingActionButton fab; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Snackbar.make(v, "Hello World", Snackbar.LENGTH_LONG).show(); } }); } } | cs |
FloationgButton 선택시 snackBar가 나타나도록 했습니다. 이렇게 구성하고 버튼을 선택해보면 snackBar가
나타나면서 FloationgButton 을 밀어 올리고 사라지면서 제자리로 오는것을 볼수 있습니다.
위와 같이 동작을 만들기 위해서 필요한것이 behavior 입니다.
위와 같이 동작하는 Custom Behavior 를 만들어 보려 합니다.
Behavior 코드 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> { private static final String TAG = "FloatingActionButtonBehavior"; public FloatingActionButtonBehavior() { } public FloatingActionButtonBehavior(Context context, AttributeSet attrs) { super(context, attrs); } } | cs |
위와 같이 빈 Behavior 를 작성 하였습니다. 위와 같이 작성후에 behavior 를 적용해 보겠습니다.
1 2 3 4 5 6 7 8 9 10 | <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end|bottom" android:layout_margin="16dp" app:layout_behavior="com.android.woong.behaviorsample.FloatingActionButtonBehavior" /> | cs |
위와 같이 적용하고 실행해서 FloationgButton 선택해보면 snackBar 가 나타나지만 FloationgButton 이 가만히 있는것을 알 수 있습니다.
행동이 없기 때문입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public class FloatingActionButtonBehavior extends CoordinatorLayout.Behavior<FloatingActionButton> { private static final String TAG = "FloatingActionButtonBehavior"; public FloatingActionButtonBehavior() { } public FloatingActionButtonBehavior(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { return dependency instanceof Snackbar.SnackbarLayout; } @Override public boolean onDependentViewChanged(CoordinatorLayout parent, FloatingActionButton child, View dependency) { float translationY = Math.min(0,dependency.getTranslationY() - dependency.getHeight()); child.setTranslationY(translationY); return true; } } | cs |
Behavior 를 작성해 보았습니다. 상속을 통해서 어떤뷰에서 Behaivor 를 사용할지 정의를 합니다.
layoutDependsOn 함수로 이벤트가 들어 옵니다. 이함수는 의존할 View를 Filter 하는 역할을 하는것 같습니다.
위와 같이 dependency 의 타입이 snackbarLayout 일때 리턴을 통해서 onDependentViewChanged 함수로
이벤트가 전달 됩니다.
onDependentViewChanged 함수는 dependency 의 View의 변화가 있을때 이벤트가 들어 옵니다.
위 코드를 작성하면 snackBar 의 변화가 있을때 이벤트가 호출됩니다. 나타나면서 움직일때 , 사라지면서 움직일때의 이벤트가 호출됩니다.
snackBar의 이동 Y 값을 FloationgButton 에 적용 시켜주기 때문에 아까와 같은 동작의 Behavior를 만들수 있습니다.
이와 같이 행동을 만들고 응용을하면 구글플레이 메인화면 , 이쁜 화면들을 만들수 있을것 같습니다.
'Develop > Android' 카테고리의 다른 글
홈 버튼 오버라이드 (0) | 2016.07.14 |
---|---|
Android Zxing 사용하기 (1) | 2016.05.10 |
Android Templates 사용하기 (0) | 2016.03.30 |
Android BottomSheetsBehavior 사용하기 (0) | 2016.03.15 |
Android DB Realm 사용하기 (2) | 2016.03.14 |