주소 : http://muzesong.tistory.com/64
한 화면에 여러개의 뷰를 놓고 싶을 때가 있습니다. 예를 들어 자동차 설명이라면
포르테쿱 이란 모델을 선택 했을 시 나오는 가격, 승차감, 평점 이런 병렬적인 내용을
굳이 depth를 주어 층으로 표현하기보단 한 화면에 뷰 전환으로 나타내면 깔끔해 질것 같습니다.
아래는 간단한 flipper 소스입니다.
처음 터치한 x좌표와 손을 뗀 좌표를 받아서 두 값의 크기를 비교하여 좌로 슬라이드인지
우로 슬라이드 인지 판별한 다음 해당 방향으로 슬라이드 되는 애니메이션이 동작하며
다른 뷰로 전환하게 됩니다.
01 | /*************** Flipper *****************/ |
05 | if (event.getAction() == MotionEvent.ACTION_DOWN) { |
07 | } else if (event.getAction() == MotionEvent.ACTION_UP) { |
08 | xStart = event.getX(); |
12 | float difVal = xEnd- xStart; |
14 | flipper.setInAnimation(AnimationUtils.loadAnimation( this , |
15 | R.anim.push_left_in)); |
16 | flipper.setOutAnimation(AnimationUtils.loadAnimation( this , |
17 | R.anim.push_left_out)); |
19 | flipperIndex = flipper.getDisplayedChild(); |
20 | FlipperIndex(flipperIndex); |
22 | } else if (xStart > xEnd) { |
23 | float difVal = xStart- xEnd; |
25 | flipper.setInAnimation(AnimationUtils.loadAnimation( this , |
26 | R.anim.push_right_in)); |
27 | flipper.setOutAnimation(AnimationUtils.loadAnimation( this , |
28 | R.anim.push_right_out)); |
29 | flipper.showPrevious(); |
30 | flipperIndex = flipper.getDisplayedChild(); |
31 | FlipperIndex(flipperIndex); |
36 | /**************** Flipper ***************/ |
아래는 풀 소스 입니다001 | public class MyViewFlipper extends Activity implements View.OnTouchListener, |
002 | CompoundButton.OnCheckedChangeListener { |
006 | ImageView view1, view2, view3, view4, view5, view6, |
007 | view7, view8, view9, viewb1, viewb2,viewb3; |
011 | /** Called when the activity is first created. */ |
013 | public void onCreate(Bundle savedInstanceState) { |
014 | super .onCreate(savedInstanceState); |
015 | setContentView(R.layout.main); |
017 | viewb1 = (ImageView) findViewById(R.id.viewb1); |
018 | viewb2 = (ImageView) findViewById(R.id.viewb2); |
019 | viewb3 = (ImageView) findViewById(R.id.viewb3); |
020 | view1 = (ImageView) findViewById(R.id.view1); |
021 | view2 = (ImageView) findViewById(R.id.view2); |
022 | view3 = (ImageView) findViewById(R.id.view3); |
023 | view4 = (ImageView) findViewById(R.id.view4); |
024 | view5 = (ImageView) findViewById(R.id.view5); |
025 | view6 = (ImageView) findViewById(R.id.view6); |
026 | view7 = (ImageView) findViewById(R.id.view7); |
027 | view8 = (ImageView) findViewById(R.id.view8); |
028 | view9 = (ImageView) findViewById(R.id.view9); |
029 | view1.setOnTouchListener( this ); |
030 | view2.setOnTouchListener( this ); |
031 | view3.setOnTouchListener( this ); |
032 | view4.setOnTouchListener( this ); |
033 | view5.setOnTouchListener( this ); |
034 | view6.setOnTouchListener( this ); |
035 | view7.setOnTouchListener( this ); |
036 | view8.setOnTouchListener( this ); |
037 | view9.setOnTouchListener( this ); |
038 | checkBox = (CheckBox) findViewById(R.id.chkAuto); |
039 | checkBox.setOnCheckedChangeListener( this ); |
041 | flipper = (ViewFlipper) findViewById(R.id.viewFlipper); |
042 | flipper.setOnTouchListener( this ); |
044 | flipper.setDisplayedChild( 0 ); |
045 | FlipperIndex(flipperIndex); |
049 | * Flipper의 현재 페이지 수를 알려주는 매소드 |
050 | * @param index : 현재 페이지 인덱스 값 |
052 | private void FlipperIndex( int index){ |
054 | viewb1.setImageResource(R.drawable.b2); |
055 | viewb2.setImageResource(R.drawable.b2); |
056 | viewb3.setImageResource(R.drawable.b2); |
061 | viewb1.setImageResource(R.drawable.b1); |
064 | viewb2.setImageResource(R.drawable.b1); |
067 | viewb3.setImageResource(R.drawable.b1); |
073 | * 체크박스 체크시 자동으로 Flipping이 되는 부분 |
076 | public void onCheckedChanged(CompoundButton view, boolean isChecked) { |
079 | if (isChecked == true ) { |
081 | flipper.setInAnimation(AnimationUtils.loadAnimation( this , |
082 | R.anim.push_left_in)); |
083 | flipper.setOutAnimation(AnimationUtils.loadAnimation( this , |
084 | R.anim.push_left_out)); |
086 | flipper.setFlipInterval( 3000 ); |
087 | flipper.startFlipping(); |
090 | flipper.stopFlipping(); |
095 | public boolean onTouch(View v, MotionEvent event) { |
099 | float temp_differenceVal = xEnd- xStart; |
100 | float differenceVal = Math.abs(temp_differenceVal); |
102 | if (differenceVal < 20 ){ |
107 | Toast.makeText(getApplicationContext(), "1" , Toast.LENGTH_SHORT) |
111 | Toast.makeText(getApplicationContext(), "2" , Toast.LENGTH_SHORT) |
115 | Toast.makeText(getApplicationContext(), "3" , Toast.LENGTH_SHORT) |
119 | Toast.makeText(getApplicationContext(), "4" , Toast.LENGTH_SHORT) |
123 | Toast.makeText(getApplicationContext(), "5" , Toast.LENGTH_SHORT) |
127 | Toast.makeText(getApplicationContext(), "6" , Toast.LENGTH_SHORT) |
131 | Toast.makeText(getApplicationContext(), "7" , Toast.LENGTH_SHORT) |
135 | Toast.makeText(getApplicationContext(), "8" , Toast.LENGTH_SHORT) |
139 | Toast.makeText(getApplicationContext(), "9" , Toast.LENGTH_SHORT) |
145 | /*********** Flipper *************/ |
148 | if (event.getAction() == MotionEvent.ACTION_DOWN) { |
150 | } else if (event.getAction() == MotionEvent.ACTION_UP) { |
151 | xStart = event.getX(); |
155 | float difVal = xEnd- xStart; |
157 | flipper.setInAnimation(AnimationUtils.loadAnimation( this , |
158 | R.anim.push_left_in)); |
159 | flipper.setOutAnimation(AnimationUtils.loadAnimation( this , |
160 | R.anim.push_left_out)); |
163 | flipperIndex = flipper.getDisplayedChild(); |
164 | FlipperIndex(flipperIndex); |
166 | } else if (xStart > xEnd) { |
167 | float difVal = xStart- xEnd; |
169 | flipper.setInAnimation(AnimationUtils.loadAnimation( this , |
170 | R.anim.push_right_in)); |
171 | flipper.setOutAnimation(AnimationUtils.loadAnimation( this , |
172 | R.anim.push_right_out)); |
173 | flipper.showPrevious(); |
174 | flipperIndex = flipper.getDisplayedChild(); |
175 | FlipperIndex(flipperIndex); |
180 | /********** Flipper ****************/ |
슬라이드를 할 때마다 해당 뷰의 인덱스를 받아서 들고있고 그 값을 세개의 페이지 표시 이미지뷰를 컨트롤하는 매소드로 보내어 해당 페이지를 표시할 수 있게 했습니다. 그리고 터치 점과 뗏을때 점의 차를 절대 값으로 구한 뒤 그 값이 20 미만이면 터치로 인식하여 안의 오브젝트가 터치되게 만들고 , 20이상이면 슬라이드로 인식하게하여 뷰 전환이 이루어지도록 하였습니다. 결과물을 이렇게 나옵니다.