완전히 변경할 수 있도록하기 위해 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.
감사합니다.