'안드로이드/Layout'에 해당되는 글 23건

728x90

뷰플리퍼는 여러 개의 뷰를 한 화면에서 보여줄 수 있는 기능을 가진 컨테이너이다.
그래서 여러 개의 뷰를 작성하고 이 뷰들을 한 장 한 장 넘기면서 볼 수 있다.
- 여러 개의 뷰를 한 화면에서 보여줄 수 있다
- 이전, 이후 뷰를 볼 수 있는 메소드가 준비되어 있다


테스트 환경 : Android Studio 2.3.1


view_flipper.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:id="@+id/screenIdx"
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal">
    </LinearLayout>

    <ViewFlipper
        android:id="@+id/flipper"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context="com.tistory.link2me.viewfliper.MainActivity">

    <com.tistory.link2me.viewfliper.View_Flipper
        android:id="@+id/screen"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="10dp" />

</RelativeLayout>


View_Flipper.java

import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ViewFlipper;

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);
    }

    public View_Flipper(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public void init(Context context){
        setBackgroundColor(0xffbbbbff);

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.view_flipper, this, true);

        indexLayout = (LinearLayout) findViewById(R.id.screenIdx);
        viewFlipper = (ViewFlipper) findViewById(R.id.flipper);
        viewFlipper.setOnTouchListener(this);

        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);
            }

            //indexImgs[i].setPadding();
            indexLayout.addView(indexImgs[i], params);

            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);
            }
        }
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(v != viewFlipper) return false;

        if(event.getAction() == MotionEvent.ACTION_DOWN){
            startX = event.getX();
        } else if(event.getAction() == MotionEvent.ACTION_UP){
            endX = event.getX();
            if(startX < endX){ // 왼쪽에서 오른쪽으로 터치
                //viewFlipper에 애니메이션 설정
                viewFlipper.setInAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.left_in));
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.right_out));

                //인덱스체크 - 첫번째화면이면 동작없음
                if(currentIndex > 0){
                    viewFlipper.showPrevious();
                    currentIndex--;
                    modifyIndex();
                }
            } else if(startX > endX){ // 오른쪽에서 왼쪽으로 터치
                viewFlipper.setInAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.right_in));
                viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.left_out));

                //인덱스체크 - 마지막화면이면 동작없음
                if(currentIndex < (cntIndex-1)){
                    viewFlipper.showNext();
                    currentIndex++;
                    modifyIndex();
                }
            }
        }
        return true;
    }
}


나머지 파일을 포함해서 실행해 볼 수 있는 전체 파일

view_flipper.zip


'안드로이드 > Layout' 카테고리의 다른 글

Android Fragment 기본 예제  (0) 2018.09.11
FloatingActionButton(FAB)  (0) 2018.08.15
LinearLayout weight  (0) 2018.03.01
Fragment 화면 이동  (0) 2017.03.26
안드로이드 Layout  (0) 2016.07.23
블로그 이미지

Link2Me

,
728x90

fragment란 activity안에 속해있는 화면으로 새로운 activity를 띄우는게 아니라,

하나의 activity에서 fragment만 바꿔가면서 보여주기 때문에

한 activity화면에서 여러개의 화면을 볼 수 있게 해주는 것이라고 할 수 있다.

 

https://developer.android.com/guide/components/fragments.html

 

본 예제는 두 개의 Fragment 를 생성하고 하나의 Fragment 만 Activity 상에 보이도록 할 것이다.
그리고, 액티비티의 버튼을 누르면 다른 Fragment 로 교체되도록 하는 내용에 대해서 적어둔다.

 

fragment_main.zip
다운로드

 

=== fragment01.xml ===

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv01"
        android:text="프레그먼트01 입니다"
        android:textSize="20dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn01"
        android:text="Fragment02 로 이동"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

 

=== fragment02.xml ===

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="#ff0"
    android:gravity="center"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv02"
        android:text="프레그먼트02 입니다"
        android:textSize="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/btn02"
        android:text="Fragment 01로 이동"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

 

=== activity_main.xml ===

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/parentView"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <fragment
        android:id="@+id/frag01"
        android:name="com.tistory.link2me.fragment.Fragment01"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

 

=== Fragment01.java ===

package com.tistory.link2me.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class Fragment01 extends Fragment {

    public View onCreateView(LayoutInflater inflater, ViewGroup parentView, Bundle savedInstanceState){
        // 인플레이트(inflate)를 한다는 것은 동작 가능한 view 객체로 생성한다는 의미
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment01, parentView,false);

        Button btn = (Button) rootView.findViewById(R.id.btn01);
        btn.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                MainActivity mainActivity = (MainActivity) getActivity();
                mainActivity.onFragmentChanged(0);
            }
        });

        return rootView;
    }
}

 

=== Fragment02.java ===

package com.tistory.link2me.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

public class Fragment02 extends Fragment {
    public View onCreateView(LayoutInflater inflater, ViewGroup parentView, Bundle savedInstanceState){

        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment02, parentView,false);

        Button btn = (Button) rootView.findViewById(R.id.btn02);
        btn.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                MainActivity mainActivity = (MainActivity) getActivity();
                mainActivity.onFragmentChanged(1);
            }
        });

        return rootView;
    }
}

 

=== MainActivity.java ===

package com.tistory.link2me.fragment;

import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    Fragment01 fragment01;
    Fragment02 fragment02;

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

        // 초기 지정은 frag01 로

        fragment01 = (Fragment01) getSupportFragmentManager().findFragmentById(R.id.frag01);
        fragment02 = new Fragment02();
    }

    public void onFragmentChanged(int index){
        if(index == 0){
            getSupportFragmentManager().beginTransaction().replace(R.id.parentView,fragment02).commit();
        } else if(index == 1){
            getSupportFragmentManager().beginTransaction().replace(R.id.parentView,fragment01).commit();
        }
    }
}

 

 

'안드로이드 > Layout' 카테고리의 다른 글

Android Fragment 기본 예제  (0) 2018.09.11
FloatingActionButton(FAB)  (0) 2018.08.15
LinearLayout weight  (0) 2018.03.01
Android ViewFlipper(뷰플리퍼)  (0) 2017.05.02
안드로이드 Layout  (0) 2016.07.23
블로그 이미지

Link2Me

,
728x90

안드로이드 애플리케이션은 크게 '자바코드'와 '리소스'로 구성된다.

자바코드는 애플리케이션의 흐름과 기능을 정의하는 부분이고

리소스는 Layout 이나 이미지와 같이 주로 애플리케이션이 사용자에게 보이는 부분이다.

Manifest는 설치된 애플리케이션의 구성요소나 권한을 정의한다.


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"  // 수직으로 배치(수직으로 차곡차곡 쌓겠다)

 android:gravity="top" // 상단 (View의 정렬방향을 설정)

 android:gravity="left|top" // 왼쪽 상단

 android:gravity="center_horizontal|center_vertical"  // 정중앙

 android:gravity="right|bottom"  // 오른쪽 하단

 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  인 것을 찾는다.


background 속성

- #RRGGBB 값을 지정한다. R:red, G:green, B:blue

- #AARRGGBB 방식인 경우 AA:투명도를 나타내며 00 : 완전투명, FF:완전불투명, 77 : 반투명


Android 폰의 해상도와 관계없이 잘 작동하는 화면을 만들 때 dp 단위를 많이 사용한다.


padding 속성

- 자신의 내부에 들어있는 위젯과 자신의 경계선과의 간격을 지정

- padding은 상하좌우 모두에 지정하는 속성

- 따로 지정하고 싶으면 paddingTop, paddingBottom, paddingLeft, paddingRight를 이용


layout_margin

- 자신의 부모 Layout 이나 위젯과의 간격, 주위의 다른 위젯과의 간격을 지정한다.



'안드로이드 > Layout' 카테고리의 다른 글

Android Fragment 기본 예제  (0) 2018.09.11
FloatingActionButton(FAB)  (0) 2018.08.15
LinearLayout weight  (0) 2018.03.01
Android ViewFlipper(뷰플리퍼)  (0) 2017.05.02
Fragment 화면 이동  (0) 2017.03.26
블로그 이미지

Link2Me

,