日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Cocos2dx 3.11版本 视频添加跳过按钮

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cocos2dx 3.11版本 视频添加跳过按钮 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近比較忙,這里不寫原理只寫代碼,以后再補。

目前跨平臺處理,只在Android和ios實現。其他平臺暫時未加。

1.frameworks/cocos2d-x/cocos/ui/UIVideoPlayer.h?

添加一個函數

virtual void addSkipButton();

2.在ios和Android實現的地方實現以下上面的方法

2.1 ios

UIVideoPlayer-ios.mm源碼貼過來吧。。。忙。。。

addSkipButton 這里基本實現了三種方式,按鈕、text、imgview。其實就是三種控件,我也不太熟悉,但是原理應該一樣的吧。前兩種,有興趣的話自己研究,這個代碼肯定不行,僅供參考

?

#include "ui/UIVideoPlayer.h"// No Available on tvOS #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS && !defined(CC_TARGET_OS_TVOS)using namespace cocos2d::experimental::ui; //------------------------------------------------------------------------------------- #include "platform/ios/CCEAGLView-ios.h" #import <MediaPlayer/MediaPlayer.h> #include "base/CCDirector.h" #include "platform/CCFileUtils.h"@interface UIVideoViewWrapperIos : NSObject@property (strong,nonatomic) MPMoviePlayerController * moviePlayer;- (void) setFrame:(int) left :(int) top :(int) width :(int) height; - (void) setURL:(int) videoSource :(std::string&) videoUrl; - (void) play; - (void) pause; - (void) resume; - (void) stop; - (void) seekTo:(float) sec; - (void) setVisible:(bool) visible; - (void) setKeepRatioEnabled:(bool) enabled; - (void) setFullScreenEnabled:(bool) enabled; - (bool) isFullScreenEnabled; - (void) addSkipButton; - (id) init:(void*) videoPlayer; -(void)handleTap:(UIButton *)sender; -(void) videoFinished:(NSNotification*) notification; -(void) playStateChange;@end@implementation UIVideoViewWrapperIos {int _left;int _top;int _width;int _height;bool _keepRatioEnabled;VideoPlayer* _videoPlayer; }-(id)init:(void*)videoPlayer {if (self = [super init]) {self.moviePlayer = nullptr;_videoPlayer = (VideoPlayer*)videoPlayer;_keepRatioEnabled = false;}return self; }-(void) dealloc {if (self.moviePlayer != nullptr) {[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];[[NSNotificationCenter defaultCenter] removeObserver:self name:@"NSNotificationWillEnterForeground" object:self.moviePlayer];[[NSNotificationCenter defaultCenter] removeObserver:self];[self.moviePlayer stop];[self.moviePlayer.view removeFromSuperview];self.moviePlayer = nullptr;_videoPlayer = nullptr;}[super dealloc]; }-(void) addSkipButton{UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];[button addTarget:self action:@selector(handleTap:) forControlEvents:UIControlEventTouchUpInside];[button setTitle:@"" forState:UIControlStateNormal];std::string path1 = cocos2d::FileUtils::getInstance()->fullPathForFilename("system_btn/sptg_b_001_1.png");std::string path2 = cocos2d::FileUtils::getInstance()->fullPathForFilename("system_btn/sptg_b_001_2.png");[button setBackgroundImage:[UIImage imageWithContentsOfFile:[[NSString alloc] initWithFormat:@"%s",path1.c_str()]] forState:UIControlStateNormal];[button setBackgroundImage:[UIImage imageWithContentsOfFile:[[NSString alloc] initWithFormat:@"%s",path2.c_str()]] forState:UIControlStateHighlighted];CGRect rx = [ UIScreen mainScreen ].bounds;[button setFrame:CGRectMake(rx.size.width-120, -20, 164.0, 68.0)];CGAffineTransform transform = button.transform;transform = CGAffineTransformScale(transform, rx.size.width/1280.0, rx.size.height/720.0);button.transform = transform;[self.moviePlayer.view addSubview:button]; }-(void) handleTap:(UIButton *)sender {if(_videoPlayer != nullptr){[(UIButton *)sender removeFromSuperview];_videoPlayer->onPlayEvent((int)VideoPlayer::EventType::COMPLETED);} }-(void) setFrame:(int)left :(int)top :(int)width :(int)height {_left = left;_width = width;_top = top;_height = height;if (self.moviePlayer != nullptr) {[self.moviePlayer.view setFrame:CGRectMake(left, top, width, height)];} }-(void) setFullScreenEnabled:(bool) enabled {if (self.moviePlayer != nullptr) {[self.moviePlayer setControlStyle:MPMovieControlStyleNone];[self.moviePlayer setFullscreen:enabled animated:(true)];} }-(bool) isFullScreenEnabled {if (self.moviePlayer != nullptr) {return [self.moviePlayer isFullscreen];}return false; }-(void) setURL:(int)videoSource :(std::string &)videoUrl {if (self.moviePlayer != nullptr) {[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];[[NSNotificationCenter defaultCenter] removeObserver:self name:@"NSNotificationWillEnterForeground" object:self.moviePlayer];[self.moviePlayer stop];[self.moviePlayer.view removeFromSuperview];self.moviePlayer = nullptr;}if (videoSource == 1) {self.moviePlayer = [[[MPMoviePlayerController alloc] init] autorelease];self.moviePlayer.movieSourceType = MPMovieSourceTypeStreaming;[self.moviePlayer setContentURL:[NSURL URLWithString:@(videoUrl.c_str())]];} else {self.moviePlayer = [[[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:@(videoUrl.c_str())]] autorelease];self.moviePlayer.movieSourceType = MPMovieSourceTypeFile;}self.moviePlayer.allowsAirPlay = false;self.moviePlayer.controlStyle = MPMovieControlStyleNone;self.moviePlayer.view.userInteractionEnabled = true;auto clearColor = [UIColor clearColor];self.moviePlayer.backgroundView.backgroundColor = clearColor;self.moviePlayer.view.backgroundColor = clearColor;for (UIView * subView in self.moviePlayer.view.subviews) {subView.backgroundColor = clearColor;}if (_keepRatioEnabled) {self.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;} else {self.moviePlayer.scalingMode = MPMovieScalingModeFill;}auto view = cocos2d::Director::getInstance()->getOpenGLView();auto eaglview = (CCEAGLView *) view->getEAGLView();[eaglview addSubview:self.moviePlayer.view];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:self.moviePlayer];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playStateChange) name:MPMoviePlayerPlaybackStateDidChangeNotification object:self.moviePlayer];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoFinished:) name:@"NSNotificationWillEnterForeground" object:nil]; }-(void) videoFinished:(NSNotification *)notification {NSString *name = [notification name];if ([name isEqualToString:@"NSNotificationWillEnterForeground"]) {if (_videoPlayer!= nullptr) {[self resume];}return;}if(_videoPlayer != nullptr){if([self.moviePlayer playbackState] != MPMoviePlaybackStateStopped){_videoPlayer->onPlayEvent((int)VideoPlayer::EventType::COMPLETED);}} }-(void) playStateChange {MPMoviePlaybackState state = [self.moviePlayer playbackState];switch (state) {case MPMoviePlaybackStatePaused:_videoPlayer->onPlayEvent((int)VideoPlayer::EventType::PAUSED);break;case MPMoviePlaybackStateStopped:_videoPlayer->onPlayEvent((int)VideoPlayer::EventType::STOPPED);break;case MPMoviePlaybackStatePlaying:_videoPlayer->onPlayEvent((int)VideoPlayer::EventType::PLAYING);break;case MPMoviePlaybackStateInterrupted:break;case MPMoviePlaybackStateSeekingBackward:break;case MPMoviePlaybackStateSeekingForward:break;default:break;} }-(void) seekTo:(float)sec {if (self.moviePlayer != NULL) {[self.moviePlayer setCurrentPlaybackTime:(sec)];} }-(void) setVisible:(bool)visible {if (self.moviePlayer != NULL) {[self.moviePlayer.view setHidden:!visible];} }-(void) setKeepRatioEnabled:(bool)enabled {_keepRatioEnabled = enabled;if (self.moviePlayer != NULL) {if (enabled) {self.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;} else {self.moviePlayer.scalingMode = MPMovieScalingModeFill;}} }-(void) play {if (self.moviePlayer != NULL) {[self.moviePlayer.view setFrame:CGRectMake(_left, _top, _width, _height)];[self.moviePlayer play];} }-(void) pause {if (self.moviePlayer != NULL) {[self.moviePlayer pause];} }-(void) resume {if (self.moviePlayer != NULL) {if([self.moviePlayer playbackState] == MPMoviePlaybackStatePaused){[self.moviePlayer play];}} }-(void) stop {if (self.moviePlayer != NULL) {[self.moviePlayer stop];} }@end //------------------------------------------------------------------------------------------------------------ VideoPlayer::VideoPlayer() : _videoPlayerIndex(-1) , _eventCallback(nullptr) , _fullScreenEnabled(false) , _fullScreenDirty(false) , _keepAspectRatioEnabled(false) , _isPlaying(false) {_videoView = [[UIVideoViewWrapperIos alloc] init:this];#if CC_VIDEOPLAYER_DEBUG_DRAW_debugDrawNode = DrawNode::create();addChild(_debugDrawNode); #endif }VideoPlayer::~VideoPlayer() {if(_videoView){[((UIVideoViewWrapperIos*)_videoView) dealloc];} }void VideoPlayer::setFileName(const std::string& fileName) {_videoURL = FileUtils::getInstance()->fullPathForFilename(fileName);_videoSource = VideoPlayer::Source::FILENAME;[((UIVideoViewWrapperIos*)_videoView) setURL:(int)_videoSource :_videoURL]; }void VideoPlayer::setURL(const std::string& videoUrl) {_videoURL = videoUrl;_videoSource = VideoPlayer::Source::URL;[((UIVideoViewWrapperIos*)_videoView) setURL:(int)_videoSource :_videoURL]; }void VideoPlayer::draw(Renderer* renderer, const Mat4 &transform, uint32_t flags) {cocos2d::ui::Widget::draw(renderer,transform,flags);if (flags & FLAGS_TRANSFORM_DIRTY){auto directorInstance = Director::getInstance();auto glView = directorInstance->getOpenGLView();auto frameSize = glView->getFrameSize();auto scaleFactor = [static_cast<CCEAGLView *>(glView->getEAGLView()) contentScaleFactor];auto winSize = directorInstance->getWinSize();auto leftBottom = convertToWorldSpace(Vec2::ZERO);auto rightTop = convertToWorldSpace(Vec2(_contentSize.width,_contentSize.height));auto uiLeft = (frameSize.width / 2 + (leftBottom.x - winSize.width / 2 ) * glView->getScaleX()) / scaleFactor;auto uiTop = (frameSize.height /2 - (rightTop.y - winSize.height / 2) * glView->getScaleY()) / scaleFactor;[((UIVideoViewWrapperIos*)_videoView) setFrame :uiLeft :uiTop:ceil((rightTop.x - leftBottom.x) * glView->getScaleX() / scaleFactor):ceil(( (rightTop.y - leftBottom.y) * glView->getScaleY()/scaleFactor))];}#if CC_VIDEOPLAYER_DEBUG_DRAW_debugDrawNode->clear();auto size = getContentSize();Point vertices[4]={Point::ZERO,Point(size.width, 0),Point(size.width, size.height),Point(0, size.height)};_debugDrawNode->drawPoly(vertices, 4, true, Color4F(1.0, 1.0, 1.0, 1.0)); #endif }bool VideoPlayer::isFullScreenEnabled()const {return [((UIVideoViewWrapperIos*)_videoView) isFullScreenEnabled]; }void VideoPlayer::onEnter() {Widget::onEnter();[((UIVideoViewWrapperIos*)_videoView) setVisible:YES]; }void VideoPlayer::onExit() {Widget::onExit();[((UIVideoViewWrapperIos*)_videoView) setVisible:NO]; }void VideoPlayer::setFullScreenEnabled(bool enabled) {[((UIVideoViewWrapperIos*)_videoView) setFullScreenEnabled:enabled]; }void VideoPlayer::setKeepAspectRatioEnabled(bool enable) {if (_keepAspectRatioEnabled != enable){_keepAspectRatioEnabled = enable;[((UIVideoViewWrapperIos*)_videoView) setKeepRatioEnabled:enable];} }void VideoPlayer::play() {if (! _videoURL.empty()){[((UIVideoViewWrapperIos*)_videoView) play];} }void VideoPlayer::pause() {if (! _videoURL.empty()){[((UIVideoViewWrapperIos*)_videoView) pause];} }void VideoPlayer::resume() {if (! _videoURL.empty()){[((UIVideoViewWrapperIos*)_videoView) resume];} }void VideoPlayer::stop() {if (! _videoURL.empty()){[((UIVideoViewWrapperIos*)_videoView) stop];} }void VideoPlayer::addSkipButton(){if (! _videoURL.empty()){[((UIVideoViewWrapperIos*)_videoView) addSkipButton];} }void VideoPlayer::seekTo(float sec) {if (! _videoURL.empty()){[((UIVideoViewWrapperIos*)_videoView) seekTo:sec];} }bool VideoPlayer::isPlaying() const {return _isPlaying; }void VideoPlayer::setVisible(bool visible) {cocos2d::ui::Widget::setVisible(visible);if (! _videoURL.empty()){[((UIVideoViewWrapperIos*)_videoView) setVisible:visible];} }void VideoPlayer::addEventListener(const VideoPlayer::ccVideoPlayerCallback& callback) {_eventCallback = callback; }void VideoPlayer::onPlayEvent(int event) {if (event == (int)VideoPlayer::EventType::PLAYING) {_isPlaying = true;} else {_isPlaying = false;}if (_eventCallback){_eventCallback(this, (VideoPlayer::EventType)event);} }cocos2d::ui::Widget* VideoPlayer::createCloneInstance() {return VideoPlayer::create(); }void VideoPlayer::copySpecialProperties(Widget *widget) {VideoPlayer* videoPlayer = dynamic_cast<VideoPlayer*>(widget);if (videoPlayer){_isPlaying = videoPlayer->_isPlaying;_fullScreenEnabled = videoPlayer->_fullScreenEnabled;_fullScreenDirty = videoPlayer->_fullScreenDirty;_videoURL = videoPlayer->_videoURL;_keepAspectRatioEnabled = videoPlayer->_keepAspectRatioEnabled;_videoSource = videoPlayer->_videoSource;_videoPlayerIndex = videoPlayer->_videoPlayerIndex;_eventCallback = videoPlayer->_eventCallback;_videoView = videoPlayer->_videoView;} }#endif

?

2.2Android

c++代碼

Android比較惡心,坑比較多,會者不難,難著不會,不好意思,我正好不會。。。

UIVideoPlayer-android.cpp

添加一個函數。這個原理知道吧。。。不知道的模仿其他函數把,就是c++調用java代碼。。

void VideoPlayer::addSkipButton() {if (! _videoURL.empty()){JniHelper::callStaticVoidMethod(videoHelperClassName, "addSkipButton", _videoPlayerIndex);} }

?

Java代碼

兩個java文件在 .cocos/platform/android/java/src/org/cocos2dx/lib

這個版本的cocos播放器用的MediaPlayer

1.Cocos2dxVideoHelper.java

/**************************************************************************** Copyright (c) 2014 Chukong Technologies Inc.http://www.cocos2d-x.orgPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.****************************************************************************/package org.cocos2dx.lib;import android.graphics.Rect; import android.os.Handler; import android.os.Message; import android.util.SparseArray; import android.view.View; import android.widget.FrameLayout;import android.view.View.OnClickListener; //import android.widget.Button;import android.util.DisplayMetrics;//todo用按鈕的話,這兩個刪除 import android.widget.ImageView;//todo用按鈕的話,這兩個刪除 import android.graphics.Matrix; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import java.io.IOException;import org.cocos2dx.lib.Cocos2dxVideoView.OnVideoEventListener;import java.lang.ref.WeakReference;public class Cocos2dxVideoHelper {private FrameLayout mLayout = null;private Cocos2dxActivity mActivity = null; private SparseArray<Cocos2dxVideoView> sVideoViews = null;static VideoHandler mVideoHandler = null;//private Button skipBtn = null;private ImageView skipImgBtn = null;private int btnIndex = 0;Cocos2dxVideoHelper(Cocos2dxActivity activity,FrameLayout layout){mActivity = activity;mLayout = layout;mVideoHandler = new VideoHandler(this);sVideoViews = new SparseArray<Cocos2dxVideoView>();}private static int videoTag = 0;private final static int VideoTaskCreate = 0;private final static int VideoTaskRemove = 1;private final static int VideoTaskSetSource = 2;private final static int VideoTaskSetRect = 3;private final static int VideoTaskStart = 4;private final static int VideoTaskPause = 5;private final static int VideoTaskResume = 6;private final static int VideoTaskStop = 7;private final static int VideoTaskSeek = 8;private final static int VideoTaskSetVisible = 9;private final static int VideoTaskRestart = 10;private final static int VideoTaskKeepRatio = 11;private final static int VideoTaskFullScreen = 12;private final static int VideoAddSkipBtn = 13;final static int KeyEventBack = 1000;static class VideoHandler extends Handler{WeakReference<Cocos2dxVideoHelper> mReference;VideoHandler(Cocos2dxVideoHelper helper){mReference = new WeakReference<Cocos2dxVideoHelper>(helper);}@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case VideoTaskCreate: {Cocos2dxVideoHelper helper = mReference.get();helper._createVideoView(msg.arg1);break;}case VideoTaskRemove: {Cocos2dxVideoHelper helper = mReference.get();helper._removeVideoView(msg.arg1);break;}case VideoTaskSetSource: {Cocos2dxVideoHelper helper = mReference.get();helper._setVideoURL(msg.arg1, msg.arg2, (String)msg.obj);break;}case VideoTaskStart: {Cocos2dxVideoHelper helper = mReference.get();helper._startVideo(msg.arg1);break;}case VideoTaskSetRect: {Cocos2dxVideoHelper helper = mReference.get();Rect rect = (Rect)msg.obj;helper._setVideoRect(msg.arg1, rect.left, rect.top, rect.right, rect.bottom);break;}case VideoTaskFullScreen:{Cocos2dxVideoHelper helper = mReference.get();Rect rect = (Rect)msg.obj;if (msg.arg2 == 1) {helper._setFullScreenEnabled(msg.arg1, true, rect.right, rect.bottom);} else {helper._setFullScreenEnabled(msg.arg1, false, rect.right, rect.bottom);}break;}case VideoTaskPause: {Cocos2dxVideoHelper helper = mReference.get();helper._pauseVideo(msg.arg1);break;}case VideoTaskResume: {Cocos2dxVideoHelper helper = mReference.get();helper._resumeVideo(msg.arg1);break;}case VideoTaskStop: {Cocos2dxVideoHelper helper = mReference.get();helper._stopVideo(msg.arg1);break;}case VideoTaskSeek: {Cocos2dxVideoHelper helper = mReference.get();helper._seekVideoTo(msg.arg1, msg.arg2);break;}case VideoTaskSetVisible: {Cocos2dxVideoHelper helper = mReference.get();if (msg.arg2 == 1) {helper._setVideoVisible(msg.arg1, true);} else {helper._setVideoVisible(msg.arg1, false);}break;}case VideoTaskRestart: {Cocos2dxVideoHelper helper = mReference.get();helper._restartVideo(msg.arg1);break;}case VideoTaskKeepRatio: {Cocos2dxVideoHelper helper = mReference.get();if (msg.arg2 == 1) {helper._setVideoKeepRatio(msg.arg1, true);} else {helper._setVideoKeepRatio(msg.arg1, false);}break;}case KeyEventBack: {Cocos2dxVideoHelper helper = mReference.get();helper.onBackKeyEvent();break;}case VideoAddSkipBtn: {Cocos2dxVideoHelper helper = mReference.get();helper._addSkipButton(msg.arg1);break;}default:break;}super.handleMessage(msg);}}private class VideoEventRunnable implements Runnable{private int mVideoTag;private int mVideoEvent;public VideoEventRunnable(int tag,int event) {mVideoTag = tag;mVideoEvent = event;}@Overridepublic void run() {nativeExecuteVideoCallback(mVideoTag, mVideoEvent);}}public static native void nativeExecuteVideoCallback(int index,int event);OnVideoEventListener videoEventListener = new OnVideoEventListener() {@Overridepublic void onVideoEvent(int tag,int event) {mActivity.runOnGLThread(new VideoEventRunnable(tag, event));}};public static int createVideoWidget() {Message msg = new Message();msg.what = VideoTaskCreate;msg.arg1 = videoTag;mVideoHandler.sendMessage(msg);return videoTag++;}private void _createVideoView(int index) {Cocos2dxVideoView videoView = new Cocos2dxVideoView(mActivity,index);sVideoViews.put(index, videoView);FrameLayout.LayoutParams lParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT);mLayout.addView(videoView, lParams);videoView.setZOrderOnTop(true);videoView.setZOrderMediaOverlay(true);videoView.setOnCompletionListener(videoEventListener);}public static void removeVideoWidget(int index){Message msg = new Message();msg.what = VideoTaskRemove;msg.arg1 = index;mVideoHandler.sendMessage(msg);}private void _removeVideoView(int index) {Cocos2dxVideoView view = sVideoViews.get(index);if (view != null) {view.stopPlayback();sVideoViews.remove(index);mLayout.removeView(view);}}public static void setVideoUrl(int index, int videoSource, String videoUrl) {Message msg = new Message();msg.what = VideoTaskSetSource;msg.arg1 = index;msg.arg2 = videoSource;msg.obj = videoUrl;mVideoHandler.sendMessage(msg);}private void _setVideoURL(int index, int videoSource, String videoUrl) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {switch (videoSource) {case 0:videoView.setVideoFileName(videoUrl);break;case 1:videoView.setVideoURL(videoUrl);break;default:break;}}}public static void setVideoRect(int index, int left, int top, int maxWidth, int maxHeight) {Message msg = new Message();msg.what = VideoTaskSetRect;msg.arg1 = index;msg.obj = new Rect(left, top, maxWidth, maxHeight);mVideoHandler.sendMessage(msg);}private void _setVideoRect(int index, int left, int top, int maxWidth, int maxHeight) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {videoView.setVideoRect(left,top,maxWidth,maxHeight);}}public static void setFullScreenEnabled(int index, boolean enabled, int width, int height) {Message msg = new Message();msg.what = VideoTaskFullScreen;msg.arg1 = index;if (enabled) {msg.arg2 = 1;} else {msg.arg2 = 0;}msg.obj = new Rect(0, 0, width, height);mVideoHandler.sendMessage(msg);}private void _setFullScreenEnabled(int index, boolean enabled, int width,int height) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {videoView.setFullScreenEnabled(enabled, width, height);}}private void onBackKeyEvent() {int viewCount = sVideoViews.size();for (int i = 0; i < viewCount; i++) {int key = sVideoViews.keyAt(i);Cocos2dxVideoView videoView = sVideoViews.get(key);if (videoView != null) {videoView.setFullScreenEnabled(false, 0, 0);mActivity.runOnGLThread(new VideoEventRunnable(key, KeyEventBack));}}}public static void startVideo(int index) {Message msg = new Message();msg.what = VideoTaskStart;msg.arg1 = index;mVideoHandler.sendMessage(msg);}private void _startVideo(int index) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {videoView.start();}}public static void pauseVideo(int index) {Message msg = new Message();msg.what = VideoTaskPause;msg.arg1 = index;mVideoHandler.sendMessage(msg);}private void _pauseVideo(int index) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {videoView.pause();}}public static void resumeVideo(int index) {Message msg = new Message();msg.what = VideoTaskResume;msg.arg1 = index;mVideoHandler.sendMessage(msg);}private void _resumeVideo(int index) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {videoView.resume();}}public static void stopVideo(int index) {Message msg = new Message();msg.what = VideoTaskStop;msg.arg1 = index;mVideoHandler.sendMessage(msg);}private void _stopVideo(int index) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {videoView.stop();}//刪除跳過按鈕 removeSkipBtn();}public static void restartVideo(int index) {Message msg = new Message();msg.what = VideoTaskRestart;msg.arg1 = index;mVideoHandler.sendMessage(msg);}private void _restartVideo(int index) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {videoView.restart();}}public static void seekVideoTo(int index,int msec) {Message msg = new Message();msg.what = VideoTaskSeek;msg.arg1 = index;msg.arg2 = msec;mVideoHandler.sendMessage(msg);}private void _seekVideoTo(int index,int msec) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {videoView.seekTo(msec);}}public static void setVideoVisible(int index, boolean visible) {Message msg = new Message();msg.what = VideoTaskSetVisible;msg.arg1 = index;if (visible) {msg.arg2 = 1;} else {msg.arg2 = 0;}mVideoHandler.sendMessage(msg);}private void _setVideoVisible(int index, boolean visible) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {if (visible) {videoView.fixSize();videoView.setVisibility(View.VISIBLE);} else {videoView.setVisibility(View.INVISIBLE);}}}public static void setVideoKeepRatioEnabled(int index, boolean enable) {Message msg = new Message();msg.what = VideoTaskKeepRatio;msg.arg1 = index;if (enable) {msg.arg2 = 1;} else {msg.arg2 = 0;}mVideoHandler.sendMessage(msg);}private void _setVideoKeepRatio(int index, boolean enable) {Cocos2dxVideoView videoView = sVideoViews.get(index);if (videoView != null) {videoView.setKeepRatio(enable);}}public static void addSkipButton(int index) {Message msg = new Message();msg.what = VideoAddSkipBtn;msg.arg1 = index;mVideoHandler.sendMessage(msg);}//添加按鈕第一種方式 // private void _addSkipButton(int index) {// skipBtn = new Button(mActivity);// skipBtn.setText("");// skipBtn.setX();// x / 1920 *屏幕寬度 y / 1080 *屏幕高度 // skipBtn.setY(0);// skipBtn.setWidth(10);// skipBtn.setHeight(10);// Cocos2dxVideoView view = sVideoViews.get(index);// view.skipBtn = skipBtn;// btnIndex = index;//sptg_b_001_1 這個圖片放到 proj.android/res/drawable-xhdpi// int imgId=mActivity.getResources().getIdentifier("sptg_b_001_1", "drawable", mActivity.getPackageName());// //skipBtn.setBackgroundDrawable(mActivity.getResources().getDrawable(imgId));// skipBtn.setBackground(mActivity.getResources().getDrawable(imgId));// mLayout.addView(skipBtn,0);// skipBtn.bringToFront();// skipBtn.invalidate();// skipBtn.setOnClickListener(new OnClickListener() {// @Override// public void onClick(View v) {// // TODO Auto-generated method stub// mLayout.removeView(skipBtn);// skipBtn = null;// //todo 這個地方處理的不行。要刪除視頻// Cocos2dxVideoView view = sVideoViews.get(btnIndex);// if(view!= null){// view.stop();// }// }// });// }//添加按鈕第二種方式// private void _addSkipButton(int index) {// TextView skipButton = new TextView(mActivity);// skipButton.setText("跳過 >>");// skipButton.setTextColor(Color.argb(180, 255, 255, 255));// skipButton.setTextSize(20);// FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(// skipButton.getWidth(), skipButton.getHeight());// params.leftMargin = 20;// params.topMargin =10;// skipButton.setLayoutParams(params);// // Cocos2dxVideoView view = sVideoViews.get(index);// // view.skipBtn = skipBtn;// int imgId=mActivity.getResources().getIdentifier("sptg_b_001_1", "drawable", mActivity.getPackageName());// skipButton.setBackgroundDrawable(mActivity.getResources().getDrawable(imgId));// mLayout.addView(skipButton,0);// skipButton.bringToFront();// skipButton.invalidate();// skipButton.setOnClickListener(new OnClickListener() {// @Override// public void onClick(View v) {// // TODO Auto-generated method stub// // mLayout.removeView(skipButton);// //skipButton = null;// //stopVideo(index);// }// });// }//第三種方式private void _addSkipButton(int index) {skipImgBtn = new ImageView(mActivity);//定義矩陣對象Matrix matrix = new Matrix();//縮放原圖matrix.postScale(1.5f, 1.5f);float w = 0;float h = 0;Bitmap bitmap;Bitmap dstbmp;try{bitmap = BitmapFactory.decodeStream(mActivity.getAssets().open("res/system_btn/sptg_b_001_1.png"));dstbmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(), bitmap.getHeight(),matrix,true);skipImgBtn.setImageBitmap(dstbmp);w = dstbmp.getWidth();h = dstbmp.getHeight();}catch(IOException e){//todo e.printStackTrace();}//獲取屏幕尺寸幾種方式// 參考文檔 http://blog.csdn.net/ithomer/article/details/6688883DisplayMetrics dm = new DisplayMetrics();mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm);FrameLayout.LayoutParams params = new FrameLayout.LayoutParams((int)w, (int)h);//float density = dm.density;// int screenWidth = (int)(dm.widthPixels * density + 0.5f);// params.leftMargin = (int) (screenWidth-w-20);params.leftMargin = (int) (mActivity.getWindowManager().getDefaultDisplay().getWidth()-w-20);params.topMargin =10;Cocos2dxVideoView view = sVideoViews.get(index);view.skipImgBtn = skipImgBtn;btnIndex = index;skipImgBtn.bringToFront();mLayout.addView(skipImgBtn,params);skipImgBtn.invalidate();skipImgBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {mLayout.removeView(skipImgBtn);skipImgBtn = null;//todo 這個地方處理的不行。要刪除視頻Cocos2dxVideoView view = sVideoViews.get(btnIndex);if(view!= null){//c處理視頻跳過或者完成。因為c++代碼里面處理的是COMPLETED 所以直接調用COMPLETED的吧 view.mComplete();}}});}public void removeSkipBtn(){if (skipImgBtn!= null){mLayout.removeView(skipImgBtn);skipImgBtn = null;}} }

其實這樣就可以正常顯示按鈕了。如果不能正常顯示的話,需要繼續在Cocos2dxVideoView.java 加一個簡單的處理。有點亂,以后再整理吧,本次只傳源碼

?

/** Copyright (C) 2006 The Android Open Source Project* Copyright (c) 2014 Chukong Technologies Inc.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at** http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package org.cocos2dx.lib;import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnErrorListener; import android.net.Uri; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.FrameLayout; import android.widget.MediaController.MediaPlayerControl;//import android.widget.Button; import android.widget.ImageView;//todo用按鈕的話,這兩個刪除import java.io.IOException; import java.util.Map;public class Cocos2dxVideoView extends SurfaceView implements MediaPlayerControl {private String TAG = "Cocos2dxVideoView";private Uri mVideoUri; private int mDuration;// all possible internal statesprivate static final int STATE_ERROR = -1;private static final int STATE_IDLE = 0;private static final int STATE_PREPARING = 1;private static final int STATE_PREPARED = 2;private static final int STATE_PLAYING = 3;private static final int STATE_PAUSED = 4;private static final int STATE_PLAYBACK_COMPLETED = 5;/*** mCurrentState is a VideoView object's current state.* mTargetState is the state that a method caller intends to reach.* For instance, regardless the VideoView object's current state,* calling pause() intends to bring the object to a target state* of STATE_PAUSED.*/private int mCurrentState = STATE_IDLE;private int mTargetState = STATE_IDLE;private boolean isComplete = false;// All the stuff we need for playing and showing a videoprivate SurfaceHolder mSurfaceHolder = null;private MediaPlayer mMediaPlayer = null;private int mVideoWidth = 0;private int mVideoHeight = 0;private OnVideoEventListener mOnVideoEventListener;private MediaPlayer.OnPreparedListener mOnPreparedListener;private int mCurrentBufferPercentage;private OnErrorListener mOnErrorListener;// recording the seek position while preparingprivate int mSeekWhenPrepared; protected Cocos2dxActivity mCocos2dxActivity = null;protected int mViewLeft = 0;protected int mViewTop = 0;protected int mViewWidth = 0;protected int mViewHeight = 0;protected int mVisibleLeft = 0;protected int mVisibleTop = 0;protected int mVisibleWidth = 0;protected int mVisibleHeight = 0;protected boolean mFullScreenEnabled = false;protected int mFullScreenWidth = 0;protected int mFullScreenHeight = 0;private int mViewTag = 0;// public Button skipBtn = null;public ImageView skipImgBtn = null;public Cocos2dxVideoView(Cocos2dxActivity activity,int tag) {super(activity);mViewTag = tag;mCocos2dxActivity = activity;initVideoView();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (mVideoWidth == 0 || mVideoHeight == 0) {mViewWidth = mVisibleWidth;mViewHeight = mVisibleHeight;setMeasuredDimension(mViewWidth, mViewHeight);Log.i(TAG, ""+mViewWidth+ ":" +mViewHeight);}else {setMeasuredDimension(mVisibleWidth, mVisibleHeight);Log.i(TAG, ""+mVisibleWidth+ ":" +mVisibleHeight);} //328號添加// if (skipBtn != null){// skipBtn.invalidate();// }//跳過按鈕 這個加不加要看在添加視頻之前添加還是添加視頻之后再添加,這里加不加都行//請求重新draw(),但只會繪制調用者本身。if (skipImgBtn != null){skipImgBtn.invalidate();}}public void setVideoRect(int left, int top, int maxWidth, int maxHeight) {mViewLeft = left;mViewTop = top;mViewWidth = maxWidth;mViewHeight = maxHeight;fixSize(mViewLeft, mViewTop, mViewWidth, mViewHeight);}public void setFullScreenEnabled(boolean enabled, int width, int height) {if (mFullScreenEnabled != enabled) {mFullScreenEnabled = enabled;if (width != 0 && height != 0) {mFullScreenWidth = width;mFullScreenHeight = height;}fixSize();}}public int resolveAdjustedSize(int desiredSize, int measureSpec) {int result = desiredSize;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);switch (specMode) {case MeasureSpec.UNSPECIFIED:/* Parent says we can be as big as we want. Just don't be larger* than max size imposed on ourselves.*/result = desiredSize;break;case MeasureSpec.AT_MOST:/* Parent says we can be as big as we want, up to specSize.* Don't be larger than specSize, and don't be larger than* the max size imposed on ourselves.*/result = Math.min(desiredSize, specSize);break;case MeasureSpec.EXACTLY:// No choice. Do what we are told.result = specSize;break;}return result;}private boolean mNeedResume = false;@Overridepublic void setVisibility(int visibility) {if (visibility == INVISIBLE) {mNeedResume = isPlaying();if (mNeedResume) {mSeekWhenPrepared = getCurrentPosition();}}else if (mNeedResume){start();mNeedResume = false;}super.setVisibility(visibility);}private void initVideoView() {mVideoWidth = 0;mVideoHeight = 0;getHolder().addCallback(mSHCallback);//Fix issue#11516:Can't play video on Android 2.3.x getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);setFocusable(true);setFocusableInTouchMode(true);mCurrentState = STATE_IDLE;mTargetState = STATE_IDLE;}@Overridepublic boolean onTouchEvent(MotionEvent event) {if((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP){if (isPlaying()) {pause();resume();} else if(mCurrentState == STATE_PAUSED){resume();}}return true;}private boolean mIsAssetRouse = false;private String mVideoFilePath = null;private static final String AssetResourceRoot = "assets/";public void setVideoFileName(String path) {if (path.startsWith(AssetResourceRoot)) {path = path.substring(AssetResourceRoot.length());}if (path.startsWith("/")) {mIsAssetRouse = false;setVideoURI(Uri.parse(path),null);}else {mVideoFilePath = path;mIsAssetRouse = true;setVideoURI(Uri.parse(path),null);}}public void setVideoURL(String url) {mIsAssetRouse = false;setVideoURI(Uri.parse(url), null);}/*** @hide*/private void setVideoURI(Uri uri, Map<String, String> headers) {mVideoUri = uri;mSeekWhenPrepared = 0;mVideoWidth = 0;mVideoHeight = 0;openVideo();requestLayout();invalidate();}public void stopPlayback() {if (mMediaPlayer != null) {mMediaPlayer.stop();mMediaPlayer.release();mMediaPlayer = null;mCurrentState = STATE_IDLE;mTargetState = STATE_IDLE;}}private void openVideo() {if (mSurfaceHolder == null) {// not ready for playback just yet, will try again laterreturn;}if (mIsAssetRouse) {if(mVideoFilePath == null)return;} else if(mVideoUri == null) {return;}// Tell the music playback service to pause// TODO: these constants need to be published somewhere in the framework.Intent i = new Intent("com.android.music.musicservicecommand");i.putExtra("command", "pause");mCocos2dxActivity.sendBroadcast(i);// we shouldn't clear the target state, because somebody might have// called start() previouslyrelease(false);try {//if (mMediaPlayer == null) {mMediaPlayer = new MediaPlayer();mMediaPlayer.setOnPreparedListener(mPreparedListener);mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener); mMediaPlayer.setOnCompletionListener(mCompletionListener);mMediaPlayer.setOnErrorListener(mErrorListener);mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);mMediaPlayer.setDisplay(mSurfaceHolder);mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);mMediaPlayer.setScreenOnWhilePlaying(true);//} mDuration = -1;mCurrentBufferPercentage = 0;if (mIsAssetRouse) {AssetFileDescriptor afd = mCocos2dxActivity.getAssets().openFd(mVideoFilePath);mMediaPlayer.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());} else {mMediaPlayer.setDataSource(mCocos2dxActivity, mVideoUri);}mMediaPlayer.prepareAsync();/*** Don't set the target state here either, but preserve the target state that was there before.*/mCurrentState = STATE_PREPARING;} catch (IOException ex) {Log.w(TAG, "Unable to open content: " + mVideoUri, ex);mCurrentState = STATE_ERROR;mTargetState = STATE_ERROR;mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);return;} catch (IllegalArgumentException ex) {Log.w(TAG, "Unable to open content: " + mVideoUri, ex);mCurrentState = STATE_ERROR;mTargetState = STATE_ERROR;mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);return;}}private boolean mKeepRatio = false;public void setKeepRatio(boolean enabled) {mKeepRatio = enabled;fixSize();}public void fixSize() {if (mFullScreenEnabled) {fixSize(0, 0, mFullScreenWidth, mFullScreenHeight);} else {fixSize(mViewLeft, mViewTop, mViewWidth, mViewHeight);}}public void fixSize(int left, int top, int width, int height) {if (mVideoWidth == 0 || mVideoHeight == 0) {mVisibleLeft = left;mVisibleTop = top;mVisibleWidth = width;mVisibleHeight = height;}else if (width != 0 && height != 0) {if (mKeepRatio) {if ( mVideoWidth * height > width * mVideoHeight ) {mVisibleWidth = width;mVisibleHeight = width * mVideoHeight / mVideoWidth;} else if ( mVideoWidth * height < width * mVideoHeight ) {mVisibleWidth = height * mVideoWidth / mVideoHeight;mVisibleHeight = height;}mVisibleLeft = left + (width - mVisibleWidth) / 2;mVisibleTop = top + (height - mVisibleHeight) / 2;} else {mVisibleLeft = left;mVisibleTop = top;mVisibleWidth = width;mVisibleHeight = height;}}else {mVisibleLeft = left;mVisibleTop = top;mVisibleWidth = mVideoWidth;mVisibleHeight = mVideoHeight;}getHolder().setFixedSize(mVisibleWidth, mVisibleHeight);FrameLayout.LayoutParams lParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT);lParams.leftMargin = mVisibleLeft;lParams.topMargin = mVisibleTop;lParams.gravity = Gravity.TOP | Gravity.LEFT;setLayoutParams(lParams);}protected MediaPlayer.OnVideoSizeChangedListener mSizeChangedListener =new MediaPlayer.OnVideoSizeChangedListener() {public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {mVideoWidth = mp.getVideoWidth();mVideoHeight = mp.getVideoHeight();if (mVideoWidth != 0 && mVideoHeight != 0) {getHolder().setFixedSize(mVideoWidth, mVideoHeight);}}};MediaPlayer.OnPreparedListener mPreparedListener = new MediaPlayer.OnPreparedListener() {public void onPrepared(MediaPlayer mp) {mCurrentState = STATE_PREPARED;if (mOnPreparedListener != null) {mOnPreparedListener.onPrepared(mMediaPlayer);}mVideoWidth = mp.getVideoWidth();mVideoHeight = mp.getVideoHeight();// mSeekWhenPrepared may be changed after seekTo() callint seekToPosition = mSeekWhenPrepared; if (seekToPosition != 0) {seekTo(seekToPosition);}if (mVideoWidth != 0 && mVideoHeight != 0) {fixSize();} if (mTargetState == STATE_PLAYING) {start();}}};private MediaPlayer.OnCompletionListener mCompletionListener =new MediaPlayer.OnCompletionListener() {public void onCompletion(MediaPlayer mp) {mCurrentState = STATE_PLAYBACK_COMPLETED;mTargetState = STATE_PLAYBACK_COMPLETED;release(true);if (mOnVideoEventListener != null) {mOnVideoEventListener.onVideoEvent(mViewTag,EVENT_COMPLETED);}}};private static final int EVENT_PLAYING = 0;private static final int EVENT_PAUSED = 1;private static final int EVENT_STOPPED = 2;private static final int EVENT_COMPLETED = 3;public interface OnVideoEventListener{void onVideoEvent(int tag,int event);}private MediaPlayer.OnErrorListener mErrorListener =new MediaPlayer.OnErrorListener() {public boolean onError(MediaPlayer mp, int framework_err, int impl_err) {Log.d(TAG, "Error: " + framework_err + "," + impl_err);mCurrentState = STATE_ERROR;mTargetState = STATE_ERROR;/* If an error handler has been supplied, use it and finish. */if (mOnErrorListener != null) {if (mOnErrorListener.onError(mMediaPlayer, framework_err, impl_err)) {return true;}}/* Otherwise, pop up an error dialog so the user knows that* something bad has happened. Only try and pop up the dialog* if we're attached to a window. When we're going away and no* longer have a window, don't bother showing the user an error.*/if (getWindowToken() != null) {Resources r = mCocos2dxActivity.getResources();int messageId;if (framework_err == MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK) {// messageId = com.android.internal.R.string.VideoView_error_text_invalid_progressive_playback;messageId = r.getIdentifier("VideoView_error_text_invalid_progressive_playback", "string", "android");} else {// messageId = com.android.internal.R.string.VideoView_error_text_unknown;messageId = r.getIdentifier("VideoView_error_text_unknown", "string", "android");}int titleId = r.getIdentifier("VideoView_error_title", "string", "android");int buttonStringId = r.getIdentifier("VideoView_error_button", "string", "android");new AlertDialog.Builder(mCocos2dxActivity).setTitle(r.getString(titleId)).setMessage(messageId).setPositiveButton(r.getString(buttonStringId),new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton) {/* If we get here, there is no onError listener, so* at least inform them that the video is over.*/if (mOnVideoEventListener != null) {mOnVideoEventListener.onVideoEvent(mViewTag,EVENT_COMPLETED);}}}).setCancelable(false).show();}return true;}};private MediaPlayer.OnBufferingUpdateListener mBufferingUpdateListener =new MediaPlayer.OnBufferingUpdateListener() {public void onBufferingUpdate(MediaPlayer mp, int percent) {mCurrentBufferPercentage = percent;}};/*** Register a callback to be invoked when the media file* is loaded and ready to go.** @param l The callback that will be run*/public void setOnPreparedListener(MediaPlayer.OnPreparedListener l){mOnPreparedListener = l;}/*** Register a callback to be invoked when the end of a media file* has been reached during play back.** @param l The callback that will be run*/public void setOnCompletionListener(OnVideoEventListener l){mOnVideoEventListener = l;}/*** Register a callback to be invoked when an error occurs* during play back or setup. If no listener is specified,* or if the listener returned false, VideoView will inform* the user of any errors.** @param l The callback that will be run*/public void setOnErrorListener(OnErrorListener l){mOnErrorListener = l;}SurfaceHolder.Callback mSHCallback = new SurfaceHolder.Callback(){public void surfaceChanged(SurfaceHolder holder, int format,int w, int h){boolean isValidState = (mTargetState == STATE_PLAYING)|| !isComplete;boolean hasValidSize = (mVideoWidth == w && mVideoHeight == h);if (mMediaPlayer != null && isValidState && hasValidSize) {if (mSeekWhenPrepared != 0) {seekTo(mSeekWhenPrepared);}start();}}public void surfaceCreated(SurfaceHolder holder){mSurfaceHolder = holder;openVideo();}public void surfaceDestroyed(SurfaceHolder holder){// after we return from this we can't use the surface any moremSurfaceHolder = null;if(mCurrentState == STATE_PLAYING) { isComplete = mMediaPlayer.getCurrentPosition() == mMediaPlayer.getDuration(); mSeekWhenPrepared = mMediaPlayer.getCurrentPosition(); }release(true);}};/** release the media player in any state*/private void release(boolean cleartargetstate) {if (mMediaPlayer != null) {mMediaPlayer.reset();mMediaPlayer.release();mMediaPlayer = null;mCurrentState = STATE_IDLE;if (cleartargetstate) {mTargetState = STATE_IDLE;}}}public void start() {if (isInPlaybackState()) {mMediaPlayer.start();mCurrentState = STATE_PLAYING;if (mOnVideoEventListener != null) {mOnVideoEventListener.onVideoEvent(mViewTag, EVENT_PLAYING);}}mTargetState = STATE_PLAYING;}public void pause() {if (isInPlaybackState()) {if (mMediaPlayer.isPlaying()) {mMediaPlayer.pause();mCurrentState = STATE_PAUSED;if (mOnVideoEventListener != null) {mOnVideoEventListener.onVideoEvent(mViewTag, EVENT_PAUSED);}}}mTargetState = STATE_PAUSED;}public void stop() {if (isInPlaybackState()) {if (mMediaPlayer.isPlaying()) {stopPlayback();if (mOnVideoEventListener != null) {mOnVideoEventListener.onVideoEvent(mViewTag, EVENT_STOPPED);}}}}public void suspend() {release(false);}public void resume() {if (isInPlaybackState()) {if (mCurrentState == STATE_PAUSED) {mMediaPlayer.start();mCurrentState = STATE_PLAYING;if (mOnVideoEventListener != null) {mOnVideoEventListener.onVideoEvent(mViewTag, EVENT_PLAYING);}}}}//新添加完成函數public void mComplete() {if (isInPlaybackState()) {if (mMediaPlayer.isPlaying()) {// mMediaPlayer.stop();mCurrentState = EVENT_COMPLETED;if (mOnVideoEventListener != null) {mOnVideoEventListener.onVideoEvent(mViewTag, EVENT_COMPLETED);}}}mTargetState = EVENT_COMPLETED;}public void restart() {if (isInPlaybackState()) {mMediaPlayer.seekTo(0);mMediaPlayer.start();mCurrentState = STATE_PLAYING;mTargetState = STATE_PLAYING;}}// cache duration as mDuration for faster accesspublic int getDuration() {if (isInPlaybackState()) {if (mDuration > 0) {return mDuration;}mDuration = mMediaPlayer.getDuration();return mDuration;}mDuration = -1;return mDuration;}public int getCurrentPosition() {if (isInPlaybackState()) {return mMediaPlayer.getCurrentPosition();}return 0;}public void seekTo(int msec) {if (isInPlaybackState()) {mMediaPlayer.seekTo(msec);mSeekWhenPrepared = 0;} else {mSeekWhenPrepared = msec;}}public boolean isPlaying() {return isInPlaybackState() && mMediaPlayer.isPlaying();}public int getBufferPercentage() {if (mMediaPlayer != null) {return mCurrentBufferPercentage;}return 0;}public boolean isInPlaybackState() {return (mMediaPlayer != null &&mCurrentState != STATE_ERROR &&mCurrentState != STATE_IDLE &&mCurrentState != STATE_PREPARING);}@Overridepublic boolean canPause() {return true;}@Overridepublic boolean canSeekBackward() {return true;}@Overridepublic boolean canSeekForward() {return true;}public int getAudioSessionId () {return mMediaPlayer.getAudioSessionId();} }

?

?后續bug:跳過按鈕的資源不能使用加密圖片,會導致閃退,額額額。

?

忙去了,代碼先這樣,有問題聯系我。QQ776274781 ,各位大神一起交流,哈哈,busy.

轉載于:https://www.cnblogs.com/zhangfeitao/p/6647243.html

總結

以上是生活随笔為你收集整理的Cocos2dx 3.11版本 视频添加跳过按钮的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日日爱av | 精品国模一区二区 | 国产精品午夜在线观看 | 九九亚洲视频 | 久久久国产网站 | 在线观看亚洲免费视频 | 国产精品扒开做爽爽的视频 | 成人性生活大片 | 97视频亚洲 | 久久久久99999 | 天天躁天天狠天天透 | 欧美日韩国产精品一区 | av免费在线网站 | 中文字幕av影院 | 日韩欧美视频免费观看 | 色婷婷久久一区二区 | 欧美精品一区二区免费 | 国产精品va最新国产精品视频 | 午夜a区 | 欧美日韩性 | 黄色电影小说 | 麻豆成人小视频 | 国产一二区免费视频 | 亚洲欧美视频在线 | 久久久www | 国产在线美女 | 在线精品视频免费播放 | 国产精品久久嫩一区二区免费 | 免费一级片在线 | 精品久久久免费视频 | 黄色精品久久久 | 天天色草| 狠狠色丁香婷婷综合基地 | 日本激情动作片免费看 | 欧美 亚洲 另类 激情 另类 | 在线电影 你懂得 | 天天操夜夜逼 | 色噜噜狠狠色综合中国 | 成年人看片网站 | 婷婷精品在线 | 亚洲 欧美 成人 | 国产免费人成xvideos视频 | 五月天婷婷丁香花 | 99re视频在线观看 | 少妇超碰在线 | 国产精品九九久久99视频 | 69国产精品成人在线播放 | 久久成人福利 | 亚洲精品在线二区 | 天天干,夜夜操 | 精品久久福利 | 91最新网址在线观看 | 免费高清国产 | 久久久久久久久久影视 | 天天搞天天干天天色 | 成人av.com | 99精品一级欧美片免费播放 | 欧美国产日韩一区二区三区 | 色综合久久五月天 | 午夜av激情| 日日精品 | 日韩精品高清视频 | 久草在线视频免费资源观看 | 欧美经典久久 | 伊人黄| avhd高清在线谜片 | 美女在线免费视频 | 久久九九影视网 | 国产99在线| 久久不射电影院 | 国产高清视频在线播放 | 久久情爱 | 国内丰满少妇猛烈精品播放 | 免费三级黄| 国产精品va在线播放 | 久久久精品免费看 | 国产在线探花 | 免费涩涩网站 | 五月婷婷视频在线 | 99在线精品免费视频九九视 | 在线免费高清一区二区三区 | 最新国产精品亚洲 | 不卡av电影在线观看 | 91x色| 久久精品久久久久电影 | 久久免视频| 亚洲女同videos | 91九色视频在线观看 | 精品国产午夜 | 91在线播 | 成人性生交大片免费观看网站 | 国产精品久久久久久久久久久免费 | 久久久久久久久免费视频 | 久久精品久久久久久久 | 欧美日韩国产在线观看 | 亚洲精品免费在线播放 | 国产高清在线 | 日韩av免费大片 | 久久国产精品色婷婷 | 天天色.com | 久久久久久久国产精品影院 | 草免费视频 | av在线8| 久久综合久久综合久久 | 国产色婷婷在线 | 国产精品人人做人人爽人人添 | 欧美日韩高清在线一区 | 日批视频在线观看免费 | 黄色软件在线观看免费 | 精品视频网站 | 成年人在线观看 | 久久久九色精品国产一区二区三区 | 色多多视频在线 | 天天干.com| 最近中文字幕免费大全 | 91麻豆精品国产91久久久使用方法 | 五月婷在线观看 | 日韩在线观看你懂的 | 亚洲综合色丁香婷婷六月图片 | 夜夜操网站| 国产精品久久久久久吹潮天美传媒 | 91视频这里只有精品 | 狠狠躁天天躁综合网 | www.国产视频 | 成人精品视频久久久久 | 五月婷婷久 | 人人精久 | 98涩涩国产露脸精品国产网 | 国产一区免费在线观看 | 日韩精品中文字幕在线 | 久久免费看a级毛毛片 | 午夜精品一区二区三区视频免费看 | 久草精品电影 | 99精品国产成人一区二区 | 国产不卡免费 | 久久高清毛片 | 久草视频在线看 | 三级黄色网络 | 91尤物国产尤物福利在线播放 | 精品久久国产精品 | 国产精品久久久久一区二区三区共 | 欧美精品视 | 99久久精品国产一区二区三区 | 天堂网中文在线 | 精品国产伦一区二区三区观看方式 | free,性欧美 九九交易行官网 | 激情图片qvod| 五月婷婷视频在线 | 欧美综合在线视频 | 亚洲爱视频 | 亚洲精品玖玖玖av在线看 | 国产精品久久久区三区天天噜 | 奇米影视在线99精品 | 欧美天天综合网 | 欧美一级免费片 | 91亚洲精品国偷拍自产在线观看 | 成人一级在线观看 | 麻豆国产精品视频 | 婷婷av在线| 国产一区观看 | 天天弄天天干 | 欧美一级性生活视频 | 国产精品 亚洲精品 | 91精品夜夜 | 成年人在线 | 国内精品久久久久国产 | 国产理论一区二区三区 | 国产成人一二三 | 日韩免费网站 | 中文字幕在线观看一区二区三区 | 欧美日韩国产一二三区 | 日韩大片在线看 | 亚洲1区 在线 | 国产麻豆精品久久一二三 | 久久久久久久精 | 国产亚洲91 | 99热精品在线 | 成 人 免费 黄 色 视频 | 天天射网站 | www.五月婷 | 久久亚洲欧美日韩精品专区 | 久久成人亚洲欧美电影 | 2021国产精品 | 日日草夜夜操 | 一区二区 久久 | 国产精品美女视频 | 日韩中文字幕免费电影 | 91正在播放| 四虎在线免费观看视频 | 国产日韩在线观看一区 | 999超碰| 99r在线精品 | 黄污视频网站 | 五月天激情综合 | 亚洲精品久久久久久久蜜桃 | 久久精品99国产精品日本 | 欧美看片 | 亚洲经典在线 | 色综合久久网 | 麻豆传媒在线免费看 | 中文字幕在线观看三区 | 91久色蝌蚪 | 久久国产精品免费一区 | 美女视频黄在线 | 国产黄色免费在线观看 | 色姑娘综合网 | 欧美日韩另类视频 | 日韩欧美在线视频一区二区三区 | 国产亚洲视频在线免费观看 | 91亚洲狠狠婷婷综合久久久 | 91丨九色丨首页 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 日韩一区二区三免费高清在线观看 | 国产又粗又猛又黄 | 夜色资源站国产www在线视频 | 又黄又刺激又爽的视频 | 欧美久久久久久久久中文字幕 | www.天天色.com| 免费视频一区二区 | 中文字幕一区在线观看视频 | 中文字幕亚洲精品在线观看 | 亚洲免费a| 91成人精品在线 | 久久伦理视频 | 福利区在线观看 | 视频在线日韩 | 黄色成人91 | 日韩有码中文字幕在线 | 国产精品mv在线观看 | 激情导航| 国产一级视频在线免费观看 | 色片网站在线观看 | 99久久日韩精品视频免费在线观看 | 国产精品一区二区久久精品爱微奶 | 久久久久综合精品福利啪啪 | 97超碰资源| 在线观看深夜视频 | 欧美一级视频免费 | 久久成人资源 | 国产亚洲精品久久久久久移动网络 | 亚洲国产免费网站 | 日韩免费网站 | 欧美日韩另类在线观看 | 黄p在线播放 | 六月丁香婷婷网 | 999精品在线| 欧美做受高潮电影o | 在线观看国产亚洲 | 91成人欧美| 五月开心六月婷婷 | 怡红院av久久久久久久 | 91在线看网站 | 日韩免费观看视频 | 99久久99| 18久久久久久 | 96亚洲精品久久久蜜桃 | 亚洲精品视频在 | 免费电影播放 | 中文av字幕在线观看 | 91看片淫黄大片一级在线观看 | 99re视频在线观看 | 日韩电影在线看 | 久久免费大片 | 一区二区三区在线免费观看视频 | 国产手机av在线 | 这里只有精彩视频 | 在线观看www. | 在线看不卡av | 久久国产品 | 91视频电影| 欧美一区二区三区四区夜夜大片 | 日本中文在线播放 | 五月天丁香综合 | 久久草av | 亚洲人成人99网站 | 久久精品一区二区 | 麻豆国产网站 | 香蕉视频国产在线观看 | 日韩一二区在线 | 麻豆首页| 亚洲区另类春色综合小说 | 91视频88av| 日韩在线观看中文字幕 | 伊人色**天天综合婷婷 | 国产啊v在线 | 久久伊人八月婷婷综合激情 | 五月婷婷av在线 | 日韩经典一区二区三区 | 黄污在线看 | 国产精品久久99综合免费观看尤物 | 手机av网站| 在线激情小视频 | 欧美黑人巨大xxxxx | 天堂av在线免费 | 久久久久久片 | 久久精品一区二区三区中文字幕 | 国产一区二区日本 | 免费av试看 | 丝袜美腿在线 | 精品1区2区3区 | 欧美日本在线视频 | 麻豆影视在线播放 | 亚洲精品在线国产 | 色综合婷婷| 精品国产一区二区三区在线 | 97中文字幕 | 黄色在线网站噜噜噜 | 日日爱999 | 永久免费观看视频 | 91亚洲精品久久久蜜桃网站 | 91网站在线视频 | 中文字幕日韩一区二区三区不卡 | 天天曰天天干 | 免费a现在观看 | 久久精品首页 | 日日摸日日爽 | 日韩色一区二区三区 | 亚洲国产一区二区精品专区 | 久久综合网色—综合色88 | 久草新在线 | 精品一区电影 | 操老逼免费视频 | 久久伦理电影 | 久久久久久久久久久久久影院 | 国产成人中文字幕 | 久久超碰免费 | 国产精品久久久电影 | 久久黄色a级片 | 99视频偷窥在线精品国自产拍 | 在线观看中文 | 探花视频免费观看 | 欧美日韩亚洲在线观看 | 五月香婷 | 丁香花在线观看免费完整版视频 | 欧美色操 | 久久久免费看片 | 日韩欧美国产激情在线播放 | 日韩电影在线观看一区 | 在线国产视频观看 | 深爱婷婷激情 | 97视频久久久 | 在线播放日韩 | 成人理论电影 | 亚洲www天堂com | 91探花视频 | 91香蕉嫩草 | 亚洲成av人片一区二区梦乃 | 欧美伦理电影一区二区 | 91精品在线观看视频 | 手机av在线不卡 | 午夜精品福利在线 | 欧美 日韩 久久 | 欧美日韩精品在线一区二区 | 18国产精品白浆在线观看免费 | 日本特黄特色aaa大片免费 | 婷婷伊人综合亚洲综合网 | 丁香激情综合 | 综合色久 | 一色av | 免费婷婷| 精品国产乱子伦一区二区 | 久久精品99国产国产 | 国产成人99av超碰超爽 | 国产亚洲情侣一区二区无 | 亚洲亚洲精品在线观看 | 久久爱影视i | 日韩欧美视频免费看 | 亚洲综合在线观看视频 | 天天色天天草天天射 | 亚洲人成人天堂h久久 | 97视频入口免费观看 | 99久久婷婷国产 | 96久久 | 国产一区二区电影在线观看 | 黄色小说18| 久久久综合色 | 黄色网大全 | 色香天天 | 免费69视频 | 爱情影院aqdy鲁丝片二区 | 精品免费 | 亚洲成av人电影 | 亚洲天堂网在线播放 | 91精品婷婷国产综合久久蝌蚪 | 亚州性色 | 国产999免费视频 | 激情中文字幕 | 亚洲欧美成人综合 | 欧美日韩精品免费观看视频 | 日本论理电影 | 久艹在线播放 | 欧美精彩视频在线观看 | 日韩高清久久 | 久久视频这里只有精品 | 久久久久久久久久影院 | 久草热视频 | 成人a免费视频 | 欧美日韩高清一区二区三区 | 狠狠色丁香婷婷综合久小说久 | 日韩一级黄色大片 | 欧美日韩中文字幕在线视频 | 91精品办公室少妇高潮对白 | 成人久久18免费网站 | 最近中文字幕视频网 | 九九九九九精品 | 中文字幕在线乱 | 91av视频| 欧美午夜激情网 | 久久综合狠狠综合 | 五月婷婷欧美视频 | 亚洲精品视频在线观看免费 | 干狠狠 | 911在线| 午夜精品一区二区三区免费视频 | 奇米网777 | av一区二区三区在线播放 | 在线观看亚洲视频 | 国产一级精品绿帽视频 | 91av电影在线观看 | 国产资源 | 国产黄色大片 | 五月婷综合| 国产精品乱码久久久久久1区2区 | 97碰碰精品嫩模在线播放 | 一区二区精品国产 | 亚洲天堂视频在线 | 亚洲黄色在线观看 | 国产成人精品综合久久久 | 日日操网站 | 国产精品国产三级国产不产一地 | 青青河边草观看完整版高清 | 亚洲精品在线观看网站 | www黄免费| 91香蕉视频污在线 | 在线观看精品 | 久久字幕网 | 久久久久久久久久久久av | 国产精品一区二区视频 | 操天天操| 中文资源在线官网 | 久久午夜国产 | 婷五月激情| 久久综合九九 | 欧美一二三在线 | 国产精品国产三级国产 | 99久久综合国产精品二区 | 婷婷在线资源 | 亚洲专区中文字幕 | 欧美性极品xxxx做受 | 国产一级免费在线 | 亚洲精品永久免费视频 | 亚洲一区免费在线 | 超碰在线人人爱 | 久久综合九色99 | 最近日本mv字幕免费观看 | 精品久久久久久久久中文字幕 | 在线天堂中文在线资源网 | 欧洲色吧| 国产专区视频在线观看 | 韩国av一区二区三区在线观看 | 久久久精品国产免费观看同学 | 日本中文在线 | www婷婷| 丁香花中文在线免费观看 | 亚洲免费视频观看 | 成人羞羞视频在线观看免费 | 成人久久毛片 | 国产精品美女久久久久久久 | 成人久久久精品国产乱码一区二区 | 夜夜操夜夜干 | 国产一区二区久久精品 | 国产专区第一页 | 欧美日韩1区2区 | 精品爱爱| 国产精品久久免费看 | 国产一区欧美在线 | 97理论电影 | 99久久综合国产精品二区 | 天天看天天操 | 在线观看黄色 | 国产成人333kkk| 女人18毛片a级毛片一区二区 | 国产 视频 高清 免费 | 性日韩欧美在线视频 | 精品a在线| 麻豆视频免费入口 | 欧美色一色| 久久久国产高清 | 亚洲国产精品成人精品 | 天堂成人在线 | 欧美色图p| 三上悠亚一区二区在线观看 | 91日韩在线专区 | 国产对白av | 欧美有色 | 精品国产网址 | 久久a v电影 | 91在线你懂的 | 五月天亚洲综合 | 国产精品美女久久久久久免费 | 狠狠干狠狠久久 | 婷婷精品 | 麻豆视频免费观看 | 四虎成人免费观看 | 国产精品久久久久久久久费观看 | 综合色中色 | 波多野结衣久久资源 | 人人干97 | 国产精品18videosex性欧美 | 少妇超碰在线 | 亚洲精品久久在线 | 日韩高清三区 | 日韩三级不卡 | 91av在线视频播放 | 夜夜躁狠狠躁日日躁视频黑人 | 99re8这里有精品热视频免费 | 免费精品久久久 | 国产亚洲aⅴaaaaaa毛片 | 国产精品99视频 | 天天操操操操操操 | 成人av影视在线 | 激情九九 | 又爽又黄又无遮挡网站动态图 | 亚洲九九九在线观看 | 欧美电影在线观看 | 香蕉91视频| 国产一区电影在线观看 | 久久久免费视频播放 | www看片网站 | 国产精品孕妇 | 久久久久久久影院 | wwwwww色| 免费网站在线观看人 | 免费视频你懂得 | 在线免费黄色 | av综合av | 精品一区精品二区 | 天天亚洲 | 狠狠操综合网 | 国产午夜一区 | 久久久久久久久久网站 | 九九视频在线播放 | 国产一区av在线 | 亚洲精品视频在线播放 | 亚洲精品 在线视频 | 国产精品美女久久久久久久 | 天堂中文在线视频 | 91免费观看视频网站 | 成年人免费av网站 | 福利网址在线观看 | 91免费看片黄| 六月久久婷婷 | 日韩,中文字幕 | 日日干夜夜爱 | 久久精品视频国产 | 99视频偷窥在线精品国自产拍 | 蜜臀av性久久久久蜜臀av | 射九九 | 狠狠色噜噜狠狠狠狠2021天天 | 婷婷中文在线 | 精品毛片在线 | 国产欧美在线一区 | 黄色国产精品 | 国产成人精品久久二区二区 | 人人看人人做人人澡 | 精品二区久久 | 日韩午夜精品 | 日韩在线中文字幕视频 | 黄色影院在线免费观看 | 亚洲精品mv在线观看 | 日韩在线网址 | 黄色精品一区 | 91麻豆精品国产自产 | 午夜黄网| 国产999精品久久久久久绿帽 | 亚洲精品永久免费视频 | 91精品视频观看 | 麻豆精品视频在线观看免费 | 中文字幕在线观看视频一区二区三区 | 久久久久久久久毛片精品 | 国产精品久久久亚洲 | 亚洲视频在线观看网站 | 日批在线看 | 午夜婷婷网| 欧美三人交 | 日韩高清不卡一区二区三区 | 中文在线 | 国产美女网站视频 | 国产精品欧美久久久久三级 | 国产精品99精品 | 中文字幕精品在线 | 国产高清视频免费观看 | 激情五月婷婷网 | 美女视频免费精品 | 99热精品国产一区二区在线观看 | 欧美一区,二区 | 天天久久夜夜 | 久久在线一区 | 国产综合在线视频 | 黄色小说免费观看 | 99精品系列 | 2023国产精品自产拍在线观看 | 国产精品av电影 | 依人成人综合网 | 国产精品久久99精品毛片三a | 欧美 亚洲 另类 激情 另类 | 少妇bbw搡bbbb搡bbbb | 99久久精品免费看国产麻豆 | 国产精品久久久久久久午夜片 | 麻豆成人精品视频 | 日韩一区二区三区高清免费看看 | 女人久久久久 | 亚洲国产网站 | 免费高清在线观看电视网站 | 在线观看免费高清视频大全追剧 | 天天综合网在线 | 欧美人体xx | 国产手机免费视频 | 在线观看中文字幕亚洲 | 91人人人 | 99在线视频播放 | 啪啪小视频网站 | 日韩精品国产一区 | 国产亚洲无 | 欧美美女视频在线观看 | 成年性视频 | 亚洲精品免费在线播放 | 日韩一区二区三区高清在线观看 | 欧美日韩综合在线观看 | 在线精品亚洲一区二区 | 国产一区二区精品久久 | 天天狠狠操 | 国产福利免费在线观看 | 天天干人人干 | 精品美女在线视频 | 91精品国产九九九久久久亚洲 | 亚洲爱av | 国产无套精品久久久久久 | 黄色一二级片 | 亚洲第一av在线播放 | 久久看视频 | 三级黄色片在线观看 | 日本中文字幕在线观看 | 视频二区在线 | 99在线精品视频在线观看 | 久久久精品影视 | 精品国产乱码久久久久久久 | 免费观看不卡av | 超碰97久久 | 久久99亚洲网美利坚合众国 | 天天草网站 | 热久久电影 | www.99久久.com | 91成人看片 | 99视频在线精品国自产拍免费观看 | 97视频在线观看视频免费视频 | 成人网在线免费视频 | 99综合久久 | 色婷婷精品大在线视频 | 狠狠干狠狠操 | 在线观看av国产 | 成人精品国产 | 天天草综合 | 99综合电影在线视频 | zzijzzij亚洲日本少妇熟睡 | 91成人在线免费观看 | 久久av电影| 天天搞夜夜骑 | 在线看中文字幕 | 在线免费观看国产黄色 | 日韩电影一区二区在线观看 | 精品国产综合区久久久久久 | 黄色特级毛片 | 激情综合久久 | 天天干天天玩天天操 | 99视频偷窥在线精品国自产拍 | 中文字幕免费一区 | 免费麻豆网站 | 欧美一级特黄aaaaaa大片在线观看 | 激情综合站 | 91看毛片 | 久久国产精品第一页 | 97超碰中文字幕 | 久久中文字幕导航 | 伊人国产女 | 97精品久久人人爽人人爽 | 99视频免费观看 | 中文字幕制服丝袜av久久 | 久久久免费观看完整版 | 色五月色开心色婷婷色丁香 | 国产精品免费在线 | 99精品在线播放 | 91人人爽久久涩噜噜噜 | 啪啪免费观看网站 | 国产成人a亚洲精品v | 在线综合色 | 中文字幕在线观看2018 | 亚洲一区欧美精品 | 精品久久精品久久 | 久久久久免费精品国产小说色大师 | 久久综合毛片 | 亚洲一区二区精品视频 | av成人亚洲 | 日韩黄在线观看 | 国产视频精品免费播放 | 日韩精品久久中文字幕 | av免费观看高清 | 国产精品久久久久久久久久 | 免费色视频 | 一区二区视频在线看 | 九九久久久久久久久激情 | 日韩字幕在线观看 | 国产亚洲人成网站在线观看 | 99视频99| 五月婷婷中文网 | 中文字幕在线观看完整 | 婷婷色网 | 精品999在线 | 丁香六月婷婷激情 | 久久精品99国产精品 | 91视频免费观看 | 欧美日韩国产二区 | 91在线资源 | 亚洲精品久久久久999中文字幕 | 天天干一干 | 久久国产剧场电影 | 在线a视频免费观看 | 91色蜜桃 | 久草在线免费资源站 | 天天干天天操天天射 | 国产永久网站 | 亚洲天堂网在线视频观看 | 天天插一插| 在线免费黄 | 国产在线一区观看 | av网站免费在线 | 91久草视频 | 在线看国产一区 | 青青河边草免费观看 | 日日干天天插 | 天天操夜夜操国产精品 | 99免费在线观看 | 国产五月婷婷 | 精品久久在线 | 97理论电影 | 成人免费电影 | 五月婷婷久久综合 | 中文字幕久久精品亚洲乱码 | 国产一区二区精品久久91 | 蜜臀av网址 | 国产群p| 日韩三级视频在线看 | 中文字幕在线观看网站 | 高清av网站 | 丁香六月天| 欧美性一级观看 | 六月丁香婷 | 在线观看成人国产 | 欧美国产一区二区 | 成年人电影免费看 | 99精品国产成人一区二区 | av免费片 | 亚洲精品在线一区二区三区 | 一区二区视频在线观看免费 | 精品国产一区二区在线 | 99视频在线精品国自产拍免费观看 | 成年人在线免费看视频 | 色免费在线 | 深爱开心激情网 | 九九免费在线观看 | 婷婷电影在线观看 | 99在线热播| 色噜噜狠狠狠狠色综合 | 在线观看一级视频 | 亚洲午夜精品一区二区三区电影院 | 久草在线 | 美女视频免费精品 | 一区免费在线 | 欧美日韩午夜在线 | 东方av在 | 91久久精品一区二区三区 | 中文在线8资源库 | 国产精品av免费观看 | 日韩在线观看高清 | 色婷婷综合久久久中文字幕 | 日日日视频 | 视频福利在线 | 二区三区毛片 | 国产免费又爽又刺激在线观看 | 国产在线一区二区三区播放 | 国产色女 | 激情五月婷婷 | 黄在线免费看 | 一区二区三区免费在线观看视频 | 久日精品 | 高清国产午夜精品久久久久久 | 97精产国品一二三产区在线 | 国产精品久久久久久久久久99 | 91成人精品一区在线播放69 | 欧美激情视频免费看 | 日韩欧美视频免费在线观看 | 久久在线免费 | 免费观看高清 | 国内外成人在线视频 | 久久精品中文字幕 | 天天插天天狠天天透 | 日韩一级片观看 | 成人av日韩 | 超碰人人草人人 | 久久av一区二区三区亚洲 | 日韩精品一区二区三区丰满 | 伊人色综合久久天天 | 精品久久久久久国产 | 亚洲成人资源 | www.一区二区三区 | 缴情综合网五月天 | 天天综合天天综合 | 国产精品美女视频网站 | 亚洲精品综合欧美二区变态 | 97精品国自产拍在线观看 | 极品国产91在线网站 | 国产精品久久久久久久久久久久冷 | 91高清免费观看 | 色999精品| 婷婷综合网 | 日韩中文在线播放 | 亚洲 在线 | 久久草av| 国产成人777777 | 精品国产一区二区三区四区在线观看 | 亚洲午夜精品在线观看 | 日韩手机在线观看 | 97超碰影视 | 激情综合色综合久久综合 | 黄色精品视频 | 成年人黄色免费视频 | 久久久国产一区二区三区四区小说 | 在线精品亚洲一区二区 | 亚洲一区二区三区在线看 | 中文字幕一区二区三区四区视频 | 日本最新高清不卡中文字幕 | ww亚洲ww亚在线观看 | 日本乱码在线 | 四虎在线观看网址 | 欧美精品中文字幕亚洲专区 | 人人狠狠综合久久亚洲 | 91伊人久久大香线蕉蜜芽人口 | 成人一级电影在线观看 | 久久综合9988久久爱 | 99久久精品国产亚洲 | 久草视频2 | 天天色天天上天天操 | 亚洲人久久久 | 亚洲无毛专区 | 日本护士撒尿xxxx18 | 中文字幕免费一区 | 337p西西人体大胆瓣开下部 | 97视频免费观看2区 亚洲视屏 | 国产成人精品午夜在线播放 | 看全黄大色黄大片 | 999久久久久久久久6666 | 日韩精品一区二区在线视频 | 久久观看 | 最近免费中文字幕 | 日韩av图片 | 日韩av电影免费观看 | 久久99影院 | 亚洲不卡av一区二区三区 | 色网站在线免费观看 | 91精品国产入口 | 热久在线 | 成人在线观看资源 | 国产偷国产偷亚洲清高 | 国产99久久 | 国产一级三级 | av在线免费观看网站 | 精品久久久久久久久久久院品网 | 国产人成免费视频 | 九九在线视频免费观看 | av电影免费在线播放 | 欧美色图30p | 中文字幕电影一区 | 久草视频在线免费看 | av高清网站在线观看 | 黄色网址在线播放 | 国产精品激情在线观看 | 国产91探花 | 黄色的片子 | 男女日麻批 | 国产永久免费观看 | 99精品免费视频 | 91成人免费看 | 日韩xxxx视频 | 中文字幕成人av | 天天透天天插 | 九九影视理伦片 | 六月丁香综合网 | 色婷婷色| 97超碰人人澡 | 久久精品国产精品 | 日韩高清www | 香蕉视频在线播放 | 在线免费精品视频 | 国产精品成人一区二区三区吃奶 | 日本一区二区免费在线观看 | 成人中文字幕在线观看 | 在线观看不卡视频 | 蜜臀av夜夜澡人人爽人人桃色 | 成人免费共享视频 | 在线观看的av网站 | www.久草.com| 欧美亚洲一区二区在线 | 丁香九月婷婷综合 | 成人一级免费电影 | 欧美在线观看视频一区二区三区 | 日韩免费av网址 | 久久久久久97三级 | 精品久久一二三区 | 91看片淫黄大片在线播放 | 成人h视频在线 | 久久黄色网 | 日批在线观看 | 丁香六月婷婷开心婷婷网 | 久久99精品国产99久久 | 美女禁18| av在线电影网站 | 免费在线a | 日本三级大片 | 欧美性成人 | 久久久福利视频 | 91九色蝌蚪在线 | www,黄视频| 五月婷婷丁香综合 | 久久伊人精品天天 | 亚洲精品乱码久久久久久写真 | 久久成人麻豆午夜电影 | 五月婷婷狠狠 | 97国产大学生情侣白嫩酒店 | 欧美成天堂网地址 | www日韩视频 | 日韩精品久久久免费观看夜色 | 狠狠操.com| 黄色激情网址 | 99re久久资源最新地址 | 中文字幕资源在线观看 | 久久亚洲精品国产亚洲老地址 | 日批视频在线 | 国产精品96久久久久久吹潮 | 国产91丝袜在线播放动漫 | 91原创在线观看 | 中文字幕精品一区二区精品 | 亚洲精品国产综合99久久夜夜嗨 | 国产一区二区三区在线 | 51精品国自产在线 | 亚洲一区视频免费观看 | 又黄又爽的视频在线观看网站 | 久久久久久久久久电影 | 久久久精品久久日韩一区综合 | 午夜色站 | 亚洲激色 | 日韩中文在线观看 | 在线观看岛国片 | 成人黄在线 | 激情五月在线视频 | 国产高清在线免费观看 | 免费无遮挡动漫网站 | 9免费视频| 日韩欧美国产视频 | 亚洲精品免费观看视频 | 免费观看xxxx9999片 | 成人一区二区三区中文字幕 | 成人羞羞视频在线观看免费 | 五月婷婷在线观看 | 国产九色在线播放九色 | 欧美视频二区 | 成人福利在线 | 99精品在线免费观看 | 国内免费久久久久久久久久久 | 国产视频一区二区在线观看 | 五月婷在线播放 | 色香网 | 国产精品一区二区 91 | 欧女人精69xxxxxx | 色com网 | 午夜免费电影院 | 国产精品18久久久久久不卡孕妇 | 欧美一级片在线观看视频 | 五月天天色 | 在线视频 91| 国产色黄网站 | 天天草天天摸 | 天堂在线视频免费观看 | 激情丁香 | 成人av在线直播 | 9999在线 | jizz999| 国产精品免费视频一区二区 | 午夜免费久久看 |