Android:为什么我不能将onClickListener赋予VideoView?

时间:2011-05-30 11:04:43

标签: android android-videoview

我写了这些代码:

 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是不可能的?如果是这样,为什么会这样呢?

11 个答案:

答案 0 :(得分:76)

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

答案 1 :(得分:14)

以下是我使用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;
    }
});

答案 2 :(得分:14)

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

由于没有触发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事件。

希望这有助于某人!

答案 3 :(得分:13)

我知道这已经过时但是我用过这个:

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

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

            return false;
        }
    });

答案 4 :(得分:2)

这可能早该推迟,但对可能遇到类似问题的人有所帮助。我解决这个问题的方法是在视频视图的顶部放置一个透明的图像视图,然后在图像视图上听取onClick事件,然后做我想做的事情。之后我想用视频视图。

答案 5 :(得分:2)

我意识到这是一个老问题,但我想我会简单地解决这个问题。我不能回答为什么这不起作用 - 在我看来似乎是一个很大的疏忽。但是一个简单的解决方法是将VideoView作为FrameLayout中的唯一View放置,并在布局上设置OnClickListener。不理想,但它有效。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

您可以尝试Gesture Overlay View

您应该能够将此视图叠加在另一个视图的顶部,以便获取触摸事件。

希望这有帮助!

答案 9 :(得分:0)

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

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

答案 10 :(得分:-3)

我可以使用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();
            }
        }
    });