2012-07-16 2 views
0

완전히 변경할 수 있도록하기 위해 MediaController를 하위 클래스로 만들려고합니다. 변경할 수없는 레거시 코드가 있으므로 vidtry 접근 방식을 사용하지 않습니다.사용자 지정 MediaController 하위 클래스의 터치 이벤트를 가로 챌 수 없습니다.

내 코드는 다음과 거의 같습니다

mc_layout.xml :

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

    <LinearLayout 
     android:id="@+id/top" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     ...> 

     // Some buttons 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/bottom" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     ... > 

     // Some buttons 

    </LinearLayout> 

mc_subclass.java : 이제

public class MCSubclass extends MediaController { 

private View mRoot; 

GestureDetector mGestureDetector = new GestureDetector(getContext(), new SimpleOnGestureListener() { 

    @Override 
    public boolean onDown(MotionEvent e) { 
    // Do something. 
     return true; 
    } 

    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     // Do something. 
     return true; 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     // Do something. 
     return false; 
    } 
}); 

public MCSubclass(final Context context) { 
    super(context); 
} 

public boolean onTouchEvent(final MotionEvent event) { 
// NEVER CALLED! 
    return mGestureDetector.onTouchEvent(event); 
} 

public final void setAnchorView(final View view) { 
    super.setAnchorView(view); 
    FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT, 
      ViewGroup.LayoutParams.MATCH_PARENT 
    ); 

    removeAllViews(); 
    View v = makeControllerView(); 
    addView(v, frameParams); 
} 

private View makeControllerView() { 
    LayoutInflater inflate = (LayoutInflater) getContext().getSystemService(
     Context.LAYOUT_INFLATER_SERVICE); 

    mRoot = inflate.inflate(R.layout.mc_layout, null); 
    initControllerView(mRoot); 
    return mRoot; 
} 

private void initControllerView(View v) { 
    mPlayButton = (ImageButton) v.findViewById(R.id.playBtn); 
    if (mPlayButton != null) { 
     mPlayButton.requestFocus(); 
     mPlayButton.setOnClickListener(mOnClickListener); 
    } 
// Init other views... 
} 

}

, 내가 가지고 모든 컨트롤을 볼 수 있고 그것들은 모두 클릭/터치 동작에 응답하지만 겹쳐진 onTouchEvent를 호출하는 대신 MC 윈도우를 클릭/터치하면 호출 윈도우에서 MediaController의 onTouch가 호출되어 호출 윈도우에 표시 될 수 있습니다. :

MediaController$1.onTouch(View, MotionEvent) line: 149 
PhoneWindow$DecorView(View).dispatchTouchEvent(MotionEvent) line: 3762 
PhoneWindow$DecorView(ViewGroup).dispatchTouchEvent(MotionEvent) line: 897 
PhoneWindow$DecorView.dispatchTouchEvent(MotionEvent) line: 1862  
ViewRoot.handleMessage(Message) line: 1809 
ViewRoot(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 123 

질문은 데코레이션 윈도우 터치 리스너를 교체해야합니까? 아니면 더 나은 방법이 있으며 뭔가 빠졌습니까?

p.s. 나는 lv로 일하고있다. 9 API.

감사합니다.

답변

1

발견! 하나의 항목 만 표시 할 수 있고 크기가 가장 큰 하위 크기 인 FrameLayout을 사용하는 데 문제가 있습니다. 그래서 제 경우에는 예상했던대로 전체 화면을 덮을만큼 커지지 않았습니다. 그 결과, 장식 창은 완벽한 감각을 가진 터치 이벤트를 처리하게되었습니다. 누군가가

을 :)이 언젠가는 도움이 될 것입니다

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <LinearLayout 
     android:id="@+id/top" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     ...> 

     // Some buttons 

    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/bottom" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     ... > 

     // Some buttons 

    </LinearLayout> 
    .... 
</RelativeLayout> 

희망 : 같은

어쨌든 작업 레이아웃은 지금 보이는