2011-05-30 99 views
50

我已經寫了幾行代碼:Android:爲什麼我無法將onClickListener添加到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?而且,如果是這樣,爲什麼會這樣呢?

+0

mb need set clickable status:true? mVideoView。setClickable(真); – Peter 2011-05-30 11:39:06

回答

0

VideoView是一個包含mdeiaplayer和surfaceView的包裝器。您可以通過MediaController進行交互或編寫自己的SurfaceView並實現onClick事件。

71

使用VideoView.setOnTouchListener(..)它適用於VideoView

0

你可以嘗試Gesture Overlay View

你應該能夠覆蓋在其他視圖頂部這一觀點,以獲得觸摸事件。

希望這會有所幫助!

+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 – sashoalm 2015-02-05 14:37:44

+0

d'oh。當我寫這個時,我是一個新手:) – Codeman 2015-02-05 18:13:58

2

這可能是姍姍來遲,但對可能遇到類似問題的人有一些幫助。我解決這個問題的方法是在視頻視圖頂部放置一個透明的圖像視圖,然後在圖像視圖上監聽onClick事件,然後執行我以後想要對視頻視圖執行的任何操作。

-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(); 
      } 
     } 
    }); 
+2

男人,這正是OP說他在做什麼!重點在於視頻播放時不起作用。 – Alex 2012-11-06 18:15:11

13

下面是如何使用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; 
    } 
}); 
+1

對於那些'resume()'不起作用的人;這裏是解決方案[Stack](http://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCkQFjAA&url=http%3A%2F%2Fstackoverflow.com%2Fquestions%2F11960730 %2Fresume-playing-videoview-from-onresume&ei = JmbjUqmGK8P9rAe29IDYBA&usg = AFQjCNHWIPXnoKBCfV4ctFukFPDXYl303g&sig2 = NJyXl7J9j8FA3AOBEmIXow&bvm = bv.59930103,d.bmk) – BlueSword 2014-01-25 07:31:45

+0

'bVideoIsBeingTouched'變量的用途是什麼?據我所見,你只是在重寫它,但你不使用它。 – Jerry 2017-08-16 09:34:05

13

我知道這是舊的,但我用這樣的:

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

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

      return false; 
     } 
    }); 
+0

我試圖使用這個片段,但是當我點擊時,活動關閉並且應用程序關閉。 – vhbsouza 2015-08-06 13:33:40

+0

是的,我做了同樣的事情,現在它爲我工作。 – 2017-01-31 00:00:18

12

我知道這是老問題,但這裏是我所做的:

由於setOnClickListener沒有被觸發,我創建了我的自己的類延伸VideoView

public class VideoViewCustom extends VideoView{ 

和Overrided的的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 2013-09-01 22:01:26

+0

達拉斯是正確的,它應該是ACTION_UP而不是ACTION_DOWN – 2014-02-06 15:56:11

+4

我剛剛遇到這個問題,我同意ACTION_UP通常是更好的做法,但在這種情況下,VideoView只似乎提供了ACTION_DOWN! – 2015-03-26 22:21:45

1

如果您想要觸摸視頻的特定部分執行某些操作,您可以使用視頻視圖中透明的按鈕。

2

我意識到這是一個老問題,但我認爲我會用一個簡單的解決方法。我無法回答爲什麼這不起作用 - 在我看來,這似乎是一個很大的疏忽。但一個簡單的解決方法是將您的VideoView作爲唯一的View放在FrameLayout中,並在佈局上設置一個OnClickListener。不理想,但它的工作原理。

相關問題