public class View_Flipper extends LinearLayout implements View.OnTouchListener {
public static int cntIndex= 10; // 뷰플리퍼를 구현할 화면의 갯수 LinearLayout indexLayout; // 현재 화면의 인덱스를 표현하기 위한 레이아웃 ImageView[] indexImgs; // 현재 화면의 인덱스를 나타내는 이미지들 View[] views; // 뷰플리퍼에 사용할 뷰 ViewFlipper viewFlipper;
float startX; // 손가락으로 화면을 터치했을 때 x좌표값을 저장하기 위한 변수 float endX; // 화면에서 손가락을 뗏을 때 x좌표값을 저장하기 위한 변수
int currentIndex = 0; //현재의 화면 인덱스 값
public View_Flipper(Context context) { super(context); init(context); }
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.leftMargin = 50;
indexImgs = new ImageView[cntIndex]; views = new ImageView[cntIndex];
//index 이미지와 뷰플리퍼 화면을 만드는 과정 for(int i=0; i < cntIndex; i++){ indexImgs[i] = new ImageView(context);
if (i == currentIndex){ indexImgs[i].setImageResource(android.R.drawable.btn_star_big_on); }else { indexImgs[i].setImageResource(android.R.drawable.btn_star_big_off); }
ImageView currentView = new ImageView(context); currentView.setImageResource(R.mipmap.gametitle_01+i); views[i] = currentView;
viewFlipper.addView(views[i]); } }
//인덱스 이미지를 수정 public void modifyIndex(){ for(int i = 0; i <cntIndex; i++){ if(i == currentIndex) { indexImgs[i].setImageResource(android.R.drawable.btn_star_big_on); }else{ indexImgs[i].setImageResource(android.R.drawable.btn_star_big_off); } } }
public View onCreateView(LayoutInflater inflater, ViewGroup parentView, Bundle savedInstanceState){ // 인플레이트(inflate)를 한다는 것은 동작 가능한 view 객체로 생성한다는 의미 ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment01, parentView,false);
Layout 은 ViewGroup 클래스로부터 상속을 받으며, Layout 안에 존재하는 위젯(버튼, 텍스트뷰,에디트뷰 등)을 배치한다. 화면에 구성하려면 Layout 에 대해 이해를 해야 한다.
스마트폰의 크기가 다양하므로 절대 픽셀 위주로 Layout을 잡는 것은 대단히 위험하다.
그래서 본 내용에서는 절대 Layout 은 다루지 않는다.
공통
android:layout_width="match_parent" // 무조건 남아있는 여유공간을 채움 android:layout_width="wrap_content" // View의 내용물의 크기에 따라 결정되도록 함 android:layout_margin="10dp" // 위젯과 여유 공간 사이의 여백 설정 android:padding="20dp" // 위젯 내부 여백 설정
LinearLayout
간단하고 직관적으로 이해하기 쉬워서 많아 사용한다.
자식(child) View 들을 수평 또는 수직으로 배치한다.
android:orientation="vertical" // 수직으로 배치(수직으로 차곡차곡 쌓겠다)
Gravity 속성을 이용하여 자식(child) View 를 상단, 하단, 중앙에 배치할 수 있다.
android:layout_weight="1" // View 내부 child끼리의 크기 비율 지정(공간 가중치)
child View 의 가중치를 지정하지 않으면 0 으로 간주하고 확장하지 않는다.
LinearLayout 을 여러개 사용하면 각 Layout의 크기를 지정해야 한다.
내부 LinearLayout 에서 layout_weight="1" 로 모두 지정하면 비율이 동일하게 출력된다.
layout_margin은 "값"만큼 띄어서 배치하겠다는 뜻
android:layout_gravity=center
gravity 속성 앞에 layout이 붙어 있으면 해당 위젯이 포함되어 있는 Layout 위젯의
정렬방식을 의미한다.
RelativeLayout
View 들의 위치가 상대적으로 정해진다.
(기준 View 가 있고, 배치하고자 하는 View를 기준 View의 어디에 둘 것인지 설정)
RelavtiveLayout 은 자신을 포함하고 있는 컨테이너나 다른 위젯을 기준으로 위젯을
배치하는 레이아웃(layout)이다.
부모 컨테이너나 다른 View(위젯)와의 상대적 위치를 이용해 화면을 구성한다.
android:layout_below="@id/topButton" <-- topButton 기준으로 하단에 위치
android:layout_above="@id/bottomButton" <-- bottomButton 기준 위에 위치
★ 자신을 포함하는 컨테이너를 기준으로 해당 위젯을 배치하는 속성들
layout_alignParentTop : 부모 컨테이너의 위쪽과 뷰의 위쪽을 맞춤 layout_alignParentBottom : 부모 컨테이너의 아래쪽과 뷰의 아래쪽을 맞춤 layout_alignParentLeft : 부모 컨테이너의 왼쪽 끝과 뷰의 왼쪽 끝을 맞춤 layout_alignParentRight : 부모 컨테이너의 오른쪽 끝과 뷰의 오른쪽 끝을 맞춤 layout_centerHorizontal : 부모 컨테이너의 수평방향 중앙에 배치 layout_centerVertical : 부모 컨테이너의 수직 방향 중앙에 배치 layout_centerInParent : 부모 컨테이너의 수평과 수직 방향 중앙에 배치
★ 다른 위젯을 기준으로 해당 위젯을 배치하는 속성들
layout_above : 지정한 뷰의 위쪽에 배치 layout_below : 지정한 뷰의 아래쪽에 배치 layout_toLeftOf : 지정한 뷰의 왼쪽에 배치 layout_toRightOf : 지정한 뷰의 오른쪽에 배치 layout_alignTop : 지정한 뷰의 위쪽과 맞춤 layout_alignBottom : 지정한 뷰의 아래쪽과 맞춤 layout_alignLeft : 지정한 뷰의 왼쪽과 맞춤 layout_alignRight : 지정한 뷰의 오른쪽과 맞춤 layout_alignBaseline : 지정한 뷰와 내용물의 아래쪽 기준선(baseline)을 맞춤
android:layout_centerVertical="true"
FrameLayout
여러 Layout 을 중첩시켜, 원하는 Layout 만 볼 수 있도록 해준다.
자식 View 들은 등장하는 순서대로 화면에 중첩되어 표시된다.
기준점은 좌측 상단이 된다.
TableLayout
격자모양의 배열을 이용하여 화면을 구성한다.
자식 View 들을 테이블 형태로 배치한다.
layout_span 은 열을 합쳐서 표시하라는 의미.
layout_span="3" 은 현재 셀부터 3개를 합쳐서 표시하라는 의미
@ : 리소스에서 참조한다는 의미
+ : 새로 생성한다는 의미
id : 식별자를 나타내는 패키지
layout1 : 식별자
이 id 를 이용하여 activity 의 onCreate() 메소드에서 findViewById()를 호출하여 layout1 을 찾을 수 있다.
java 코드에서 참조할 일이 없으면 id를 만들지 않아도 된다.
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // layout 폴더에 있는 main.xml 파일을 찾는다.
// 화면에 나타낼 View를 지정하고, xml Layout의 내용을 메모리상에 객체화한다.
// 이 두줄의 코드 위에 정보를 넣으면 객체화되지 않아서 강제종료 처리가 된다.
layout1 = (LinearLayout) findViewById(R.id.layout1); // id 가 layout1 인 것을 찾는다.