【问题标题】:Android gesture detector in videoView inside fragment片段内videoView中的Android手势检测器
【发布时间】:2014-10-22 10:17:13
【问题描述】:

我在片段中有一个 videoView,我需要检测其上的手势。我尝试使用以下代码没有成功。我怎样才能正确地做到这一点?请需要帮助。提前致谢。

CustomVideoView.java

public class CustomVideoView extends VideoView {

private GestureDetector gestureDetector;


public CustomVideoView(Context context) {
    super(context);
}


public CustomVideoView(Context context, AttributeSet attrs) {
    super(context, attrs);
}


public CustomVideoView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}


@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);
}


@Override
public boolean onTouchEvent(MotionEvent ev) {
    return gestureDetector.onTouchEvent(ev) || super.onTouchEvent(ev);
}

public void setGestureDetector(GestureDetector gestureDetector) {
    this.gestureDetector = gestureDetector;
}
}

MyFragment.java

public class MyFragment extends Fragment{

private Context context;
private CustomVideoView videoView;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    context = getActivity();

    View tmp_view = inflater.inflate(R.layout.my_fragment, container, false);
    assert tmp_view != null;

    videoView = (CustomVideoView) tmp_view.findViewById(R.id.videoView);

    MediaController mc = new MediaController(context);
    mc.setAnchorView(videoView);
    mc.setMediaPlayer(videoView);

    Uri video = Uri.parse("myUrl");
    videoView.setMediaController(mc);
    videoView.setVideoURI(video);
    videoView.requestFocus();
    videoView.start();

    videoView.setGestureDetector(new GestureDetector(new CustomeGestureDetector()));

    return tmp_view;

}

private class CustomeGestureDetector extends GestureDetector.SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

        //NEVER CALLED
        if(e1 == null || e2 == null) return false;
        if(e1.getPointerCount() > 1 || e2.getPointerCount() > 1) return false;
        else {
            try { // right to left swipe .. go to next page
                if(e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 800) {
                    //do your stuff

                    Log.i("MyApp", "right to left");
                    return true;
                } //left to right swipe .. go to prev page
                else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 800) {
                    //do your stuff

                    Log.i("MyApp", "left to right");
                    return true;
                } //bottom to top, go to next document
                else if(e1.getY() - e2.getY() > 100 && Math.abs(velocityY) > 800
                        && videoView.getScrollY() >=  videoView.getHeight()) {
                    //do your stuff
                    return true;
                } //top to bottom, go to prev document
                else if (e2.getY() - e1.getY() > 100 && Math.abs(velocityY) > 800 ) {
                    //do your stuff
                    return true;
                }
            } catch (Exception e) { // nothing
            }
            return false;
        }
    }

    @Override
    public boolean onDown(MotionEvent event) {
        Log.i("MyApp", "onDown");
        //THIS IS CALLED WHEN TOUCH
        return super.onDown(event);
    }

}

当我触摸我的 VideView 时,仅响应其控件(播放、暂停...),但从未调用过手势检测器。也许这些控件干扰了我的手势检测器??

触摸时会调用 onDown 事件,但不会调用 onFling。是否可以通过 onDown 事件实现 onFling 功能?

【问题讨论】:

    标签: android fragment android-videoview gesture detection


    【解决方案1】:

    我不知道为什么,但是将 onDown 方法添加到我的 CustomeGestureDetector 会调用 onFling 方法。

    private class CustomeGestureDetector extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    
        if(e1 == null || e2 == null) return false;
        if(e1.getPointerCount() > 1 || e2.getPointerCount() > 1) return false;
        else {
            try { // right to left swipe .. go to next page
                if(e1.getX() - e2.getX() > 100 && Math.abs(velocityX) > 800) {
                    //do your stuff
    
                    Log.i("MyApp", "right to left");
                    return true;
                } //left to right swipe .. go to prev page
                else if (e2.getX() - e1.getX() > 100 && Math.abs(velocityX) > 800) {
                    //do your stuff
    
                    Log.i("MyApp", "left to right");
                    return true;
                } //bottom to top, go to next document
                else if(e1.getY() - e2.getY() > 100 && Math.abs(velocityY) > 800
                        && videoView.getScrollY() >=  videoView.getHeight()) {
                    //do your stuff
                    return true;
                } //top to bottom, go to prev document
                else if (e2.getY() - e1.getY() > 100 && Math.abs(velocityY) > 800 ) {
                    //do your stuff
                    return true;
                }
            } catch (Exception e) { // nothing
            }
    
            return false;
            }
        }
    
       @Override
        public boolean onDown(MotionEvent event) {
              return true;
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      为了在android中以简单的方式使用GestureDetector,创建一个扩展SimpleOnGestureListner的监听器类,然后覆盖onScrollonFling方法。我认为这些应该是除了 onTouch 之外用户在视频中可能遇到的唯一手势。

      示例源代码:

      class VideoGestureDetector extends SimpleOnGestureListener {
      
          @Override
          public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
      
            // implementation when the user scrolls
            return false;
          }
      
          @Override
          public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
      
            // implementation when the user flings
            return false;
          }
        }
      

      【讨论】:

      • 我刚刚用 onFling 方法创建了一个监听器类。我的问题是永远不会被调用。当我触摸视频视图时,仅响应其控件(播放、停止...),但从未调用过手势检测器。
      • 我正在尝试调试您的代码。我一发现东西就会回复你。我认为 GestureDetector 没有得到 videoView 的上下文。
      • 我不明白你使用 gestureDetector.onTouchEvent(ev) || super.onTouchEvent(ev) 的逻辑。你为什么这样做?
      • 返回CustomeGestureDetector结果
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多