반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

카테고리

Sencha Touch 2 Tutorial - Layouts -

2012. 4. 24. 01:47 | Posted by 솔웅


반응형

Using Layouts in Sencha Touch 2

Intro and HBox

Layout은 컴포넌트들의 positioning과 sizing 을 정하는 겁니다. 예를 들어 이메일 클라이언트는 왼쪽에 메세지 리스트가 위치해 있어야 할 것입니다. 이것이 1/3을 차지한다고 합시다. 그 나머지 공간엔 메세지를 볼 수 있는 panel이 위치해 있을 겁니다.

이 구도라면 우리는 hbox layout을 사용해서 구현할 수 있습니다. 그 안에 flex라는 아이템을 넣어서 조절할 수도 있구요. Flexing 의 의미는 각각의 child component의 flex에 근거해서 공간을 나누겠다는 것입니다. 위의 조건을 만족하기 위해서 우리는 flex를 아래와 같이 나눌 수 있습니다.




코드는 아주 간단합니다. 그냥 컨테이너에 hbox 레이아웃을 정해주고나서 각 child 컴포넌트들에 flex를 지정해 주면 됩니다. (이 경우에는 panel이 됩니다.)

Ext.create('Ext.Container', {
    fullscreen: true,
    layout: 'hbox',
    items: [
        {
            xtype: 'panel',
            html: 'message list',
            flex: 1
        },
        {
            xtype: 'panel',
            html: 'message preview',
            flex: 2
        }
    ]
});


이 예제대로 하면 먼저 화면을 가득 채우는 container가 생성됩니다. 그 안에 메세지 리스트 panel 과 preview panel이 들어가게 됩니다. 두개의 아이템이 있는데요. 하나는 flex: 1 이고 다른 하나는 flex:2 입니다. 이 의미는 메세지 리스트는 전체 화면의 1/3차지하고 message preview 는 나머지 2/3 를 차지한다는 것입니다. 만약 이 콘테이너가 300 픽셀이라면 첫번째 것은 100 픽셀을 차지하고 나머지는 200픽셀을 차지하게 될 겁니다.

hbox는 가장 많이 사용되는 레이아웃 중 하나입니다. 이 레이아웃은 수평적으로 컴포넌트들을 배치하는데 사용할 수 있습니다. 더 자세한 사항은 HBox 문서를 봐 주세요.

VBox Layout

VBox는 HBox와 거의 비슷합니다. 좌우로 나누어지는 것이 아니라 상하로 나누어 지는것만 다릅니다.



이 레이아웃을 구현하는 코드는 hbox와 거의 비슷합니다. 단지 layout을 hbox 대신 vbox로 해 주시면 됩니다.

Ext.create('Ext.Container', {
    fullscreen: true,
    layout: 'vbox',
    items: [
        {
            xtype: 'panel',
            html: 'message list',
            flex: 1
        },
        {
            xtype: 'panel',
            html: 'message preview',
            flex: 2
        }
    ]
});


이 컨테이너 위 아래가 300 픽셀이라면 첫번째 패널은 100픽셀을 그리고 두번째 패널은 200 픽셀의 높이를 차지할 겁니다. 좀 더 자세한 사항은 VBox 문서를 보세요.

Card Layout

어떤 경우는 여러개의 스크린으로 정보를 보여줄 필요가 있습니다. 하지만 이 일을 하기에는 디바이스의 스크린 크기가 너무 작습니다. TabPanel 과 Carousels 는 한 스크린에 많은 정보를 보여줄 때 유용합니다. 이 두가지는 모두 Card layout 과 같이 쓰여 집니다.

Card layout은 현재 활성화 된 아이템의 전체 Container 크기를 차지합니다. 나머지 아이템들은 그 밑에 숨겨집니다. 그 숨겨진 아이템들 중에 한가지를 visible 하도록 만들 수 있습니다. 이 때 한번에 한 아이템만 visible 하도록 만들 수 있습니다.



여기 gray box가 Container 입니다. 그 안의 blue box 가 현재 활성화된 card 입니다. 나머지 세개는 비활성화 되서 모이지 않습니다. 하지만 이후에 swap 되서 활성화 될 수 있습니다. card layout을 direct 하게 생성하는 것은 아주 일반적이지는 않습니다. 아래와 같이 생성하시면 됩니다.

var panel = Ext.create('Ext.Panel', {
    layout: 'card',
    items: [
        {
            html: "First Item"
        },
        {
            html: "Second Item"
        },
        {
            html: "Third Item"
        },
        {
            html: "Fourth Item"
        }
    ]
});

panel.setActiveItem(1);


여기서는 card layout을 panel 과 같이 생성했습니다. 이 경우는 두번째 아이템이 활성화 될 겁니다. 왜냐하면 setActiveItem(1)을 했기 때문이죠. 첫번째 아이템은 0 으로 지정하면 활성화 될 수 있습니다. 일반적으로 이 card layout은 Tap Panel 이나 Carousel 을 사용하시는것이 좋습니다.

Fit Layout

Fit Layout 은 가장 간단한 레이아웃일 겁니다. 이 레이아웃이 하는 일은 그냥 parent Container의 크기만큼 child component를 꽉 차게 만드는 것입니다.



예를 들어 parent Container가 200X200 픽셀이고 한개의 child component와 fit layout을 사용한다면 이 child component는 200X200 픽셀이 될 겁니다.

var panel = Ext.create('Ext.Panel', {
    width: 200,
    height: 200,
    layout: 'fit',

    items: {
        xtype: 'panel',
        html: 'Also 200px by 200px'
    }
});

Ext.Viewport.add(panel);


fit layout을 사용하면서 container에 1개 이상의 아이템을 넣으면 첫번째 아이템만이 보여질 겁니다. 여러개의 아이템을 보이기를 원한다면 Card layout을 사용해야 합니다.

Docking

모든 레이아웃은 아이템들을 그 안에 탑재할 수가 있습니다. Docking은 parent Container의 위,아래,오른쪽,왼쪽 화면에 추가적인 Component를 넣을 수 있도록 해 줍니다.

예를들어, 처음에 다뤘던 hbox layout으로 돌아가서 화면 위에 다른 component를 탑재하기를 원한다고 가정해 봅시다.





이것은 툴바나 배너들을 사용할 때 자주 이용됩니다. 아래는 이것을 단지 dock: 'top' configuration을 함으로서 간단히 구현한 예제입니다.

Ext.create('Ext.Container', {
    fullscreen: true,
    layout: 'hbox',
    items: [
        {
            dock: 'top',
            xtype: 'panel',
            height: 20,
            html: 'This is docked to the top'
        },
        {
            xtype: 'panel',
            html: 'message list',
            flex: 1
        },
        {
            xtype: 'panel',
            html: 'message preview',
            flex: 2
        }
    ]
});


child component에 이 dock configuration을 사용해서 원하는 만큼의 아이템들을 간단하게 dock 할 수 있습니다. 그리고 방향을 어느쪽이든지 위치 시킬 수 있습니다. 우리가 위에서 사용했든 vbox 예제를 예로 들면 아래와 같이 할 수도 있습니다.



이것은 dock: 'left' 를 사용해서 구현하겠습니다.

Ext.create('Ext.Container', {
    fullscreen: true,
    layout: 'vbox',
    items: [
        {
            dock: 'left',
            xtype: 'panel',
            width: 100,
            html: 'This is docked to the left'
        },
        {
            xtype: 'panel',
            html: 'message list',
            flex: 1
        },
        {
            xtype: 'panel',
            html: 'message preview',
            flex: 2
        }
    ]
});


여러분은 사방에 여러개의 docked item들을 추가할 수 있습니다. (예를 들어 bottom 포지션에 여러개의 docking을 사용할 수 있습니다.)


반응형


반응형

코로나에서 지난 주부터 Corona SDK Ambassador 의 글을 하나씩 받아서 웹 싸이트 블로그에 올리겠다고 했습니다.

첫 글은 미국에서 코로나 SDK 책을 펴낸 Dr. Brian G. Burton 의 글입니다.

질문과 답변 형식으로 돼 있네요. 질문은 굳이 번역하지 않았습니다.

여러분들에게도 도움이 될 수 있을 것 같아 제 블로그에 올립니다.

==== o ==== o ==== o ==== o ====

Q&A with Dr. Brian G. Burton, Corona Ambassador

Dr. Brian G. Burton, Ed.D.은 Burton’s Media Group의 대표이고 Abilene Christian University의 교수이며 코로나 명예 대사 중 한명 입니다. 또한 그는 "코로나로 모바일 앱 개발하기 , Mobile App Development with Corona: Getting Started" 책의 저자이기도 합니다. 이 책은 코로나를 이용해서 모바일 앱과 게임을 개발하는 것을 도와주는 가이드죠.

Dr. Burton 당신의 얘기를 공유해 줘서 고맙습니다.

==== o ==== o ==== o ==== o ====




What is your background and experience in development?

몇몇의 코로나 개발자들 처럼 저는 1980년대에 시작했습니다. 고등학교 때 TRS-80(1977년에 발표된 Radio Shark 사의 개인용 컴퓨터)이 나왔습니다. 완전 매료 됐죠. 그 컴퓨터가 완전 유행이라는 말을 계속 듣긴 했지만 저는 안정적인 GM의 공장 일을 하는 직업을 선택해야만 했습니다. 그러다가 Ball State University 에서 Computer Science과 Management Information Systems을 공부하기로 결심했죠. 그러면서 저는 원래 계획했던 실리콘 밸리로 가는 것보다 진짜로 제가 가르치는것을 좋아하고 있다는 것을 깨달았습니다. 나는 중고등 학교때 computer science를 생각 했었습니다. 재가 그것을 석사 과정을 할 때 우리 가족들은 미주리주로 이사했습니다. 그리고 Ozark Mountains 와 사랑에 빠졌죠.

제 석사와 박사 과정을 할 때 computing을 할지 education을 할 지 정말 고민이 많이 됐었습니다. 그래 둘 다 같이하자! 컴퓨터 쪽을 가르치면 둘 다 만족할 수 있을 것 같았습니다. 석사 과정을 할 때 Freshman level 컴퓨터 코스를 가르치라는 제의를 받았습니다. 동시에 당시 제가 약간 인기가 있어서 college level에서 full time으로 가르치지 않겠느냐는 제의도 받았습니다. 제가 박사과정을 마쳤을 때 당시 14살이던 제 아들이 게임 디자인과 개발을 공부하고 싶다고 얘기하더라구요. 그게 2004년 이었습니다. 그 당시에는 그렇게 명망있는 게임이 없었습니다. 미주리 주립대학에서 Jeff Huff와 같이 일하는 동안 우리는 game level design 전공을 시작했습니다. 거기서는 프로그래밍과 그래픽 디자인을 가르쳤습니다. 그 강좌는 중부 미주리에서 인기있는 강좌가 됐습니다.

How and why did you become interested in developing mobile apps?

2007년 그 게임 개발 강좌가 성공했다는 것이 알려져 Alma Mater가 텍사스로 옮겨서 그런 강좌를 시작하는게 어떻냐고 제의를 했습니다. 이 시기는 애플 (Apple) 이 iPod Touch와 첫번째 세대 iPhone을 내 놓은 시기였습니다. 저도 어얼리 어답터 중의 한명이었습니다. 그래서 2009년 모바일 앱 개발 강좌를 가르치기 시작했습니다. (스탠포드가 그들의 첫번쨰 코스를 가르친 후 단 몇 주 후의 일이었습니다). 그 코스는 아주 성공적이었습니다. 그래서 그 강좌는 곧바로 정규 강좌로 채택 됐습니다.

2010년대 초 저는 제 학생들과 첫번 째 앱을 개발했습니다. iPad에서 학교 신문을 보여주는 앱이었습니다. (iPad 는 토요일에 나왔고 그 앱은 바로 다음 월요일에 선보였습니다) 그 프로젝트 이후로 학급에서는 꾸준히 다른 앱을 개발하자는 요구가 이어졌습니다.

How did you learn about Corona and what do you like about it?

2010년 초 앱을 개발하는데 좀 더 좋은 방법이 있다는 것을 알게 됐습니다. 저는 iOS 와 안드로이드에서 동시에 동작하는 모바일 앱이나 게임을 만들고 싶었거든요. 그렇게 할 수 있는 툴이 없을까 찾다가 보니까 그런 방법을 고민하는 그룹들이 별로 안 된다는 것을 알았습니다. iOS와 안드로이드 앱이나 게임 개발을 동시에 지원하는 회사는 오직 Ansca Mobile의 Corona 뿐이었습니다. 그래서 이 코로나를 한번 배워보자고 생각했습니다. 금방 매료가 됐죠. 여름 방학동안 제 블로그에 이 툴을 어떻게 사용하는지에 대한 정보를 올렸습니다. 그리고 그해 가을 그것을 거의 1/3 학기 동안 가르쳤습니다. 학생들은 코로나에 대해서 좀 더 보여주길 바랬죠. 그래서 금요일 수업은 코로나에 대해서만 공부하기로 했습니다. 그 클래스 프로젝트로 우리는 Space Explorer 의 초기 버전을 개발했습니다. (이 앱에 대한 내용은 제 책 9장과 10장에 있습니다.)

지금은 코로나로 인해서 컴퓨터 관련 학과 이에의 곳에서도 모바일 앱과 게임 개발 클래스를 해 달라는 제의를 받고 있습니다. 저는 코로나가 누구에게나 앱과 게임 개발을 가능하게 할 거라고 믿습니다.

What interesting projects have you worked on (Corona and non-Corona related)?

작년에 저는 제 클래스에서 사용할 코로나에 대한 책이 하나도 없다는 것이 문제라는 생각을 했습니다. 그래서 책을 쓰기로 작정했죠. 결과적으로 저는 두개의 책을 썼습니다. 하나는 학과 수업을 위한 것이구요. (Beginning Mobile App Development with Corona) 다른 하나는 제 학부 학생 뿐만 아니라 모든 분들을 위한 책입니다. (Mobile App Development with Corona: Getting Started)

말씀드리고 싶은 것은 이 책을 쓰기 시작했을 때는 단지 제가 가르치는 강좌를 위해서 였습니다. 처음에는 일반인을 대상으로 한 책은 염두에 두지 않았습니다. 그런데 하루는 학부 교재를 출판하는 회사의 영업사원이 제 사무실에 들렀습니다. 그 때 제가 그 책을 썼다고 말했죠. 48시간 만에 저는 계약 제안을 받았습니다. 그 책을 쓰고 그것을 지원할 웹 사이트를 만들고 그리고 몇가지 더 일을 해 달라는 것이었습니다. 그들은 책 판매의 10%를 주겠다고 했습니다. 그리고 다른 몇몇개의 출판사에서 비슷한 제의를 받았습니다. 그 때 저는 제가 쓴 책이 다른 사람들이 읽고 싶어 하는 내용일 수도 있겠구나 라는 생각을 했습니다.

그러다가 이런 생각이 들었습니다. 애플이나 아마존이나 구글에 앱을 출판하면 70%를 받는데 왜 이 책을 쓰고 70%보다 훨씬 못한 돈을 받아야 하나? 그래서 별도로 독립적인 루트를 통해서 출판을 하기로 결심했습니다. 출판사랑 같이 하면 훨씬 더 많은 광고를 할 수 있다는 걸 압니다. 하지만 저는 인디 작가, 인대 앱 개발자가 되는것이 훨씬 행복합니다. 그리고 또 가격도 낮출 수 있구요. 여러분이 제 책을 구매해 주시면 저의 indie work를 도와 주실 수 있습니다.

What projects are you working on next?

Beginning Mobile App Development with Corona를 집필하고 있을 때 몇가지 중요한 일들이 일어났습니다.

1) 모바일 앱 개발이 몇개 주에서 고등학교 수업 과정이 되었습니다.
2) 아주 많은 사람들로부터 모바일 앱과 게임을 개발하고 싶다는 말을 많이 들었는데 어떻게 해야 하는지를 모르고 있었습니다.
3) 제 웹사이트에 단지 코딩 하는 법만 올리는 대신 게임을 만들기 위한 전체 개발 과정에 대해서 알려달라는 요청을 많이 받았습니다.
4) Beginning Mobile App Development with Corona를 다른 나라 말로도 출판 해 달라는 부탁을 많이 받았습니다.

이러한 것들은 저를 지금 현재 하고 있는 몇가지 아주 신나는 프로젝트로 안내했습니다. 첫번째로 새로운 책을 시작했습니다. Learning Mobile Application Development 이 책은 모바일 앱과 게임 프록래밍을 배우기 원하는 프로그래밍 경험이 전혀 없는 사람을 위한 책입니다. 이 책은 고등학생이나 대학을 준비하는 혹은 프로그래밍 경험이 전혀 없는 사람들에게 맞도록 만들고 있습니다. 이 책은 2012년 여름에 나올 겁니다.

두번쨰로 저는 게임을 개발하기 위한 전체 과정에 대해 가르칠 수 있는 책 시리즈를 만들기 위해 몇명의 게임과 그래픽 아티스트 (14살 밖에 안 된 내 아들도 포함해서) 들과 일을 하고 있습니다. 이 시리즈 중 첫번째 책은 2012년 봄에 나올 겁니다.

마지막으로 저는 중국어,한국어,이탈리아어, 포르투갈어, 러시아어 그리고 스패니쉬어로 Beginning Mobile App Development with Corona를 번역하는 작업을 몇몇의 코로나 개발자들과 하고 있습니다.

그리고 제 여가시간에는 개인적으로 앱을 개발하고 있기도 합니다.


반응형


반응형

일단 센차터치에서 그동안 버전업이 됐길래 저는 최신버전으로 새로 받아서 작업하고 있습니다.


제가 받은 버전은 sencha-touch-2.0.0-gpl 입니다.


제가 센차터치 (Sencha Touch) 튜토리얼을 몇개 번역 했는데요.

Component 까지 번역을 했군요.


그런데 실습을 하지 않으면서 계속 번역만 하니까 제가 잘 이해를 못하겠더라구요.

제일 모르겠는건 어떻게 MVC 모델을 적용해서 앱을 만드는지 입니다.


그래서 지난 시간에 했었던 Component 글의 첫번째 예제를 MVC 모델을 적용해서 고쳐 보겠습니다.


먼저 원래 소스는 아래와 같습니다.


var panel = Ext.create('Ext.Panel', {
    layout: 'hbox',

    items: [
        {
            xtype: 'panel',
            flex: 1,
            html: 'Left Panel, 1/3rd of total size',
            style: 'background-color: #5E99CC;'
        },
        {
            xtype: 'panel',
            flex: 2,
            html: 'Right Panel, 2/3rds of total size',
            style: 'background-color: #759E60;'
        }
    ]
});

Ext.Viewport.add(panel);


이것을 app.js에 넣어서 직접 실행해 보려면 아래와 같이 하면 됩니다.


Ext.application({
    name: 'Panel',

    launch: function() {

        var panel = Ext.create('Ext.Panel', {
        layout: 'hbox',

        items: [
            {
                xtype: 'panel',
                flex: 1,
                html: 'Left Panel, 1/3rd of total size aaa ',
                style: 'background-color: #5E99CC;'
            },
            {
                xtype: 'panel',
                flex: 2,
                html: 'Right Panel, 2/3rds of total sizeaaa',
                style: 'background-color: #759E60;'
            }
            ]
        });

        Ext.Viewport.add(panel);
    }
});


보시면 아시겠지만 튜토리얼에 있는 코드를 복사해서 Ext.application 안의 launch:function() 안에 넣으시면 됩니다.


문제는 이 소스를 어떻게 MVC 모델에 맞게 수정하느냐 입니다.


이 소스는 view 만 있는 간단한 소스 입니다. 그러니까 폴더 구조를 아래와 같이 가져가겠습니다.


Panel 폴더가 프로젝트 폴더입니다.

그 안에 index.html과 app.js 가 있습니다. 그리고 sencha-touch.css 와 sencha-touch-all.js는 다운받은 Sencha Touch 소스 파일에서 복사해 넣습니다.


그리고 MVC 패턴을 적용하려면 app 폴더를 만들어야 하는 것 같습니다.

그 app 폴더에 view,controller,model,store 등의 폴더를 만드는데 이 소스에서는 view 만 있으면 되니까 view를 만들었습니다.

저 view 안에 panel.js 파일을 만들어서 그 안에 실제 view 를 담당하는 코드를 넣겠습니다.


일단 index.html 코드를 볼께요.


<!DOCTYPE html>
<html>
<head>
    <title>MVC Sample with Panel</title>
    <link rel="stylesheet" href="sencha-touch.css" type="text/css">
    <script type="text/javascript" src="sencha-touch-all.js"></script>
    <script type="text/javascript" src="app.js"></script>
</head>
<body></body>
</html>


소스는 간단합니다. html 파일에서는 단지 css와 js 파일을 불러왔습니다.

sencha-touch.css와 sencha-touch-all.js 파일을 Panel 폴더 밑에 복사해 넣었기 때문에 위와 같이 불러왔는데요. 서버에서 동작 시키려면 해당 경로를 써 주셔야 합니다.


그 다음은 app.js 파일을 보겠습니다.


Ext.application({
    name: 'Panel',


    launch: function() {
        Ext.create('Panel.view.panel');
    }
});


소스 코드가 아주 간단해 졌죠?

MVC 모델을 쓰는 이유가 이렇게 app.js를 간단하게 만들고 각 기능별로 폴더와 js 파일을 나눠서 코드를 관리하기 위해서 입니다.

여기서는 launch:function() 안에 Ext.create 함수를 사용해서 Panel.view.panel 을 불러왔습니다.

처음 Panel 은 위에서 설정한 이 애플리케이션의 name 이고 view는 app 폴더 밑에 있는 view 폴더를 가르킵니다. 그리고 맨 마지막 panel 은 view 폴더 밑에 있는 panel.js를 말합니다.


이렇게 하면 app/view/panel.js 파일을 불러올겁니다.


다 하고 나니까 이렇게 간단한데 몰랐을 때는 이것 맞추느라고 엄청 헤맸습니다.


다음은 panel.js 파일을 보겠습니다.


Ext.define('Panel.view.panel', {
    extend: 'Ext.Container',

    config: {
            fullscreen: true,
            layout: 'hbox',
            items: [
            {
                xtype: 'panel',
                flex: 1,
                html: 'Left Panel, 1/3rd of total size',
                style: 'background-color: #5E99CC;'
            },
            {
                xtype: 'panel',
                flex: 2,
                html: 'Right Panel, 2/3rds of total size',
                style: 'background-color: #759E60;'
            }
            ]
    }
});


우선 Ext.define 함수를 사용합니다. 곧바로 이 파일의 경로를 표시하구요.

다음으로는 Ext.Container 를 extend 합니다. 이 부분을 extend 하지 않으면 에러가 납니다.

Container 부분 튜토리얼을 번역 했는데 왜 그런지 아직 딱 떠오르지 않네요. 다시 한번 봐야겠습니다.


그 다음은 config 를 사용하고 그 안에서 화면을 full 로 해 준 다음에 원래 튜토리얼에 있던 소스를 위와 같이 해 주면 됩니다.


여기까지 하느라고 많이 헤맸습니다.


아래 제가 완료한 소스파일 올려 놓습니다. 혹시 저처럼 MVC 패턴 적용이 많이 헛갈리시는 분들은 이 소스가 도움이 되실겁니다.


Panel.zip


다음 글은 계속 센차터치의 튜토리얼을 다루겠습니다.

될 수 있는대로 소스코드를 이것 저것 변경해 보고 적용해 봐야 완전히 제것이 될 것 같군요.


다음에는 각 디바이스별로 화면을 달리 하는 Profile 을 한번 적용해 볼까 합니다.

반응형