[Flex] SparkSkin을 통한 버튼 디자인

플랙스에서 컴포넌트의 스킨을 디자인하는 가장 쉬운 방법은 이미지를 이용하는 것입니다. 예를 들어 버튼의 경우.. 버튼의 up, over, down, disabled 상태에 따라 각기 다른 이미지를 만들어 주고 지정해 주면 됩니다. 디자이너의 역량에 따라 매우 높은 퀄리티를 낼 수 있습니다.

이 글은 이미지를 이용하는 방식이 아닌.. 각 상태에 따라 직접 그려주는 방법에 대한 설명입니다. 이렇게 이미지가 아닌 직접 버튼의 스킨을 그려주는 방식에 대한 장점은… 버튼의 크기가 변경이 되어도 스킨이 깨지않고 자연스럽게 표현할 수 있다는 점입니다.
사용자 삽입 이미지설명을 위해 제가 테스트 해 본 것은 버튼을 Aqua Style로 표현해 보는 것입니다. 위의 이미지가 실제 제 스스로 만들어본 버튼에 대한 Aqua 스킨입니다. SparkSkin 클래스의 파생 중에서 버튼에 대한 스킨은 SparkButtonSkin입니다.

일반적으로 SparkSkin은 레이어라는 개념으로 스킨을 입히게 됩니다. 여기서 직접 만들어 볼 버튼의 Aqua Style은 다음과 같은 레이어로 구성되어져 있으며 위의 이미지에 대한 버튼이 바로 아래의 레이어로 구성되어져 있습니다.

  1. border
  2. aqua
  3. labelDisplay
  4. blaze

좀더 고급스러운 Aqua 스타일을 제공하기 위해서는 더 많은 레이어가 필요하겠지만.. 간단이 이 정도의 레이어만을 구성해 봄으로써 Aqua 스타일의 스킨을 버튼에 입혀 보겠습니다. 위의 레이어 중 labelDisplay는 반드시 존재해야 하는 id 명으로써 버튼의 텍스트 라벨이 적용될 것으로 실제 Label 컴포넌트로 구성됩니다. 또한 위의 4개의 레이어의 순서 역시 중요합니다. 즉 가장 밑에 border가 존재하고 그 위에 aqua가.. 그리고 labelDisplay가 위치하며 가장 위에 blaze가 나타납니다.

먼저 실제 border 에 대한 FXG 코드입니다. 플렉스는 스킨에 대해 FXG(Flash XML Graphic)를 이용해 그려줍니다.


    
        
    
    
        
    

위의 FXG 코드는 다음과 같은 결과를 그려냅니다.

사용자 삽입 이미지
다음은 aqua 에 대한 FXG입니다.


    
        
            
            
    
    

    
        
    

위의 FXG 코드에 대한 결과는 다음과 같습니다.

사용자 삽입 이미지
그리고 라벨 텍스트를 표현할 코드는 다음과 같습니다.


    
        
        
    

텍스트를 표현해기 위해 Label 컴포넌트를 사용했습니다. 결과는 다음과 같습니다.

사용자 삽입 이미지
끝으로 blaze 레이어에 대한 FXG 코드는 다음과 같습니다.


    
        
            
            
        
    

이 레이어 만을 하얀색 배경의 화면상에서 보면 보이지 않는데요. 이 레이어는 버튼 위에 광택 효과를 주는 것으로 Aqua 버튼의 최정 결과를 보시면 딱! 아실 겁니다. ^^

뭐… 글로 아무리 길게 장황하게 써도.. 해당 스킨에 대한 전체 코드를 다음 url을 통해 다운로드 받으실 수 있으니 실제 플렉스에서 적용해 보시기 바랍니다.

참고로.. SparkSkin을 통한 스킨 적용은 Flash Builder 4.0 이상에서만 적용된다는 점에 유의하시기 바랍니다. 최근 4.6까지 나왔지요? 저는 4.5 버전을 쓰고 있습니다만…. 여튼.. 위의 스킨을 실제 버튼에 적용하기 위한 방법은 3가지가 있는데.. 그 중에 한가지에 대한 코드는 다음과 같습니다.

스킨을 만드는 작업은.. 코드의 길이에 비해 상당히 많은 시간이 소요되는 작업이라고 생각합니다. 또한 제대로 스킨을 만들려면 디자인 감각까지 갖춰야 하는 매우 고난위도의 작업입니다. 하지만 일단 한번만 만들어 놓으면 지속적으로 활용할 수 있으니… 스킨 제작 작업은 시간과 비용이 소요되더라도 꼭 제대로 해두는 것이 최종 프로젝트 산출물의 가치를 배가 시킬 수 있을 거라 확신합니다.

[Flex] FXG(Flash XML Graphic Format)으로 이미지 그리기

플래시 빌더가 4.0으로 업그레이드 되면서 컴포넌트의 스킨을 SparkSkin 클래스를 통해 만들게 됩니다. 이때 컴포넌트의 모양을 그리기 위해 FXG(Flash XML Graphic Format)를 사용합니다. 컴포넌트의 모양 뿐만 아니라 채움이나 선 모양과 색상 등을 포함해 텍스트, 이미지 표현까지 모든 그리기에 대한 방법입니다.

좀더 체계적이고 정리된 프로젝트 진행을 위해 기존에 알고 있는 다소 돌아가는 방법이 아닌 표준화된 방법을 이용해 컴포넌트의 스킨을 세련되게 입히고자 하는 생각에서 FXG에 관심을 가지고 살펴보던 중에.. 실제 컴포넌트에 스킨으로 입힐 이미지를 FXG를 통해 표현하는 코드를 정리해 봅니다.

FXG에서 비트맵 이미지를 표현하기 위한 방법은 2가지입니다. 첫째는 BitmapImage를 이용해 이미지를 그대로 그리는 방법과 BitmapFill를 이용해 대상이 되는 도형에 비트맵을 채워 넣는 방법입니다. 아래의 코드가 바로 위의 2가지 방법에 대한 예제 코드입니다.


    



    
        
    

아래의 화면은 위의 코드를 통한 실제 결과 화면입니다.사용자 삽입 이미지

[GIS] GeoService-Xr, PostGIS으로부터 Geometry 읽기 오류 Fix

GeoService-Xr은 DuraMap-Xr, FingerEyes-Xr, BlackPoint-Xr을 통해 공간 데이터를 서비스하는 공간 데이터 서버입니다. GeoService-Xr은 ArcSDE, MySQL 그리고 PostgreSQL을 통해 공간 데이터를 읽고 쓸 수 있습니다.

PostgreSQL은 PostGIS을 통해 공간 데이터를 질의하고 있으며 GeoService-Xr 역시 PostGIS를 사용합니다. 이러한 PostGIS을 통해 지오메트리를 읽는 GeoService-Xr의 기능 중 Multi-Polygon에 대해 옳바르게 도형을 표현하지 못하는 문제점이 있어서 이에 대한 버그를 해결하였습니다.

버그 대상이 되는 폴리곤은 Ring을 여러개 가지는 폴리곤으로써.. 예를 들어 구멍이 뚫린 폴리곤의 경우입니다. 아래의 그림은 버그가 해결된 상태에서 PostGIS를 통해 공간 데이터를 가져와 FingerEyes에서 표출한 화면입니다. 클릭하면 원본 크기로 볼 수 있습니다.


해결된 부분에 대한 GeoService-Xr의 소스 코드 부분은 다음과 같습니다. 문제의 근본적인 원인은 PostGIS에서 폴리곤에 대한 Geometry Type에 대한 제 스스로에 대한 이해 부족입니다. 혹… PostGIS를 통해 공간 데이터를 쿼리하고 결과를 받아 좌표를 뽑아 낼때 아래의 코드가 조금이나마 도움이 되시길 바랍니다.

} else if(geometryType_ == Geometry.MULTIPOLYGON) {
    while(row.next()) {
        PGgeometry geom = (PGgeometry)row.getObject(shapeFieldIndex);
        ComposedGeom shp = (ComposedGeom)geom.getGeometry();
        
        // 멀티폴리곤을 구성하는 Ring의 개수 구하기  
        short cntPart = 0; // Ring의 개수!
        int cntGeoms = shp.numGeoms();
        for(int iGeom=0; iGeom        Polygon polygon = (Polygon)shp.getSubGeometry(iGeom);
            cntPart += polygon.numRings();
        }
  
        // 각 Ring을 구성하는 정점(Vertex) 구하기
        for(int iGeom=0; iGeom            Polygon polygon = (Polygon)shp.getSubGeometry(iGeom);
            int numRings = polygon.numRings();
            for(int iRing=0; iRing                LinearRing ring = polygon.getRing(iRing);
                int numPts = ring.numPoints();
                for(int iPt=0; iPt                    Point vtx = ring.getPoint(iPt); // 정점!
                }
            }
        }
    }
}

주의 할점은 멀티폴리곤은 Polygon으로 구성되며 Polygon은 다시 LinearRing으로 구성된다는 점입니다. Polygon이 다시 LinearRing으로 구성되는 이유는 구멍이 뚫린 폴리곤 등을 나타내기 위함입니다.

[GIS] BlackPoint, 공간 데이터 편집 기능

블랙포인트는 안드로이드 기반의 범용 GIS 엔진입니다. 별도의 맵 컴포넌트를 View 형태로 제공함으로써 개발하고자 하는 시스템에 쉽게 사용할 수 있습니다. 블랙포인트는 현장에서 데이터를 취득하기 위한 앱 개발을 위해 현장에서 공간 데이터를 쉽게 편집할 수 있는 공간 데이터 편집 기능을 제공합니다.

사용자 삽입 이미지
위의 화면은 블랙포인트에서 편집 기능에 대한 데모 화면으로 공간 데이터로써 폴리곤을 그릴때 스냅핑 기능을 실행하고 있는 화면입니다. 블랙포인트의 스냅핑 대상은 정점(Vertex)와 세그먼트(Segment)입니다. 이외에도 공간 데이터 편집에 대한 Undo/Redo 기능을 제공하여 보다 정확하고 편리하게 공간 데이터를 편집할 수 있습니다.

다음은 블랙포인트(BlackPoint-Xr)의 편집에 대한 기능 목록 중 일부입니다.

  • 폴리곤/폴리라인/포인트에 대한 Simple Feature Type에 대한 편집
  • 사각형, 원, 타원, 텍스트에 대한 도형 편집
  • 정점 추가 및 삭제 편집
  • 편집 이력에 대한 Undo/Redo 지원
  • 정점과 세그먼트에 대한 스냅핑 기능

블랙포인트에 대해 보다 구체적인 기능이 궁금하시면 언제든 지오서비스(hjkim@geoservice.co.kr)에 문의 하시면 직접 방문하여 시연을 통해 소개해 드리도록 하겠습니다.