2010년 10월 12일 화요일

Custom VideoView 작성하기

기본 VideoView 는 화면에 꽉차게 출력되지 않고 MediaController 를 변경하기도 쉽지 않은 문제가 있다. 목적에 맞게 변경하기 위해 새로운 VideoView 를 만들었다.

처음부터 새로운 VideoView 를 작성하기는 어렵고 기본 VideoView 소스 코드를 참조하여 새로 작성하였다.

VideoView 소스 코드: 링크

  • 위치: [platform/frameworks/base.git]/core/java/android/widget/VideoView.java

원본 소스 코드를 복사하여 필요한 부분만 수정하자.

적용하기
  • MediaPlayer.OnErrorListerner 처리하는 부분을 살펴보면 internal 리소스를 사용하는 부분이 보인다.
  • internal 리소스를 사용할 수는 없다.
  • internal 을 사용하는 에러 다이얼로그를 띄우는 부분을 없애버렸다.
    • if(getWindowToken() != null) { ... } 부분
  • 다르게 수정하여도 된다.

화면에 꽉채우기
  • mVideoHeight 와 mVideoWidth 가 사용되는 코드를 찾아보면 mp.getVideoWidth() 와 mp.getVideoHeight() 로 값을 적용하는 곳이 두군데 보인다.
  • 그 대신에 mVideoHeight 와 mVideoWidth 를 ViewGroup.LayoutParams.FILL_PARENT 로 적용하면 화면에 꽉차게 출력한다.

Custom MediaController 작성하기
  • MediaController 소스 코드: 링크
    • 위치: [platform/frameworks/base.git]/core/java/android/widget/MediaController.java
  • 참고(Building Custom Components) : http://developer.android.com/guide/topics/ui/custom-components.html
  • 기존의 MediaController 대신 목적에 맞게 작성한 뷰를 이식시켰다.
  • MediaController 에서 소스를 복사해 오는 거 보다는 참조하면서 필요한 부분은 복사해 왔다.
  • VideoView 에서 호출하는 함수들을 구현해 주었다. 필요에 따라 구현한다.
    • show() - 컨트롤러를 보여준다.
    • hide() - 컨트롤러를 감춘다.
    • setMediaPlayer() - MediaPlayerControl 를 상속한 객체를 받는다.
    • setAnchorView() - MediaController 가 붙어 있을 View 객체
    • setEnabled() - 활성화/비활성화 설정
  • MediaController 소스 코드를 보면 show 부분에 WindowManager 는 사용할 수 없다.
    • 대신 setVisibility 함수를 활용 했다.
  • 그 외 비슷하게 구현하면 된다.
  • 주의) Controller 가 다른 여러 View 를 갖고 있다면 onFinishInflate() 에서 초기화 해주어야 한다.

대부분 기억에 의존해 글을 작성하였다.

댓글 없음:

댓글 쓰기