安卓:为什么我不能给VideoView添加一个onClick监听器?

64

我编写了以下代码:

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

然而,当我运行我的应用程序时,单击事件从未被调用。

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


需要设置可点击状态为true吗?mVideoView.setClickable(true); - Peter
11个回答

86

使用VideoView.setOnTouchListener(..)可以为VideoView设置触摸监听器。


18

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

// 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;
    }
});

2
对于resume()不起作用的那些人,这是解决方案 Stack - BlueSword
1
“bVideoIsBeingTouched”变量的目的是什么?就我所看到的,您只是重写它,但没有使用它。 - Jerry
使用 bVideoIsBeingTouched 是可怕的解决方法,你应该检测 MotionEvent.ACTION_UP - AndrewBloom

16

我知道这已经过时了,但我使用了这个:

    mVideoView.setOnTouchListener(new View.OnTouchListener()
    {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            Log.i(TAG, "Video 1 clicked, starting playback");

            return false;
        }
    });

我尝试使用这段代码片段,但是当我点击时,活动关闭并且应用程序崩溃了。 - vhbsouza
是的,我也做了同样的事情,现在它对我起作用了。 - Jose Ricardo Citerio Alcala

15

我知道这是一个旧问题,但以下是我的做法:

由于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事件。

希望这对某些人有所帮助!


8
通常,“点击”行为的触摸事件应该只在 ACTION_UP 时消费,而不是 ACTION_DOWN,以便用户能够表达点击的意图。这就是为什么还存在其他事件(例如 ACTION_CANCEL)。用户开始按压,然后将指针移动到视图范围之外。 - Dallas
达拉斯说得对,应该是 ACTION_UP 而不是 ACTION_DOWN。 - Larry Mustaine
4
我刚遇到了这个问题,我同意使用ACTION_UP通常是更好的做法,但在这种情况下,VideoView似乎只提供ACTION_DOWN! - Gyan aka Gary Buyn
我发现了同样的问题,它只使用了 down。 - Clive Jefferies

2

我知道这是一个老问题,但我想提供一个简单的解决方法。我不知道为什么原来的方法不起作用——在我看来这是一个大疏忽。但是有一个简单的解决方法,就是将你的VideoView放在FrameLayout中作为唯一的View,并在布局上设置OnClickListener。虽然不是最理想的方法,但它能够解决问题。


2

这可能已经拖得太久了,但对于那些可能遇到类似问题的人来说仍然有所帮助。我解决这个问题的方法是在视频视图上放置一个透明的图像视图,然后监听图像视图上的onClick事件,并在之后对视频视图进行任何想要做的操作。


1

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


VideoView和MediaController之间的交互非常有限。例如,在点击操作期间,VideoView仅会检查MediaController是否正在显示,并相应地显示/隐藏它。 虽然您肯定可以在这些API中进行黑客攻击,但这并不是这些API所期望的。 - Henry

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

1

您可以通过覆盖布局来解决此问题。我使用了LinearLayout。

            <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()
                }
}

0

你可以尝试使用手势叠加视图

通过将这个视图叠加在另一个视图上,你应该能够获取触摸事件。

希望对你有所帮助!


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - sashoalm
哎呀,我写这个的时候还是个新手 :) - Codeman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接