public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if(v != flipper){ //터치 이벤트가 일어난 뷰가 ViewFlipper가 아니면 return
return false;
}
if(event.getAction() == MotionEvent.ACTION_DOWN){
xAtDown = event.getX(); //터치 시작지점 x좌표 저장
}
else if(event.getAction() == MotionEvent.ACTION_UP){
xAtUp = event.getX(); //터치 끝난지점 x좌표 저장
int tepChildCount = flipper.getChildCount();
if(xAtUp < xAtDown){
//왼쪽 방향 애니메이션 지정
flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.left_in));
flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.left_out));
//현재 표시되는뷰 index가 flipper의 자식뷰의 갯수와 같고 현재까지 추가된뷰가 pagecount보다 작다면 뷰추가
if((flipper.getDisplayedChild() == (flipper.getChildCount()-1)) &&
(flipper.getChildCount() < Integer.parseInt(attrStorage.get("pagecount").toString()))){
//Base VIew 생성 함수 호출
Log.e("kjh", "hashmap : " + attrStorage);
String pageTagName = "page" + (flipper.getChildCount()+1); //현재까지 추가된 페이지의 다음페이지
AddPage(pageTagName);
}
if(flipper.getDisplayedChild() < (flipper.getChildCount()-1)){
//페이지전환시 VideoView의 잔상이 남는현상을 해결
if(subVideoView != null){
if(subVideoView.isPlaying()){
Log.e("kjh", "subVideoView is playing! : " + subVideoView.getBufferPercentage());
subVideoView.stopPlayback();
subVideoView.setVisibility(View.GONE);
}
else if(subVideoView.getVisibility() == View.GONE){
Log.e("kjh", "subVideoView is gone! : " + subVideoView.getBufferPercentage());
subVideoView.setVisibility(View.VISIBLE);
subVideoView.start();
}
}
//다음 View 보여줌
flipper.showNext();
}
}
else if(xAtUp > xAtDown){
//오른쪽 방향 애니메이션 지정
flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.right_in));
flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.right_out));
if(flipper.getDisplayedChild() > 0){
//페이지전환시 VideoView의 잔상이 남는현상을 해결
if(subVideoView != null){ //페이지가 추가되어있다면
if(subVideoView.isPlaying()){
Log.e("kjh", "subVideoView is playing! : " + subVideoView.getBufferPercentage());
subVideoView.stopPlayback();
subVideoView.setVisibility(View.GONE);
}
else if(subVideoView.getVisibility() == View.GONE){
Log.e("kjh", "subVideoView is gone! : " + subVideoView.getBufferPercentage());
subVideoView.setVisibility(View.VISIBLE);
subVideoView.start();
}
}
//이전 View 보여줌
flipper.showPrevious();
}
}
}
return true;
}
ViewFlipper 에서 페이지전환시 맨마지막 자식뷰상태에서 현재까지 추가된뷰가 PageCount보다 작다면 뷰를 추가하는 코드입니다.
그런데 추가되는 자식뷰형태가 BaseView로 ImageView를 두고(전체화면) 특정좌표에 SubView로 VideoView를 가지고 있는 페이지가 있습니다.
그래서 페이지전환시 VideoView를 종료 시켜주고 싶은데요.
조건을 isPlaying()으로 만 주니 동영상이 재생될때말고 로딩중이라던가 그럴때는 처리가안되더라구요.
조건을 어떤식으로 줘야 VideoView를 항상 종료시킬수있을까요?
//페이지전환시 VideoView의 잔상이 남는현상을 해결
if(subVideoView != null){ //페이지가 추가되어있다면
if(subVideoView.isPlaying){
Log.e("kjh", "subVideoView is playing! : " + subVideoView.getBufferPercentage());
subVideoView.stopPlayback();
subVideoView.setVisibility(View.GONE);
}
else if(subVideoView.getVisibility() == View.GONE){
Log.e("kjh", "subVideoView is gone! : " + subVideoView.getBufferPercentage());
subVideoView.setVisibility(View.VISIBLE);
subVideoView.start();
}
}
//이전 View 보여줌
flipper.showPrevious();
이부분이 종료시켜주는부분인데
조건을 어떻게줘야할까요
음......
그냥 비디오뷰(안의 미디어 플레이어)를 release 시키는건 어떤가요?
상태값에 상관없이 호출 가능하거든요.
다시 쓸때는 새로 생성해서 쓰셔야 합니다.
조금 지난 글이지만 조금이나마 도움이 되시길 바라면서 작성해봅니다.
기본적으로 videoview는 mediaplayer를 상속받아 만든 player입니다.
그럼 당연히 release가 있어야 하겠지만 안타깝게도 기본적으로 제공하지는 않습니다.
그래서 영상을 stop()시켜주고 videoview 객체를 null로 날려주는게 기본 api 상에서 볼때 할수 있는 방법이겠지요...
그런데, 조금만 더 생각을 해본다면....안드로이드 full source를 이용한다면 custom videoview class를 만들어 사용하면 이러한 문제점들이 해결이 될텐데요....
full source에서 기본적인 videoview를 구현하고 거기에 release를 시켜 줄 수 있는 기능이 추가가 되면 되겠죵?
(솔직히 이러나 저러나 큰 차이점은 못느끼실꺼 같아요..^^;;;)




뭔가 많이 잘못된거같은데..
도움 좀 주세요 ㅜㅜ