안드로이드 개발 정보
(글 수 1,069)
안녕하세요 그냥가자입니다.
오늘 만들어볼 것은 (무슨 오늘의 요리 삘이네요..) 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
오홓 정말 신기하네요
테스트 해봤는데 이미지 비율이 작을때는 도킹이 잘되는것 같은데
이미지가 커지니까(그냥 커진다 라고하면 좀 애매모호하지만) 그냥가자님이 말씀하신데로 열리는 방향으로만 붙는 것 같은 느낌이 드네요
좋은 정보 감사합니다.



