만족
[Android Studio] ViewFlipper 본문
[Android Studio] ViewFlipper
FrontEnd/Android Satisfaction 2017. 6. 30. 03:51여러 개의 뷰들을 뷰 플리퍼에 포함시켜
뷰 플리퍼 내에 들어있는 여러가지 뷰 들중 하나의 뷰를 선택하여 보여줄 수 있게 한다.
<패턴 1>
ViewFlipper태그를 xml에 추가하고, 해당 태그 내부에 뷰 플리퍼에 속하게 할 뷰들을 추가한다.
그리고 나서 JAVA에서 findViewById로 flipper를 찾는다.
추가한 뷰는 첫번째 뷰부터 시작해서,
showNext() //다음 뷰 보여주기
showPrevious() //이전 뷰 보여주기
setDisplayedChild(int whichChild) //원하는 인덱스의 뷰 보여주기
를 이용하여 보여줄 뷰를 전환할 수 있다.
예를 들어서
xml코드가
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.windows10.exflipper.MainActivity">
<ViewFlipper
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewFlipper"
tools:layout_editor_absoluteY="8dp"
tools:layout_editor_absoluteX="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#FF0000"></LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#FFFFFF">
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#777777"></LinearLayout>
</ViewFlipper>
</LinearLayout>
이렇게 되어 있고
JAVA코드가 이렇게 되어 있다면
package com.example.windows10.exflipper;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Toast;
import android.widget.ViewFlipper;
public class MainActivity extends AppCompatActivity {
private ViewFlipper flipper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
flipper=(ViewFlipper)findViewById(R.id.viewFlipper);
flipper.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flipper.showNext();
}
});
}
}
뷰 플리퍼를 클릭할 때마다, 리니어 레이아웃 하나씩 보여주게 된다.
주의할 점은, xml에서 뷰 플리퍼의 Child로, ViewGroup(ex LinearLayout)이 아닌, View(ex TextView)를 넣게 되면
정상적으로 화면이 표시되지 않게 된다.
(ViewFlipper가 뷰그룹 단위로 화면을 전환하기 때문)
<패턴 2>
미리 xml에서 ViewFlipper의 원소를 추가하지 않고,
필요한 요소를 JAVA코드에서 레이아웃 인플레이팅을 통하여 추가하는 방식이다.
이 방법은 xml에서 바로 추가하는 것보다 좀 더 유연할 수 있지만, 코드가 많이 길어진다는 단점이 있다.
예를 들어, xml이
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.windows10.exflipper.MainActivity">
<ViewFlipper
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/viewFlipper"
tools:layout_editor_absoluteY="8dp"
tools:layout_editor_absoluteX="8dp">
</ViewFlipper>
</LinearLayout>
이고, JAVA가
package com.example.windows10.exflipper;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;
import android.widget.ViewFlipper;
public class MainActivity extends AppCompatActivity {
private ViewFlipper flipper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
flipper=(ViewFlipper)findViewById(R.id.viewFlipper);
LinearLayout linear[]=new LinearLayout[3];
for(int i=0; i<3; i++){
linear[i]=new LinearLayout(getApplicationContext());
}
linear[0].setBackgroundColor(getResources().getColor(R.color.colorPrimaryDark));
flipper.addView(linear[0]);
linear[1].setBackgroundColor(getResources().getColor(R.color.colorPrimary));
flipper.addView(linear[1]);
linear[2].setBackgroundColor(getResources().getColor(R.color.colorAccent));
flipper.addView(linear[2]);
flipper.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
flipper.showNext();
}
});
}
}
이라면, flipper에 addView메소드를 통하여 JAVA에서 만든 View를 추가할 수 있다.
뷰 플리퍼의 매끄러운 전환
일반적으로, 뷰 플리퍼는 위에서처럼 클릭하는 동작보다는 사용자가 옆으로 넘기는 동작을 통해 뷰를 전환하게 된다.
setOnTouchListener와 Animation을 동시에 사용하여 그것을 구현할 수 있다.
Animation은 http://blog.naver.com/rndrjs123/221038070076 을 참조하면 된다.
flipper.setOnTouchListener를 이용하여 터치리스너를 만든다.
onTouch메소드를 오버라이드하여 해당 기능을 구현한다.
클래스에 우선
float downX;
float upX;
처럼 float 타입 변수를 두개 만든다.
(반드시 메소드 바깥쪽에 만들어야 한다.
내부 익명 클래스에 만들면 메소드가 종료됨과 동시에 값의 보존이 불가능하기 때문이다.)
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
//ACTION_DOWN is constant that means "A person's hand is put on touch panel".
if(motionEvent.getAction()==MotionEvent.ACTION_DOWN){
downX=motionEvent.getX();
}
//ACTION_UP is constant that means "A person's hand is put off on touch panel".
else if(motionEvent.getAction()==MotionEvent.ACTION_UP){
upX=motionEvent.getX();
if (upX < downX){
flipper.showNext();
}else if(upX> downX){
flipper.showPrevious();
}
return true;
}
이 메소드는 사용자가 터치패널을 눌렀을 때와 손을 떼었을 때의 X좌표값을 비교하여
오른쪽으로 넘겼는지, 왼쪽으로 넘겼는지를 판단하여 showNext(), showPrevious() 동작을 선택적으로 할 수 있게 하는 메소드이다.
이제 애니메이션을 다음 메소드를 이용하여 적용한다.
setInAnimation(Animation ani) //전환되는 뷰에서 표시될 뷰에 적용할 애니메이션
setOutAnimation(Animation ani) //전환되는 뷰에서 감춰질 뷰에 적용할 애니메이션
그러면 우리가 흔히 보던 ViewFlipper의 동작을 구현할 수 있게 된다.
'FrontEnd > Android' 카테고리의 다른 글
[Android Studio] Dialog (0) | 2017.07.27 |
---|---|
[Android Studio] 코드로 키 패드 열기 (0) | 2017.07.20 |
[Android Studio] Visibility 속성값의 invisible, gone 차이점 (0) | 2017.06.30 |
[Android Studio] Animation (0) | 2017.06.30 |
[Android Studio] Activity Title Label 없애기 (0) | 2017.06.30 |