안드로이드 개발 정보
(글 수 1,064)
안녕하세요 그냥가자입니다.
오늘 만들어볼 것은 (무슨 오늘의 요리 삘이네요..) Sliding Toggle 버튼입니다.
토글버튼으로 만들면 드래그 효과가 안나죠?
그렇다고 그냥 직접 끌고 다니게 만들자니 코딩량이 만만찮습니다.
전 언제나 짧고 간단하게 만듭니다. 귀찮거든요 ㅡㅡㅋ
그럼 시작해보겠습니다.
SlideButton.java
public class SlideButton extends SlidingDrawer implements Checkable, OnDrawerOpenListener, OnDrawerCloseListener{ int mButtonResource = 0; OnCheckChangedListner mOnCheckChangedListner; public SlideButton(Context context, AttributeSet attr){ super(context, attr); setOnDrawerOpenListener(this); setOnDrawerCloseListener(this); } @Override public boolean isChecked() { // TODO Auto-generated method stub return !isOpened(); } @Override public void setChecked(boolean checked) { // TODO Auto-generated method stub if(!isOpened() != checked){ if(checked){ this.animateClose(); }else{ this.animateOpen(); } } } @Override public void toggle() { // TODO Auto-generated method stub if(!isOpened()){ this.animateOpen(); }else{ this.animateClose(); } } public interface OnCheckChangedListner{ public void onCheckChanged(View v, boolean isChecked); } @Override public void onDrawerOpened() { // TODO Auto-generated method stub if(mOnCheckChangedListner != null){ mOnCheckChangedListner.onCheckChanged(this, isChecked()); } } @Override public void onDrawerClosed() { // TODO Auto-generated method stub if(mOnCheckChangedListner != null){ mOnCheckChangedListner.onCheckChanged(this, isChecked()); } } public OnCheckChangedListner getOnCheckChangedListner() { return mOnCheckChangedListner; } public void setOnCheckChangedListner( OnCheckChangedListner onCheckChangedListner) { this.mOnCheckChangedListner = onCheckChangedListner; } }
뭐 딴거 없구요... SlidingDrawer를 상속받아서 했다는게 잴큰 특징 되겠습니다.
그리고 Checkable을 구현한건 CompoundButton (라디오버튼 같은 넘들) 처럼 붙일려고 한겁니다.
slide_button.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" > <a.b.c.SlideButton android:layout_width="112px" android:layout_height="48px" android:content="@+id/slideContentLayout" android:handle="@+id/slideHandle" android:background="@drawable/sns_toggle_btn_bg" android:orientation="horizontal" android:id="@+id/slideButton" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/slideHandle" android:background="@drawable/sns_toggle_btn_bar" > </Button> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight = "1" android:background="#00000000" android:id="@+id/slideContentLayout" > </LinearLayout> </a.b.c.SlideButton> </LinearLayout>
버튼과 배경이 중요한데요...
배경은 On/Off을 하나로 가지고 있고
버튼으로 한쪽을 가리는 형태로 만드시면됩니다.
버튼이 길이가 1이라면 배경은 길이가 2정도 되겠죠
MainActivity.java
requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.slide_button); sb = (SlideButton)findViewById(R.id.slideButton); sb.setOnCheckChangedListner(new SlideButton.OnCheckChangedListner() { @Override public void onCheckChanged(View v, boolean isChecked) { // TODO Auto-generated method stub Log.i("aaa","bbb"); Toast t = Toast.makeText(context, Boolean.toString(isChecked), Toast.LENGTH_LONG); t.show(); } });
이부분은 onCreate의 일부인데요... 그냥 onCreate에 저것만 쓰셔도 나올겁니다.
스샷은 제가 사용한 이미지가 공개하면 좀 애매해서...
생략하도록하겠습니다. 써보신분들이 후기 올려주시면 감사하겠습니다.
2010.10.15 10:07:12
좋은데요~ 언제한번 어울릴만한 이미지 얻어서 써먹어 봐야 겠내요...
토글 버튼이 넘어가는 듯한 anim 으로 수정해서 쓰면 더 좋을 것 같아요
좋은 글 감사합니다.
2010.10.15 13:21:31
저거 에니메이션 다 됩니다.
끌고다니는게 되고,
에니메이션이 되는게 토글버튼으로 구현한거랑 다른점입니다.
문제가 딱하나 있는게...
원래 SlidingDrawer가 도킹기능 (중간쯤에서 놓으면 한쪽에 붙는기능)이 있는데...
이게 열리는 방향으로만 붙네요... 이것만 아니면 정말 완벽한데요 ㅡㅡㅋ
2010.10.15 16:03:03
근데 제가 이미지 작은걸로 해봤는데 도킹 정상적으로 되던대요?
중간을 기점으로 많이 넘어간쪽으로 붙던데요
집에가서 허접한 포토샾으로 이미지 만들어서 소스 보관창고로 ㄱㄱ 해놔야겠어요
또 좋은 정보 있으시면 알려주세요~ ^^
2010.10.15 16:40:50
갤S만 그랬던건가요... 제가 테스트를 몇군데서 했는데 거기서는 도킹이 잘 안붙길래요 ㅡㅡㅋ
지금도 테스트를 했는데 한쪽으로만 붙는군요.... 넥원이... 뭐가 다르지?
지금도 테스트를 했는데 한쪽으로만 붙는군요.... 넥원이... 뭐가 다르지?
2010.10.26 11:52:09
오홓 정말 신기하네요
테스트 해봤는데 이미지 비율이 작을때는 도킹이 잘되는것 같은데
이미지가 커지니까(그냥 커진다 라고하면 좀 애매모호하지만) 그냥가자님이 말씀하신데로 열리는 방향으로만 붙는 것 같은 느낌이 드네요
좋은 정보 감사합니다.