CentOS 2014. 2. 9. 23:29

 1. ssh 설치

# yum -y install openssh

2. ssh daemon 셋팅
# service sshd restart {start/stop/restart/status}
# /etc/init.d/sshd {start/stop/restart/status}

3. 상태 확인
# netstat -atunp | arep {22/sshd}

* window에서 리눅스로, 리눅스에서 window로 파일 전송하기

큰 시나리오는 window에서 tera term을 사용하여 ssh가 활성화 된 리눅스(22포트)로 접속을 하고 파일 전송을 시도한다.

- 윈도우에서 리눅스로 파일 전송 하기
1. 테라텀 상단 메뉴 file - SSH SCP.. 클릭
2. TTSSH 창이 뜨는데 ------------ 선을 기준으로 
상단은 window에서 linux로  , 하단은 linux에서 window 로 파일을 전송 할 때 사용하는 영역이다. 
상단 From에 보낼 파일을 선택한 후 send버튼을 클릭하면 /home/user/ 경로에 파일이 전송 된다.

- 리눅스에서 윈도우로 파일 전송하기 
1. SSH로 접속(ssh:22번 포트)된 테라텀에서 su명령어로 root권한을 얻은 후 
# scp 보낼파일명 받는곳계정@받는곳IP:받는곳 디렉토리 
ex) scp ./test.txt admin@192.168.1.111:/d/

를 입력하면 테라텀이 아무것도 안뜨고 대기상태가 된다. 

2. 테라텀 상단메뉴 SSH SCP.. 클릭 
TTSSH 창에서 ---------- 기준 하단 From에 방금 적었던 받는 파일명(경로는 생략) test.txt를 입력하고 to:에 받을 경로를 지정한 후 receive 버튼을 클릭한다. 명령어로 입력한 받는 곳 디렉토리는 의미 없는 듯 하다.


'CentOS' 카테고리의 다른 글

리눅스] Cent OS 에서 SVN 세팅하기  (0) 2014.02.04
posted by 젊은쎄오
:
MAC 2014. 2. 4. 17:12
윈도우에서는 sdk만 있다면 바로 adb 명령어를 사용할 수 있지만 mac에선 

따로 path를 잡아줘야한다.

1. 터미널 창을 연다

2. cd 명령어로 sdk 내부에 platform-tools 디렉토리로 이동
(ex : /Users/username/eclipse/adt-bundle-mac-x86_64-20131030/sdk/platform-tools)

3. open -e ~/.bash_profile 명령어를 사용하여 bash_profile 파일을 연다
(없다고 나오면 touch .bash_profile 명령어를 입력하여 새로 만든 후 다시 3번을 시도한다.)

4. 열린 텍스트 창에 
exportPATH=${PATH}: /Users/username/eclipse/adt-bundle-mac-x86_64-20131030/sdk/platform-tools
를 쓴 후 저장한다. ({PATH}:뒤로는 현재 자신의 platform-tools 경로 : 1번 경로 이용)

5. 저장한다. 
- esc 를 누른후 :wq 입력 후 엔터

6. source ~/.bash_profile 입력하여 활성화 한다.
(경로 관련 문제가 있다면 
source ~/eclipse/adt-bundle-mac-x86_64-20131030/sdk/platform-tools/.bash_profile 
과 같이 현재 디렉토리로 잡아준다)

7. adb version 
명령어로 등록 확인한다. 


posted by 젊은쎄오
:
Android/Android TIP 2014. 2. 4. 17:05
터미널을 실행 한 후 순서대로 명령어를 입력한다.

1. adb shell

2. logcat -c

3. 앱 실행 > 크래쉬 

4. logcat -d > log.txt 
(read only  관련 에러 나온다면 디렉토리를 sd카드로 이동한 후 다시 시도한다 ex : cd /sdcard/) 


posted by 젊은쎄오
:
CentOS 2014. 2. 4. 17:03
- 터미널을 실행 합니다.


1. SVN 설치 
yum install -y svnversion

2. 사용자 계정 추가
adduser svn
passwd svn

3. repository 생성
svnadmin create --fs-type fsfs /home/svn/Projects

4. 권한 설정
chown -R svn:svn /home/svn (svn이 아닌시 해당 이름 사용 name:name)
chmod 644 .dmrc
chomd 755 /home/svn

5. 관리자 전환
su - svn

gedit /home/svn/Projects
ls -al /home/svn/Projects

6. 파일 수정
vi ~/.bash_profile
SVN_EDITOR=/user/bin/vim
export SVN_EDITOR

7. conf 세팅
vi /home/svn/Projects/conf/svnserve.conf
-- 내용수정 (앞에 #은 지워야 한다) --
[general]
anon-access = none 
auth-access = write
password-db = passwd 

8. 유저 등록
vi /home/svn/Projects/conf/passwd
[users]
id=password 
// 아랫줄에 계속 추가 가능

9. 서버 구동
svnserve -d -r /home/svn  // 서버를 데몬으로 구동
ps -aux | grep svnserv // 실행중인 서버 확인
netstat -ant | grep 369 // svn 3690포트 확인

10. 폴더 생성
svn mkdir svn://localhost/Projects/trunk
svn mkdir svn://localhost/Projects/branches
svn mkdir svn://localhost/Projects/tags
// 입력 후 vi 편집기가 열림 :q로 나가고 c(continue) 누르고 enter
// root비번, 2번에서만든 id, pw 차례로 입력 후 yes
// 안된다면 svnserve.conf 열어서 # 제거했는지 확인

11. svn 확인
svn list svn://localhost/Projects

12. svn체크아웃
svn checkout svn://localhost/Projects

13. svn 3690 포트 해제(외부접근 가능하도록)
iptables -I INPUT -p tcp --dport 3690 -j ACCEPT
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart

14. 시스템 부팅시 자동실행 되도록 하기
vim /etc/rc.d/rc.local
svnserve -d -r /home/svn --listen-host=0.0.0.0


svn 종료
killall svnserve

종료 확인
ps -ef | grep svn
// kill -9 xxxx 로 가능










'CentOS' 카테고리의 다른 글

리눅스] Cent OS 에서 SSH설치 및 파일 전송하기  (0) 2014.02.09
posted by 젊은쎄오
:
Android/Android TIP 2013. 12. 23. 12:34

안드로이드 프로젝트를 APK로 뽑으려는 순간 아래와 같은 오류가 발생 할 때가 있습니다.






안드로이드 16 버전부터 나온 기능인데 프로젝트 내에 레이아웃, 문자열 등을 검사하여 문제가 발생 할 만한 곳을 


미리 경고메시지로 알려주는 기능입니다. 


예를 들어 en, ko 스트링 폴더를 나눠놨는데 en에는 있는 리소스가 ko에는 없다던가 식의 알림입니다. 


이 경고가 뜨면 컴파일 조차 안되는데 아래는 해결 방법입니다.








ADT Preferences > Android > Lint Error Checking > Correntness:Messages > MissingTranslation 선택 후 


Severity 를 Warning 으로 바꾸면 됩니다.




posted by 젊은쎄오
:
Web/note 2013. 9. 11. 18:21

예전 부터 해보고 싶던 웹 서버 쪽 개념입니다. 


말로 들은 것을 정리한 것이라 잘못 된 내용이 있다면 코멘트 부탁드립니다. 





posted by 젊은쎄오
:
Android/Android TIP 2013. 9. 10. 15:12

Activity가 아닌 곳 , 


Service , BroadcastReceiver , baseAdapter 등에서 Intent로 새로운 Activity를 열려고 하면 



E/AndroidRuntime(27318): android.util.AndroidRuntimeException: 

Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. 

Is this really what you want?


라는 런타임 에러가 나옵니다. 


안드로이드에서 간단한 toast를 띄울 때 '어디다 띄울거냐' 를 판별하는 this 또는 클래스명.this 와 같이 


어느 Task에 Activity를 띄울건지 모르겠다는 에러입니다. 


Task는 Activity를 관리하는 것으로 Activity를 띄우려면 해당 Task에 띄워야 하는데 


Service , BroadcastReceiver , baseAdapter  등 은 Activity가 아니므로 새로운 Activity를 띄우려면 


에러에서의 설명과 같이 


	Intent intent = new Intent(mContext, BlackBoxVideoPlayActivity.class);
	intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
	mContext.startActivity(intent);


Intent에 속성을 넣어 새로운 Task를 만들겠다고 해야합니다.



posted by 젊은쎄오
:
Android 2013. 8. 22. 13:34

한 화면을 여러 공간으로 쪼개어 사용하거나 액티비티 이동없이 화면 내부구성을 다른 레이아웃으로 


교체 시킬 때 등 Fragment는 여러 군데에서 사용되어지고 있습니다.


Fragment 란 ? : http://androidhuman.tistory.com/469



Fragment를 사용하려면 그것을 사용하는 상위 activity가 FragmentActivity 여야 합니다.






Fragment 생명주기는 activity와 흡사하며 주의 할 점이 activity에서 this로 쓰던 부분을 getActivity()로 


바꿔 써주셔야 합니다.



큰 구성은 FragmentActivity를 상속받은 MainActivity.java 가 있고 Fragment 를 상속받은


OneFragment, TwoFragment, ThreeFragment.java 세가지 클래스를 만든다음 


activity_main.xml에 있는 ll_fragment 영역에 위에만든 세가지 fragment 를 삽입하는 방식입니다.



먼저 MainActivity 구성입니다.



위 그림과 같이 activity_main.xml  레이아웃 하나에 fragment 가 교체 될 영역과 그 영역을 컨트롤 할 


메뉴 뷰 를 만들어 줍니다. 



<MainActivity>

public class MainActivity extends FragmentActivity implements OnClickListener {

	final String TAG = "MainActivity";

	int mCurrentFragmentIndex;
	public final static int FRAGMENT_ONE = 0;
	public final static int FRAGMENT_TWO = 1;
	public final static int FRAGMENT_THREE = 2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Button bt_oneFragment = (Button) findViewById(R.id.bt_oneFragment);
		bt_oneFragment.setOnClickListener(this);
		Button bt_twoFragment = (Button) findViewById(R.id.bt_twoFragment);
		bt_twoFragment.setOnClickListener(this);
		Button bt_threeFragment = (Button) findViewById(R.id.bt_threeFragment);
		bt_threeFragment.setOnClickListener(this);

		mCurrentFragmentIndex = FRAGMENT_ONE;

		fragmentReplace(mCurrentFragmentIndex);
	}

	public void fragmentReplace(int reqNewFragmentIndex) {

		Fragment newFragment = null;

		Log.d(TAG, "fragmentReplace " + reqNewFragmentIndex);

		newFragment = getFragment(reqNewFragmentIndex);

		// replace fragment
		final FragmentTransaction transaction = getSupportFragmentManager()
				.beginTransaction();

		transaction.replace(R.id.ll_fragment, newFragment);

		// Commit the transaction
		transaction.commit();

	}

	private Fragment getFragment(int idx) {
		Fragment newFragment = null;

		switch (idx) {
		case FRAGMENT_ONE:
			newFragment = new OneFragment();
			break;
		case FRAGMENT_TWO:
			newFragment = new TwoFragment();
			break;
		case FRAGMENT_THREE:
			newFragment = new ThreeFragment();
			break;

		default:
			Log.d(TAG, "Unhandle case");
			break;
		}

		return newFragment;
	}

	@Override
	public void onClick(View v) {

		switch (v.getId()) {

		case R.id.bt_oneFragment:
			mCurrentFragmentIndex = FRAGMENT_ONE;
			fragmentReplace(mCurrentFragmentIndex);
			break;
		case R.id.bt_twoFragment:
			mCurrentFragmentIndex = FRAGMENT_TWO;
			fragmentReplace(mCurrentFragmentIndex);
			break;
		case R.id.bt_threeFragment:
			mCurrentFragmentIndex = FRAGMENT_THREE;
			fragmentReplace(mCurrentFragmentIndex);
			break;

		}

	}

}



전체적으로 보면 fragment 마다 int으로된 구분자를 주고 메뉴 버튼이 클릭 될 때마다 해당 fragment의 


index를 mCurrentFragmentIndex 라는 int 형 변수에 담아 fragment 교체 매소드를 태우는 식입니다.



onCreate부터 보면 메뉴 버튼등록과 리스너를 달고 mCurrentFragmentIndex에 첫 화면 fragment인 


FRAGMENT_ONE 를 넣어주고 fragmentReplace 매소드를 타게됩니다.


fragmentReplace 매소드에는 넘겨받은 fragment index를 가지고 getFragment 매소드를 가서 


실질적인 fragment의 객체 생성을 하고 그 객체를 리턴해줍니다. 


다시 fragmentReplace매소드로 돌아와 리턴받은 fragment로 ll_fragment 라는 레이아웃 영역에


교체를 하게 됩니다. 다른 버튼을 눌렀을 때도 이와 같은 방식으로 동작하게 됩니다. 



Fragment 들은 

public class OneFragment extends Fragment implements OnClickListener {

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View v = inflater.inflate(R.layout.onefragment, container, false);

		Button button = (Button) v.findViewById(R.id.bt_ok);
		button.setOnClickListener(this);

		return v;
	}

	@Override
	public void onClick(View v) {

		switch (v.getId()) {

		case R.id.bt_ok:
			Toast.makeText(getActivity(), "OneFragment", Toast.LENGTH_SHORT)
					.show();
			break;

		}

	}

}

이처럼 Activity와 비슷한 구조이고 



마지막으로 activity_main.xml 구조입니다.


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"

    android:layout_height="match_parent" >


    <LinearLayout

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:background="#ffffffff"

        android:orientation="vertical" >


        <LinearLayout

            android:id="@+id/ll_fragment"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:layout_weight="1" />


        <LinearLayout

            android:layout_width="fill_parent"

            android:layout_height="wrap_content"

            android:layout_marginBottom="10dp"

            android:layout_marginTop="10dp"

            android:background="#ffffffff"

            android:orientation="horizontal" >


            <Button

                android:id="@+id/bt_oneFragment"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_weight="1"

                android:text="1" />


            <Button

                android:id="@+id/bt_twoFragment"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_weight="1"

                android:text="2" />


            <Button

                android:id="@+id/bt_threeFragment"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_weight="1"

                android:text="3" />

        </LinearLayout>

    </LinearLayout>


</RelativeLayout>



ll_fragment 라는 영역이 Fragment들이 교체 될 영역입니다.








FragmentExample.zip



posted by 젊은쎄오
:
Android 2013. 8. 19. 11:24

페이스북 앱을 보면 좌측 메뉴 버튼을 눌렀을 때 좌측에서 슬라이드로 메뉴가 나오게 됩니다. 


원리는 메인화면을 구성하는 xml에 전체를 FrameLayout으로 감싸고 내부에 메뉴 레이아웃을 깔고 


그 위에 메인 화면의 레이아웃을 포개어 놓습니다. 그러고 메인화면의 메뉴 버튼을 눌렀을 때 메인화면 레이아웃을


애니메이션 처리하여 우측으로 밀어버려 아래에있던 메뉴 레이아웃이 노출되는 식입니다. 







<activity_main.xml>




구성요소는 다음과 같습니다.


1. MainActivity.java

2. OpenAnimation.java

3. CloseAnimation.java

4. activity_main.xml

5. leftslidemenu.xml



먼저 MainActivity 입니다. 



public class MainActivity extends Activity implements OnClickListener {

	// slide menu 
	private DisplayMetrics metrics;
	private LinearLayout ll_mainLayout;
	private LinearLayout ll_menuLayout;
	private FrameLayout.LayoutParams leftMenuLayoutPrams;
	private int leftMenuWidth;
	private static boolean isLeftExpanded;

	private Button bt_left, btn1, btn2, btn3, btn4;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		initSildeMenu();

	}

	private void initSildeMenu() {

		// init left menu width
		metrics = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(metrics);
		leftMenuWidth = (int) ((metrics.widthPixels) * 0.75);

		// init main view
		ll_mainLayout = (LinearLayout) findViewById(R.id.ll_mainlayout);

		// init left menu
                ll_menuLayout = (LinearLayout) findViewById(R.id.ll_menuLayout);
		leftMenuLayoutPrams = (FrameLayout.LayoutParams) ll_menuLayout
				.getLayoutParams();
		leftMenuLayoutPrams.width = leftMenuWidth;
		ll_menuLayout.setLayoutParams(leftMenuLayoutPrams);

		// init ui
		bt_left = (Button) findViewById(R.id.bt_left);
		bt_left.setOnClickListener(this);

		btn1 = (Button) findViewById(R.id.btn1);
		btn2 = (Button) findViewById(R.id.btn2);
		btn3 = (Button) findViewById(R.id.btn3);
		btn4 = (Button) findViewById(R.id.btn4);
		btn1.setOnClickListener(this);
		btn2.setOnClickListener(this);
		btn3.setOnClickListener(this);
		btn4.setOnClickListener(this);
	}

	/**
	 * left menu toggle
	 */
	private void menuLeftSlideAnimationToggle() {

		if (!isLeftExpanded) {

			isLeftExpanded = true;

			// Expand
			new OpenAnimation(ll_mainLayout, leftMenuWidth,
					Animation.RELATIVE_TO_SELF, 0.0f,
					Animation.RELATIVE_TO_SELF, 0.75f, 0, 0.0f, 0, 0.0f);

			// enable all of menu view
			FrameLayout viewGroup = (FrameLayout) findViewById(R.id.ll_menuLayout)
					.getParent();
			enableDisableViewGroup(viewGroup, true);

			// enable empty view
			((LinearLayout) findViewById(R.id.ll_empty))
					.setVisibility(View.VISIBLE);

			findViewById(R.id.ll_empty).setEnabled(true);
			findViewById(R.id.ll_empty).setOnTouchListener(
					new OnTouchListener() {

						@Override
						public boolean onTouch(View arg0, MotionEvent arg1) {
							menuLeftSlideAnimationToggle();
							return true;
						}
					});

		} else {
			isLeftExpanded = false;

			// Collapse
			new CloseAnimation(ll_mainLayout, leftMenuWidth,
					TranslateAnimation.RELATIVE_TO_SELF, 0.75f,
					TranslateAnimation.RELATIVE_TO_SELF, 0.0f, 0, 0.0f, 0, 0.0f);

			
			// enable all of menu view
			FrameLayout viewGroup = (FrameLayout) findViewById(R.id.ll_menuLayout)
					.getParent();
			enableDisableViewGroup(viewGroup, false);

			// disable empty view
			((LinearLayout) findViewById(R.id.ll_empty))
					.setVisibility(View.GONE);
			findViewById(R.id.ll_empty).setEnabled(false);

		}
	}


    public static void enableDisableViewGroup(ViewGroup viewGroup,
			boolean enabled) {
		int childCount = viewGroup.getChildCount();
		for (int i = 0; i < childCount; i++) {


			View view = viewGroup.getChildAt(i);
			view.setEnabled(enabled);

			if (view instanceof ViewGroup) {
				enableDisableViewGroup((ViewGroup) view, enabled);
			}
		}
    }


	@Override
	public void onClick(View v) {

		switch (v.getId()) {
		case R.id.bt_left:
			menuLeftSlideAnimationToggle();
			break;
		case R.id.btn1:
			Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_SHORT)
					.show();
			break;
		case R.id.btn2:
			Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_SHORT)
					.show();
			break;
		case R.id.btn3:
			Toast.makeText(getApplicationContext(), "3", Toast.LENGTH_SHORT)
					.show();
			break;
		case R.id.btn4:
			Toast.makeText(getApplicationContext(), "4", Toast.LENGTH_SHORT)
					.show();
			break;

		}

	}
}


최초에 initSildeMenu()매소드에서 사용 할 메인 레이아웃과 메뉴 레이아웃을 초기화 합니다.


메뉴 레이아웃은 열렸을 때 화면 전체너비로 열리는 것이 아니라 우측에 메인 레이아웃이 살짝 걸치므로 


메뉴 레아이웃 너비가 될 leftMenuWidth 변수에 화면전체 너비에 0.75 정도 비율을 넣어 줍니다. 






이 후에 메인 레이아웃을 findViewById 하고 메뉴 레이아웃도 findViewById 한 후 


아까 만든 0.75의 너비를 width로 넣어줍니다. 나머지 버튼들도 리스너를 달아줍니다. 




이제 핵심이 되는 menuLeftSlideAnimationToggle() 매소드 입니다


토글이라는 말과 같이 메뉴가 열고 닫힐 때 모두 이 매소드를 사용하며


isLeftExpanded라는 boolean 값으로 열고 닫힐 때를 판단하게 됩니다.


우선 열릴 때 입니다.


메뉴버튼을 눌러 메뉴가 열리게 되면 우선 isLeftExpanded = true; 를 줘서 메뉴가 열렸다를 저장하고


OpenAnimation 이란 클래스를 통하여 메뉴가 열리게 됩니다.


처음 구조 설명 할 때 설명을 안했지만 메인 레이아웃 위에 empty 레이아웃을 하나 더 포개었는데


이 뷰를 VISIBLE 시키게 됩니다. 이 ll_empty 뷰는 투명한 뷰이며 


메뉴가 열려있을 때 우측에 살짝 보이는 메인 레이아웃을 덮고 있습니다. 


이 뷰를 터치하면 menuLeftSlideAnimationToggle(); 매소드를 호출하여 메뉴가 닫히게 됩니다. 


이는 꼭 메뉴버튼을 눌러야 메뉴가 닫히는것이 아닌 그냥 메인 뷰만 터치하면 닫히도록하는 편리함을 위함입니다.




public class OpenAnimation extends TranslateAnimation implements
		Animation.AnimationListener {

	private LinearLayout mainLayout
	int panelWidth;

	public OpenAnimation(LinearLayout layout, int width, int fromXType,
			float fromXValue, int toXType, float toXValue, int fromYType,
			float fromYValue, int toYType, float toYValue) {

		super(fromXType, fromXValue, toXType, toXValue, fromYType, fromYValue,
				toYType, toYValue);

		// init
		mainLayout = layout;
		panelWidth = width;
		setDuration(250);
		setFillAfter(false);
		setInterpolator(new AccelerateDecelerateInterpolator());
		setAnimationListener(this);
		mainLayout.startAnimation(this);
	}

	public void onAnimationEnd(Animation arg0) {

		LayoutParams params = (LayoutParams) mainLayout.getLayoutParams();
		params.leftMargin = panelWidth;
		params.gravity = Gravity.LEFT;
		mainLayout.clearAnimation();
		mainLayout.setLayoutParams(params);
		mainLayout.requestLayout();

	}

	public void onAnimationRepeat(Animation arg0) {

	}

	public void onAnimationStart(Animation arg0) {

	}

}


OpenAnimation 클래스입니다. 받아온 속성들로 초기화를 하며 setDuration(250);이 부분이 열릴 때의 속도입니다.



메뉴가 닫힐 때는 isLeftExpanded로 닫힐 때를 가려내고 isLeftExpanded = flase;를 줘 닫힘을 저장합니다.


OpenAnimarion 클래스와 같이 CloseAnimation을 호출하게되고 활성화 되어있던 empty뷰를 꺼서 


메인 레이아웃이 다시 노출되게 합니다.

public class CloseAnimation extends TranslateAnimation implements
		TranslateAnimation.AnimationListener {

	private LinearLayout mainLayout;
	int panelWidth;

	public CloseAnimation(LinearLayout layout, int width, int fromXType,
			float fromXValue, int toXType, float toXValue, int fromYType,
			float fromYValue, int toYType, float toYValue) {

		super(fromXType, fromXValue, toXType, toXValue, fromYType, fromYValue,
				toYType, toYValue);

		// Initialize
		mainLayout = layout;
		panelWidth = width;
		setDuration(250);
		setFillAfter(false);
		setInterpolator(new AccelerateDecelerateInterpolator());
		setAnimationListener(this);

		// Clear left and right margins
		LayoutParams params = (LayoutParams) mainLayout.getLayoutParams();
		params.rightMargin = 0;
		params.leftMargin = 0;
		mainLayout.setLayoutParams(params);
		mainLayout.requestLayout();
		mainLayout.startAnimation(this);

	}

	public void onAnimationEnd(Animation animation) {

	}

	public void onAnimationRepeat(Animation animation) {

	}

	public void onAnimationStart(Animation animation) {

	}

}


CloseAnimation입니다. 



아래엔 사용한 xml 파일입니다.


<-- activity_main.xml -->


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="fill_parent"

    android:layout_height="match_parent"

    android:orientation="vertical" >


    <FrameLayout

        android:layout_width="fill_parent"

        android:layout_height="match_parent"

        android:background="#ffffff"

        android:orientation="vertical" >


        <LinearLayout

            android:id="@+id/ll_menuLayout"

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:background="#ff393c46"

            android:gravity="left"

            android:orientation="vertical"

            android:textColor="#ff000000" >


            <!-- include -->


            <include

                android:id="@+id/ic_leftslidemenu"

                android:layout_width="match_parent"

                android:layout_height="match_parent"

                layout="@layout/leftslidemenu" />

        </LinearLayout>


        <!-- slide layout -->


        <LinearLayout

            android:id="@+id/ll_mainlayout"

            android:layout_width="match_parent"

            android:layout_height="match_parent"

            android:background="#ffffffff"

            android:gravity="left"

            android:orientation="vertical" >


            <FrameLayout

                android:layout_width="match_parent"

                android:layout_height="match_parent" >


                <Button

                    android:id="@+id/bt_left"

                    android:layout_width="wrap_content"

                    android:layout_height="wrap_content"

                    android:layout_margin="10dp"

                    android:text="Left Slide" />


                <LinearLayout

                    android:id="@+id/ll_fragment"

                    android:layout_width="match_parent"

                    android:layout_height="wrap_content" >

                </LinearLayout>


                <LinearLayout

                    android:id="@+id/ll_empty"

                    android:layout_width="fill_parent"

                    android:layout_height="fill_parent"

                    android:background="@android:color/transparent" />

            </FrameLayout>

        </LinearLayout>

    </FrameLayout>


</LinearLayout>





<-- leftslidemenu.xml -->


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="fill_parent"

    android:layout_height="match_parent"

    android:background="#994444cc"

    android:orientation="vertical"

    android:padding="10dp" >


    <Button

        android:id="@+id/btn1"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="Button 1 " />


    <Button

        android:id="@+id/btn2"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="Button 2 " />


    <Button

        android:id="@+id/btn3"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="Button 3 " />


    <Button

        android:id="@+id/btn4"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:text="Button 4 " />


</LinearLayout>



위 처럼 메인 레이아웃에 메뉴 레이아웃이 include 되어있습니다. 




-- 2013 10 04 내용추가 


현재 버전에는 메인 화면에서는 메인 화면이 덮고있는 중에도 터치를 하면 뒤 LeftMenu의 버튼이 눌리게 됩니다. 


초보개발자 님 말씀대로 visible방법도 가능하고 


저는 뷰를 닫을 때 LeftMenu에 있는 모든 뷰를 다 setEnable로 꺼버리고 


열 때는 켜는 식을 사용 했습니다. 


열고 닫을 때 


FrameLayout viewGroup = (FrameLayout) findViewById(R.id.ll_menuLayout)

.getParent();


이런식으로 menu  레이아웃을 잡고 


enableDisableViewGroup(viewGroup, false);


setEnable을 true 할 건지 false 할 건지 정해 주시면 됩니다. 


그럼 


 public static void enableDisableViewGroup(ViewGroup viewGroup,
            boolean enabled) {
        int childCount = viewGroup.getChildCount();
        for (int i = 0; i < childCount; i++) {
 
 
            View view = viewGroup.getChildAt(i);
            view.setEnabled(enabled);
 
            if (view instanceof ViewGroup) {
                enableDisableViewGroup((ViewGroup) view, enabled);
            }
        }
  }
 

menu레이아웃에 있는 뷰들의 갯수 만큼 for문을 돌며 각각 setEnable을 할 수 있습니다.



응용하면 좌측 슬라이드 메뉴를 열었을 때 좌측 슬라이드에 있는 다른 버튼은 눌리지 않고

LeftSlide 버튼만 눌리게 하고싶을 땐

FrameLayout viewGroup = (FrameLayout) findViewById(R.id.ll_fragment)

.getParent();


이렇게 좌측 슬라이드 메뉴 레이아웃을 잡고 


enableDisableViewGroup 매소드 for문 안쪽에


View view = viewGroup.getChildAt(i);


if (view.getId() != R.id.ib_left) {

view.setEnabled(enabled);

if (view instanceof ViewGroup) {

enableDisableViewGroup((ViewGroup) view, enabled);

}

}


이런식으로 LeftSlide 버튼만 살려서 disable을 막는 방법이 있습니다.











LeftSlideMenuExample.zip









-- 2013 10 22 내용추가 


좌 우 측 슬라이드가 모두 되는 소스 첨부 합니다. 


우측 슬라이드도 좌측 슬라이드와 같은 방식으로 만들었습니다. 





SlideMenu.zip








posted by 젊은쎄오
:
Personal App 2013. 8. 12. 17:25

딱 todolist 기능만 있는 앱을 만들었습니다. 


UX 부분에서 좀 더 빨리 좀 더 심플하게 할 일을 추가하고 체크하는 쪽으로 생각을 하였습니다.


메인화면에 바로 할 일을 적을 수 있고 체크, 체크해재 등이 가능합니다. 


설정에서 체크 시 삭제를 설정하면 메인화면에서 체크 시 바로 목록에서 삭제되며 


총 할 일 갯수와 한 일 갯수를 계산하여 진행도를 상단에 표시하였습니다. 


안드로이드 버전만 배포하였습니다. 


play store : https://play.google.com/store/apps/details?id=com.song.todotodo







posted by 젊은쎄오
: