IT/Android Studio

s34ViewFilpperTouchDemo 터치 슬라이드 애니메이션으로 다음사진 보기

Millennials 2020. 7. 6. 12:08

penguins.jpg
0.26MB
landscape.jpg
0.06MB
koala.jpg
0.26MB

1)activity_main.xml

2)

3)MainActivity

package kr.android.s34viewflippertouchdemo;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class MainActivity extends AppCompatActivity implements View.OnTouchListener{

    ViewFlipper flipper;
    //터치 이벤트 발생 지점의 x좌표 저장
    float down_x;//터치하는 순간
    float up_x;//터치를 떄는 순간
    int[] imageItems;
    ImageView image1, image2;
    int num;
    int cnt;

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

        imageItems = new int[]{R.drawable.koala,R.drawable.landscape,R.drawable.penguins};

        flipper = (ViewFlipper)findViewById(R.id.flipper);

        //처음부터 많은 ViewFlipper를 등록하면 buffer오버플로우 현상이 일어나기 때문에 ImageView는 두개만 생성한다.
        //그리고 이벤트가 발생하면 두개의 ImageView에 이미지를 교체삽입하는 방식으로 처리해서
        //오버플로우 현상을 방지한다..
        image1 = new ImageView(this);
        image1.setImageResource(imageItems[0]);
        flipper.addView(image1,new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,//넓이
                ViewGroup.LayoutParams.MATCH_PARENT));//높이

        image2 = new ImageView(this);
        flipper.addView(image2,new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,//넓이
                ViewGroup.LayoutParams.MATCH_PARENT));//높이
        //이벤트 연결
        flipper.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        //터치 이벤트가 일어난 뷰가 ViewFliipper가 아니면 return false
        if(view != flipper)return false;

        if(motionEvent.getAction() == motionEvent.ACTION_DOWN){
            //터지 시작 지점 x좌표 저장
            down_x = motionEvent.getX();
        }else if(motionEvent.getAction() == motionEvent.ACTION_UP){
            //터치를 때는 지점 x좌표 저장
            up_x = motionEvent.getX();

            //터치 방향 지정
            if(up_x < down_x){//터치할 때 왼쪽 방향으로 진행
                flipper.setInAnimation(AnimationUtils.loadAnimation(this,R.anim.push_left_in));
                flipper.setOutAnimation(AnimationUtils.loadAnimation(this,R.anim.push_left_out));

                if(++num == imageItems.length) num = 0;

                if(++cnt%2==1){
                    image2.setImageResource(imageItems[num]);
                }else{
                    image1.setImageResource(imageItems[num]);
                }
                flipper.showNext();
            }else if(down_x < up_x){//터치할 때 오른쪽 방향으로 진행
                flipper.setInAnimation(AnimationUtils.loadAnimation(this,R.anim.push_right_in));
                flipper.setOutAnimation(AnimationUtils.loadAnimation(this,R.anim.push_right_out));

                if(--num == -1) num = imageItems.length-1;

                if(++cnt%2==1){
                    image2.setImageResource(imageItems[num]);
                }else{
                    image1.setImageResource(imageItems[num]);
                }
                flipper.showPrevious();
            }
        }

        return true;
    }
}
반응형