diff --git a/README.md b/README.md index a96a07a..ef28b5f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Android Image Slider [![Build Status](https://travis-ci.org/daimajia/AndroidImageSlider.svg)](https://travis-ci.org/daimajia/AndroidImageSlider) +# Android Video & Image Slider [![Build Status](https://travis-ci.org/daimajia/AndroidImageSlider.svg)](https://travis-ci.org/daimajia/AndroidImageSlider) [![Gitter](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/daimajia/AndroidImageSlider?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) diff --git a/build.gradle b/build.gradle index 49166ee..f3aa479 100644 --- a/build.gradle +++ b/build.gradle @@ -1,21 +1,21 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. - -task wrapper(type: Wrapper) { - gradleVersion = '2.2.1' -} - buildscript { repositories { - mavenCentral() - } + google() + maven { + url 'https://maven.google.com/' + name 'Google' + } + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.2' - classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.10.+' + classpath 'com.android.tools.build:gradle:3.2.0' } } allprojects { repositories { + google() mavenCentral() + jcenter() } } diff --git a/demo/build.gradle b/demo/build.gradle index de31b19..687ffe5 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -1,14 +1,13 @@ -apply plugin: 'android-sdk-manager' apply plugin: 'com.android.application' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { - minSdkVersion 8 - targetSdkVersion 22 + minSdkVersion 19 + targetSdkVersion 28 versionCode 2 versionName "1.0.1" } @@ -20,9 +19,10 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile project(':library') - compile 'com.android.support:appcompat-v7:22.+' - compile 'com.nineoldandroids:library:2.4.0' - compile 'com.daimajia.androidanimations:library:1.0.3@aar' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation project(':library') + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support:support-v4:28.0.0' + implementation 'com.nineoldandroids:library:2.4.0' + implementation 'com.daimajia.androidanimations:library:1.0.3@aar' } diff --git a/demo/gradle/wrapper/gradle-wrapper.jar b/demo/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..f6b961f Binary files /dev/null and b/demo/gradle/wrapper/gradle-wrapper.jar differ diff --git a/demo/gradle/wrapper/gradle-wrapper.properties b/demo/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c46fc0f --- /dev/null +++ b/demo/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Sep 06 14:26:29 PKT 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/demo/gradlew b/demo/gradlew new file mode 100644 index 0000000..cccdd3d --- /dev/null +++ b/demo/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/demo/gradlew.bat b/demo/gradlew.bat new file mode 100644 index 0000000..e95643d --- /dev/null +++ b/demo/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/demo/src/main/java/com/daimajia/slider/demo/MainActivity.java b/demo/src/main/java/com/daimajia/slider/demo/MainActivity.java index 8037dcf..5ba5f58 100644 --- a/demo/src/main/java/com/daimajia/slider/demo/MainActivity.java +++ b/demo/src/main/java/com/daimajia/slider/demo/MainActivity.java @@ -3,7 +3,7 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.support.v7.app.ActionBarActivity; +import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; @@ -19,12 +19,13 @@ import com.daimajia.slider.library.SliderLayout; import com.daimajia.slider.library.SliderTypes.BaseSliderView; import com.daimajia.slider.library.SliderTypes.TextSliderView; +import com.daimajia.slider.library.SliderTypes.VideoSliderView; import com.daimajia.slider.library.Tricks.ViewPagerEx; import java.util.HashMap; -public class MainActivity extends ActionBarActivity implements BaseSliderView.OnSliderClickListener, ViewPagerEx.OnPageChangeListener{ +public class MainActivity extends AppCompatActivity implements BaseSliderView.OnSliderClickListener, ViewPagerEx.OnPageChangeListener{ private SliderLayout mDemoSlider; @@ -46,12 +47,18 @@ protected void onCreate(Bundle savedInstanceState) { file_maps.put("House of Cards",R.drawable.house); file_maps.put("Game of Thrones", R.drawable.game_of_thrones); + HashMap video_url_maps = new HashMap<>(); + video_url_maps.put("HoneyComb", "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"); + video_url_maps.put("GOT", "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerBlazes.mp4"); + + + for(String name : file_maps.keySet()){ TextSliderView textSliderView = new TextSliderView(this); // initialize a SliderLayout textSliderView .description(name) - .image(file_maps.get(name)) + .load(file_maps.get(name)) .setScaleType(BaseSliderView.ScaleType.Fit) .setOnSliderClickListener(this); @@ -60,12 +67,35 @@ protected void onCreate(Bundle savedInstanceState) { textSliderView.getBundle() .putString("extra",name); - mDemoSlider.addSlider(textSliderView); + mDemoSlider.addSlider(textSliderView); } + + for(String name : video_url_maps.keySet()){ + VideoSliderView videoSliderView = new VideoSliderView(this); + // initialize a SliderLayout + videoSliderView + .description(name) + .load(video_url_maps.get(name)) + .setVideoLooping(false) + .setAutoPlay(true) + .setPlayButtonIcon(R.drawable.play_button) + .setOnSliderClickListener(this); + + //add your extra information + videoSliderView.bundle(new Bundle()); + videoSliderView.getBundle() + .putString("extra",name); + + mDemoSlider.addSlider(videoSliderView); + } + + + mDemoSlider.setPresetTransformer(SliderLayout.Transformer.Accordion); mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom); mDemoSlider.setCustomAnimation(new DescriptionAnimation()); mDemoSlider.setDuration(4000); + mDemoSlider.stopAutoCycle(); mDemoSlider.addOnPageChangeListener(this); ListView l = (ListView)findViewById(R.id.transformers); l.setAdapter(new TransformerAdapter(this)); diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 918e0f3..c1d218d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun May 03 23:34:25 CST 2015 +#Fri Sep 06 14:40:52 PKT 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip diff --git a/library/build.gradle b/library/build.gradle index b2e8cc6..1dbff74 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { - minSdkVersion 8 - targetSdkVersion 22 + minSdkVersion 19 + targetSdkVersion 28 versionCode 15 versionName "1.1.5" } @@ -21,10 +21,9 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:22.1.1' - compile "com.android.support:support-v4:22.1.1" - compile 'com.squareup.picasso:picasso:2.5.2' - compile 'com.nineoldandroids:library:2.4.0' -} -apply from: './gradle-mvn-push.gradle' + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation "com.android.support:support-v4:28.0.0" + implementation 'com.squareup.picasso:picasso:2.5.2' + implementation 'com.nineoldandroids:library:2.4.0' +} \ No newline at end of file diff --git a/library/src/main/java/com/daimajia/slider/library/SliderTypes/BaseSliderView.java b/library/src/main/java/com/daimajia/slider/library/SliderTypes/BaseSliderView.java index 8ad1d35..b8fe647 100644 --- a/library/src/main/java/com/daimajia/slider/library/SliderTypes/BaseSliderView.java +++ b/library/src/main/java/com/daimajia/slider/library/SliderTypes/BaseSliderView.java @@ -1,9 +1,13 @@ package com.daimajia.slider.library.SliderTypes; import android.content.Context; +import android.media.MediaPlayer; +import android.net.Uri; import android.os.Bundle; import android.view.View; +import android.widget.ImageButton; import android.widget.ImageView; +import android.widget.VideoView; import com.daimajia.slider.library.R; import com.squareup.picasso.Callback; @@ -15,8 +19,8 @@ /** * When you want to make your own slider view, you must extends from this class. * BaseSliderView provides some useful methods. - * I provide two example: {@link com.daimajia.slider.library.SliderTypes.DefaultSliderView} and - * {@link com.daimajia.slider.library.SliderTypes.TextSliderView} + * I provide two example: {@link DefaultSliderView} and + * {@link TextSliderView} * if you want to show progressbar, you just need to set a progressbar id as @+id/loading_bar. */ public abstract class BaseSliderView { @@ -54,6 +58,12 @@ public abstract class BaseSliderView { */ private ScaleType mScaleType = ScaleType.Fit; + private boolean videoLooping = true; + private boolean videoIsPrepared = false; + + private boolean autoPlay = true; + private int playButtonIcon = R.drawable.play_button; + public enum ScaleType{ CenterCrop, CenterInside, Fit, FitCenterCrop } @@ -103,13 +113,13 @@ public BaseSliderView description(String description){ } /** - * set a url as a image that preparing to load + * set a url as a image / video that preparing to load * @param url * @return */ - public BaseSliderView image(String url){ + public BaseSliderView load(String url){ if(mFile != null || mRes != 0){ - throw new IllegalStateException("Call multi image function," + + throw new IllegalStateException("Call multi load function," + "you only have permission to call it once"); } mUrl = url; @@ -117,22 +127,27 @@ public BaseSliderView image(String url){ } /** - * set a file as a image that will to load + * set a file as a image / video that will to load * @param file * @return */ - public BaseSliderView image(File file){ + public BaseSliderView load(File file){ if(mUrl != null || mRes != 0){ - throw new IllegalStateException("Call multi image function," + + throw new IllegalStateException("Call multi load function," + "you only have permission to call it once"); } mFile = file; return this; } - public BaseSliderView image(int res){ + /** + * set a resource as a image / video that will to load + * @param res + * @return + */ + public BaseSliderView load(int res){ if(mUrl != null || mFile != null){ - throw new IllegalStateException("Call multi image function," + + throw new IllegalStateException("Call multi load function," + "you only have permission to call it once"); } mRes = res; @@ -246,9 +261,8 @@ public void onClick(View v) { rq.into(targetImageView,new Callback() { @Override public void onSuccess() { - if(v.findViewById(R.id.loading_bar) != null){ - v.findViewById(R.id.loading_bar).setVisibility(View.INVISIBLE); - } + hideLoadingBar(v); + } @Override @@ -256,13 +270,111 @@ public void onError() { if(mLoadListener != null){ mLoadListener.onEnd(false,me); } - if(v.findViewById(R.id.loading_bar) != null){ - v.findViewById(R.id.loading_bar).setVisibility(View.INVISIBLE); - } + hideLoadingBar(v); } }); } + private void hideLoadingBar(View v) { + if(v.findViewById(R.id.loading_bar) != null){ + v.findViewById(R.id.loading_bar).setVisibility(View.INVISIBLE); + } + } + + /** + * When you want to implement your own slider view, please call this method in the end in `getView()` method + * @param v the whole view + * @param videoView where to place video + * @param playButton + */ + protected void bindEventAndShow(final View v, VideoView videoView, ImageButton playButton){ + final BaseSliderView me = this; + final VideoView finalVideoView = videoView; + final ImageButton finalPlayButton = playButton; + + v.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(mOnSliderClickListener != null){ + mOnSliderClickListener.onSliderClick(me); + } + } + }); + + playButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (videoIsPrepared) { + finalVideoView.start(); + finalPlayButton.setVisibility(View.GONE); + } + } + }); + + playButton.setBackgroundResource(playButtonIcon); + + if (videoView == null) + return; + + if (mLoadListener != null) { + mLoadListener.onStart(me); + } + + Uri uri; + + if(mUrl!=null){ + uri = Uri.parse(mUrl); + }else if(mFile != null){ + uri = Uri.parse(mFile.getAbsolutePath()); + }else if(mRes != 0){ + uri = Uri.parse("android.resource://" + getContext().getPackageName() + "/" + mRes); + }else{ + return; + } + + videoView.setVideoURI(uri); + videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { + @Override + public void onPrepared(MediaPlayer mp) { + videoIsPrepared = true; + mp.setLooping(videoLooping); + hideLoadingBar(v); + + if (autoPlay) + mp.start(); + else finalPlayButton.setVisibility(View.VISIBLE); + + } + }); + + videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { + @Override + public void onCompletion(MediaPlayer mp) { + if (!autoPlay) finalPlayButton.setVisibility(View.VISIBLE); + } + }); + + videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { + @Override + public boolean onError(MediaPlayer mp, int what, int extra) { + if(mLoadListener != null){ + mLoadListener.onEnd(false,me); + } + hideLoadingBar(v); + return false; + } + }); + } + + public BaseSliderView setPlayButtonIcon(int playButtonIcon) { + this.playButtonIcon = playButtonIcon; + return this; + } + + public int getPlayButtonIcon() { + return playButtonIcon; + } + public BaseSliderView setScaleType(ScaleType type){ @@ -274,6 +386,24 @@ public ScaleType getScaleType(){ return mScaleType; } + public BaseSliderView setVideoLooping(boolean looping){ + videoLooping = looping; + return this; + } + + public boolean getVideoLooping(){ + return videoLooping; + } + + public boolean isAutoPlay() { + return autoPlay; + } + + public BaseSliderView setAutoPlay(boolean autoPlay) { + this.autoPlay = autoPlay; + return this; + } + /** * the extended class have to implement getView(), which is called by the adapter, * every extended class response to render their own view. diff --git a/library/src/main/java/com/daimajia/slider/library/SliderTypes/VideoSliderView.java b/library/src/main/java/com/daimajia/slider/library/SliderTypes/VideoSliderView.java new file mode 100644 index 0000000..d77f4f7 --- /dev/null +++ b/library/src/main/java/com/daimajia/slider/library/SliderTypes/VideoSliderView.java @@ -0,0 +1,28 @@ +package com.daimajia.slider.library.SliderTypes; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.ImageButton; +import android.widget.TextView; +import android.widget.VideoView; + +import com.daimajia.slider.library.R; + +public class VideoSliderView extends BaseSliderView { + + public VideoSliderView(Context context) { + super(context); + } + + @Override + public View getView() { + View v = LayoutInflater.from(getContext()).inflate(R.layout.render_type_video,null); + VideoView videoView = v.findViewById(R.id.daimajia_slider_video); + ImageButton playIcon = v.findViewById(R.id.play_button); + TextView description = v.findViewById(R.id.description); + description.setText(getDescription()); + bindEventAndShow(v, videoView, playIcon); + return v; + } +} diff --git a/library/src/main/java/com/daimajia/slider/library/Tricks/ViewPagerEx.java b/library/src/main/java/com/daimajia/slider/library/Tricks/ViewPagerEx.java index 8927d26..9816abc 100644 --- a/library/src/main/java/com/daimajia/slider/library/Tricks/ViewPagerEx.java +++ b/library/src/main/java/com/daimajia/slider/library/Tricks/ViewPagerEx.java @@ -15,7 +15,6 @@ import android.support.v4.os.ParcelableCompat; import android.support.v4.os.ParcelableCompatCreatorCallbacks; import android.support.v4.view.AccessibilityDelegateCompat; -import android.support.v4.view.KeyEventCompat; import android.support.v4.view.MotionEventCompat; import android.support.v4.view.PagerAdapter; import android.support.v4.view.VelocityTrackerCompat; @@ -2516,9 +2515,9 @@ public boolean executeKeyEvent(KeyEvent event) { if (Build.VERSION.SDK_INT >= 11) { // The focus finder had a bug handling FOCUS_FORWARD and FOCUS_BACKWARD // before Android 3.0. Ignore the tab key on those devices. - if (KeyEventCompat.hasNoModifiers(event)) { + if (event.hasNoModifiers()) { handled = arrowScroll(FOCUS_FORWARD); - } else if (KeyEventCompat.hasModifiers(event, KeyEvent.META_SHIFT_ON)) { + } else if (event.hasModifiers(KeyEvent.META_SHIFT_ON)) { handled = arrowScroll(FOCUS_BACKWARD); } } @@ -2735,7 +2734,7 @@ protected boolean onRequestFocusInDescendants(int direction, @Override public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) { // Dispatch scroll events from this ViewPager. - if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED) { + if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED) { return super.dispatchPopulateAccessibilityEvent(event); } @@ -2783,7 +2782,7 @@ public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) event.setClassName(ViewPagerEx.class.getName()); final AccessibilityRecordCompat recordCompat = AccessibilityRecordCompat.obtain(); recordCompat.setScrollable(canScroll()); - if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED + if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SCROLLED && mAdapter != null) { recordCompat.setItemCount(mAdapter.getCount()); recordCompat.setFromIndex(mCurItem); diff --git a/library/src/main/res/drawable/play_button.png b/library/src/main/res/drawable/play_button.png new file mode 100644 index 0000000..718931a Binary files /dev/null and b/library/src/main/res/drawable/play_button.png differ diff --git a/library/src/main/res/layout/render_type_video.xml b/library/src/main/res/layout/render_type_video.xml new file mode 100644 index 0000000..8310b3a --- /dev/null +++ b/library/src/main/res/layout/render_type_video.xml @@ -0,0 +1,38 @@ + + + + + + + + + + \ No newline at end of file