안드로이드(Android) DrawerLayout 사용하여 멀티윈도우 만들기 |
개발환경 : window 7 64bit, Eclipse Kepler, Android 4.2.2 |
이번 예제는 android.support.v4.widget.DrawerLayout 와 DrawerListener 상속받아
드래그 혹은 이벤트로 멀티윈도우를 사용하는 방법에 관한 내용이다.
예제구성은 바탕화면위에 또 다른 윈도우를 만들어서 왼쪽 구석에
넣어둔다. 그리고 드래그로 그 윈도우를 꺼낼수도 있고 이벤트를
발생시켜 윈도우를 나오게 하고 들어가게도 할수 있다.
1. DrawerLayout 에 제어할 View 추가 |
멀티윈도우를 구성하기 위해서는 DrawerLayout 안에 여러 개의 Layout 을
추가해서 사용하면 된다. 소스에서는 바탕에 표시하는 Layout 은 두고
움직이고자 하는 Layout 을 DrawerLayout 에 추가하면 된다.
Layout 을 Open 하고자 할 때 : 소스에서 보는 것과 같이 openDrawer() 함수에
움직이고자 하는 Layout 을 추가하였다
buttonOpenDrawer.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { drawerLayout.openDrawer(drawerView); } });
Layout 을 Close 하고자 할 때 : closeDrawers() 함수를 호출한다.
buttonCloseDrawer.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { drawerLayout.closeDrawers(); } });
2. DrawerListener 구현 |
이제 DrawerLayout 이 동작할 때 이벤트를 받아 그에 맞는 처리를 하기 위해서
DrawerListener 구현해서 추가 해야 한다. 주요 함수는 윈도우를 닫을 때, 열때 ,
그리고 슬라이드시간과 현재 슬라이드의 상태값을 받을수 있다.
DrawerListener myDrawerListener = new DrawerListener() { public void onDrawerClosed(View drawerView) { txtPrompt.setText("onDrawerClosed"); } public void onDrawerOpened(View drawerView) { txtPrompt.setText("onDrawerOpened"); } public void onDrawerSlide(View drawerView, float slideOffset) { txtPrompt.setText("onDrawerSlide: " + String.format("%.2f", slideOffset)); } public void onDrawerStateChanged(int newState) { String state; switch (newState) { case DrawerLayout.STATE_IDLE: state = "STATE_IDLE"; break; case DrawerLayout.STATE_DRAGGING: state = "STATE_DRAGGING"; break; case DrawerLayout.STATE_SETTLING: state = "STATE_SETTLING"; break; default: state = "unknown!"; } txtPrompt2.setText(state); } };
위의 클래스를 사용하기 위해서 DrawerLayout 의 setDrawerListener() 함수를 이용해
추가한다. 물론 터치이벤트도 아래 소스처럼 받을수 있다.
drawerLayout.setDrawerListener(myDrawerListener); drawerView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub return true; } });
3. Main Activity 소스 |
import android.app.Activity; import android.os.Bundle; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout.DrawerListener; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private DrawerLayout drawerLayout; private View drawerView; private TextView txtPrompt, txtPrompt2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); txtPrompt = (TextView) findViewById(R.id.prompt); txtPrompt2 = (TextView) findViewById(R.id.prompt2); drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); drawerView = (View) findViewById(R.id.drawer); Button buttonOpenDrawer = (Button) findViewById(R.id.opendrawer); buttonOpenDrawer.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { drawerLayout.openDrawer(drawerView); } }); Button buttonCloseDrawer = (Button) findViewById(R.id.closedrawer); buttonCloseDrawer.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { drawerLayout.closeDrawers(); } }); drawerLayout.setDrawerListener(myDrawerListener); drawerView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub return true; } }); } DrawerListener myDrawerListener = new DrawerListener() { public void onDrawerClosed(View drawerView) { txtPrompt.setText("onDrawerClosed"); } public void onDrawerOpened(View drawerView) { txtPrompt.setText("onDrawerOpened"); } public void onDrawerSlide(View drawerView, float slideOffset) { txtPrompt.setText("onDrawerSlide: " + String.format("%.2f", slideOffset)); } public void onDrawerStateChanged(int newState) { String state; switch (newState) { case DrawerLayout.STATE_IDLE: state = "STATE_IDLE"; break; case DrawerLayout.STATE_DRAGGING: state = "STATE_DRAGGING"; break; case DrawerLayout.STATE_SETTLING: state = "STATE_SETTLING"; break; default: state = "unknown!"; } txtPrompt2.setText(state); } }; }
4. Layout 소스 |
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/drawer_layout" 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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="@android:color/background_light" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Main layout" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:autoLink="web" android:text="Test" android:textStyle="bold" /> <Button android:id="@+id/opendrawer" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Open Drawer" /> <TextView android:id="@+id/prompt" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" /> <TextView android:id="@+id/prompt2" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" /> </LinearLayout> <LinearLayout android:id="@+id/drawer" android:layout_width="240dp" android:layout_height="match_parent" android:layout_gravity="start" android:background="@android:color/background_dark" android:orientation="vertical" android:padding="5dp" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Drawer" /> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:src="@drawable/ic_launcher" /> <Button android:id="@+id/closedrawer" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Close Drawer" /> </LinearLayout> </android.support.v4.widget.DrawerLayout>
5. 결과 화면과 전체 소스 |
전체 프로젝트 소스 : SampleMultiWindow.zip
결과 화면 :
'안드로이드 개발' 카테고리의 다른 글
안드로이드(Android) 에서 MapView 를 이용해 구글맵 구현하기 (5) | 2014.02.19 |
---|---|
안드로이드(Android) Map 구현시 클릭이벤트로 화면좌표와 위도경도값 가져오기 (6) | 2014.02.18 |
안드로이드(Android) 이클립스와 스마트폰 갤럭시 S 의 연결 (1) | 2014.02.17 |
안드로이드(Android) 이클립스와 갤럭시S3 의 연결을 위한 개발자 디버깅 설정 (7) | 2014.02.16 |
안드로이드(Andriod) 에서 다양한 네트워크 연결 및 데이터 받기 (1) | 2013.12.29 |
안드로이드(Android) activity 에서 activity 로 Object 넘기기 (1) | 2013.12.08 |
안드로이드(Android) 에서 ViewFlipper 을 이용해 화면 애니메이션 구현하기 (0) | 2013.11.24 |
안드로이드(Android) SeekBar 위젯을 이용해 화면 밝기 조정하기 (0) | 2013.10.28 |