【问题标题】:Android: Why can't I give an onClickListener to a VideoView?Android:为什么我不能给 VideoView 一个 onClickListener?
【发布时间】:2011-09-04 18:00:33
【问题描述】:

我写了这几行代码:

 mVideoView = (VideoView) findViewById(R.id.video_view);
    mVideoView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.v("LOG_TAG, click");
        }
    });

但是,当我运行我的应用程序时,从不调用 click 事件。

所以我想知道,在 VideoView 上注册 OnClickListener 是不可能的吗?如果是这样,为什么会这样?

【问题讨论】:

  • mb 需要设置可点击状态:真? mVideoView.setClickable(true);

标签: android android-videoview


【解决方案1】:

使用 VideoView.setOnTouchListener(..) 它适用于 VideoView

【讨论】:

    【解决方案2】:

    以下是我使用 onTouch 解决 VideoViews 暂停/播放的方法:

    // Class variables
    private boolean bVideoIsBeingTouched = false;
    private Handler mHandler = new Handler();
    
    vvVideo.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
        if (!bVideoIsBeingTouched) {
            bVideoIsBeingTouched = true;
        if (vvVideo.isPlaying()) {
            vvVideo.pause();
        } else {
            vvVideo.resume();
        }
        mHandler.postDelayed(new Runnable() {
            public void run() {
                bVideoIsBeingTouched = false;
            }
            }, 100);
        }
        return true;
        }
    });
    

    【讨论】:

    • 对于那些resume() 不起作用的人;这是解决方案Stack
    • 'bVideoIsBeingTouched' 变量的用途是什么?据我所知,您只是在重写它,但您没有使用它。
    • 使用bVideoIsBeingTouched 是可怕的解决方法,您应该检测到MotionEvent.ACTION_UP
    【解决方案3】:

    我知道这是旧的,但我用过这个:

        mVideoView.setOnTouchListener(new View.OnTouchListener()
        {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
    
                Log.i(TAG, "Video 1 clicked, starting playback");
    
                return false;
            }
        });
    

    【讨论】:

    • 我尝试使用这个 sn-p 但是当我点击时,活动关闭并且应用程序关闭。
    • 是的,我做了同样的事情,现在它对我有用。
    【解决方案4】:

    我知道这是个老问题,但这是我所做的:

    由于未触发 setOnClickListener,我创建了自己的扩展 VideoView 的类

    public class VideoViewCustom extends VideoView{
    

    并覆盖了 onTouchEvent

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
    
        if(ev.getAction() == MotionEvent.ACTION_DOWN){
            Log.d(TAG, "ACTION_DOWN");
        }
    
        return super.onTouchEvent(ev);
    }
    

    现在我可以通过 MotionEvent 获取 onClick 事件。

    希望这对某人有所帮助!

    【讨论】:

    • 一般来说,“点击”的触摸事件应该只在 ACTION_UP 上使用,而不是 ACTION_DOWN 以允许用户表达点击意图。这就是存在诸如 ACTION_CANCEL 之类的其他事件的原因。用户开始按下,然后将指针移到视图边界之外。
    • 达拉斯是对的,应该是 ACTION_UP 而不是 ACTION_DOWN
    • 我刚遇到这个问题,我同意 ACTION_UP 通常是更好的做法,但在这种情况下,VideoView 似乎只提供 ACTION_DOWN!
    • 我也发现了,只用down
    【解决方案5】:

    这可能早就应该进行了,但对于那些可能遇到类似问题的人来说还是有一些帮助的。我解决这个问题的方法是在视频视图的顶部放置一个透明的图像视图,然后在图像视图上监听 onClick 事件,然后对视频视图做任何我想做的事情。

    【讨论】:

      【解决方案6】:

      我意识到这是一个老问题,但我想我会提出一个简单的解决方法。我无法回答为什么这不起作用 - 在我看来,这似乎是一个很大的疏忽。但是一个简单的解决方法是将您的 VideoView 作为 FrameLayout 中的唯一视图,并在布局上设置一个 OnClickListener。不理想,但可以。

      【讨论】:

        【解决方案7】:

        如果您希望触摸视频的特定部分来执行某些操作,则可以使用在视频视图上透明的按钮。

        【讨论】:

          【解决方案8】:

          您可以通过封面布局解决此问题。 我使用了线性布局。

                      <LinearLayout
                          android:id="@+id/video1"
                          android:layout_width="wrap_content"
                          android:layout_height="wrap_content"
                          android:layout_gravity="center">
                          <VideoView
                              android:id="@+id/video2"
                              android:layout_width="370dp"
                              android:layout_height="180dp"
                              android:layout_gravity="center"
                              app:elevation = "0dp"
                              android:background="@mipmap/video"
                              app:layout_constraintBottom_toBottomOf="parent"
                              app:layout_constraintEnd_toEndOf="parent"
                              app:layout_constraintStart_toStartOf="parent"
                              app:layout_constraintTop_toTopOf="parent"
                              android:visibility="visible"
                              />
          
                      </LinearLayout>
          

          并在源文件中尝试。

          video1.setOnClickListener {
                          if(Video.isPlaying) {
                              Video.pause()
                          }
                          else {
                              Video.start()
                          }
          }
          

          【讨论】:

            【解决方案9】:

            VideoView 是一个包含 MediaPlayer 和 SurfaceView 的包装器。您可以通过 MediaController 进行交互,也可以编写自己的 SurfaceView 并实现 onClick 事件。

            【讨论】:

            • VideoView 和 MediaController 之间的交互非常有限。例如,在点击动作期间,VideoView 只会检查 MediaController 是否正在显示并相应地显示/隐藏它。尽管您肯定可以破解这些 API,但这并不是这些 API 所期望的。
            【解决方案10】:

            你可以试试Gesture Overlay View

            您应该能够将此视图覆盖在另一个视图之上以获得触摸事件。

            希望这会有所帮助!

            【讨论】:

            • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
            • 哦。我写这个的时候还是个新手 :)
            【解决方案11】:

            我可能已经使用 onSetClickListener 做到了这一点。这是一个代码供您参考:

            mVideoView.setOnClickListener(new View.OnClickListener() {
                @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        //Here you put a condition for playing a video when you click on your video view.//
                        if(my_video.isPressed())
                        {   
                            my_video.start();
                        } else {
                            Toast.makeText(getApplicationContext(), 
                                "Not able to run This Video!", 
                                Toast.LENGTH_LONG).show();
                        }
                    }
                });
            

            【讨论】:

            • 伙计,这正是 OP 所说的他正在做的事情!关键是在播放视频时它不起作用。
            猜你喜欢
            • 1970-01-01
            • 2021-04-02
            • 2011-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-03-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多