Repository: bhargavms/PodSLider
Branch: master
Commit: eac152c7be4f
Files: 47
Total size: 66.9 KB
Directory structure:
gitextract_cysai_1j/
├── .gitignore
├── build.gradle
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── library/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── example/
│ │ └── podslider/
│ │ └── ApplicationTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── bhargavms/
│ │ │ └── podslider/
│ │ │ ├── EaseOutElasticInterpolator.java
│ │ │ ├── OnPodClickListener.java
│ │ │ ├── Pod.java
│ │ │ └── PodSlider.java
│ │ └── res/
│ │ ├── drawable/
│ │ │ ├── ic_accessibility_black_24dp.xml
│ │ │ ├── ic_account_circle_black_24dp.xml
│ │ │ └── ic_directions_car_black_24dp.xml
│ │ └── values/
│ │ ├── attrs.xml
│ │ └── strings.xml
│ └── test/
│ └── java/
│ └── com/
│ └── bhargavms/
│ └── podslider/
│ └── ExampleUnitTest.java
├── readme.md
├── sample/
│ ├── .gitignore
│ ├── build.gradle
│ ├── proguard-rules.pro
│ └── src/
│ ├── androidTest/
│ │ └── java/
│ │ └── com/
│ │ └── example/
│ │ └── podslidersample/
│ │ └── ApplicationTest.java
│ ├── main/
│ │ ├── AndroidManifest.xml
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── podslidersample/
│ │ │ ├── BlankFragment.java
│ │ │ ├── BlankFragmentTwo.java
│ │ │ ├── MainActivity.java
│ │ │ └── PagerInteractionActivity.java
│ │ └── res/
│ │ ├── drawable/
│ │ │ ├── ic_android_black_24dp.xml
│ │ │ ├── ic_android_black_24dp1.xml
│ │ │ ├── ic_build_black_24dp.xml
│ │ │ └── ic_weekend_black_24dp.xml
│ │ ├── layout/
│ │ │ ├── activity_main.xml
│ │ │ ├── activity_pager_interaction.xml
│ │ │ ├── fragment_blank.xml
│ │ │ └── fragment_blank_two.xml
│ │ ├── values/
│ │ │ ├── colors.xml
│ │ │ ├── dimens.xml
│ │ │ ├── strings.xml
│ │ │ └── styles.xml
│ │ └── values-w820dp/
│ │ └── dimens.xml
│ └── test/
│ └── java/
│ └── com/
│ └── example/
│ └── podslidersample/
│ └── ExampleUnitTest.java
└── settings.gradle
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.iml
.gradle
/local.properties
.idea
.DS_Store
/build
/captures
================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: gradle/wrapper/gradle-wrapper.properties
================================================
#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
================================================
FILE: gradle.properties
================================================
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx10248m -XX:MaxPermSize=256m
# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
================================================
FILE: gradlew
================================================
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# 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
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# 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
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" ] ; 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
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
================================================
FILE: gradlew.bat
================================================
@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
@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=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@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 Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_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=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
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
================================================
FILE: library/.gitignore
================================================
/build
================================================
FILE: library/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
group='com.github.bhargavms'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
minSdkVersion 11
targetSdkVersion 23
versionCode 1
versionName "1.2.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.android.support:appcompat-v7:23.4.0'
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
}
================================================
FILE: library/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /home/talview23/Android/Sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
================================================
FILE: library/src/androidTest/java/com/example/podslider/ApplicationTest.java
================================================
package com.example.podslider;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* Testing Fundamentals
*/
public class ApplicationTest extends ApplicationTestCase {
public ApplicationTest() {
super(Application.class);
}
}
================================================
FILE: library/src/main/AndroidManifest.xml
================================================
================================================
FILE: library/src/main/java/com/bhargavms/podslider/EaseOutElasticInterpolator.java
================================================
package com.bhargavms.podslider;
import android.view.animation.Interpolator;
/**
* An interpolator that eases past the final value then back towards it elastically.
*
* math taken from link provided in see also section.
*
* @see Greensock Github
*/
public class EaseOutElasticInterpolator implements Interpolator {
private static final float TWO_PI = (float) (2 * Math.PI);
private float p1;
private float p2;
private float p3;
public EaseOutElasticInterpolator(float amplitude, float period) {
p1 = (amplitude >= 1) ? amplitude : 1;
p2 = period <= 0 ? 0.3f : period / (amplitude >= 1 ? amplitude : 1);
p3 = (float) (p2 / TWO_PI * (Math.asin(1 / p1)));
p2 = TWO_PI / p2;
}
@Override
public float getInterpolation(float p) {
return (float) (p1 * Math.pow(2, -10 * p) * Math.sin((p - p3) * p2) + 1);
}
}
================================================
FILE: library/src/main/java/com/bhargavms/podslider/OnPodClickListener.java
================================================
package com.bhargavms.podslider;
public interface OnPodClickListener {
void onPodClick(int position);
}
================================================
FILE: library/src/main/java/com/bhargavms/podslider/Pod.java
================================================
package com.bhargavms.podslider;
import android.animation.ValueAnimator;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.text.TextPaint;
import android.view.animation.BounceInterpolator;
import android.view.animation.DecelerateInterpolator;
class Pod {
private int position = 0;
private String centerText;
private float podRadius = 0;
private int podColor = 0;
private int selectedPodColor = Color.WHITE;
private int mainSliderColor = 0;
private float cx = 0;
private float cy = 0;
private boolean selected = false;
private static final float MAX_RADIUS_INCREMENT_FACTOR = 0.3f;
private float radiusIncrementor = MAX_RADIUS_INCREMENT_FACTOR;
private Handler handler;
private Drawable mDrawable;
private Paint podCirclePaint;
private Paint selectedPodPaint;
private Paint selectedPodTextPaint;
private PodSlider parent;
private PodSlider.DrawableSize mDrawableSize;
public Pod(float radius, int color, int mainSliderColor, int selectedPodColor, PodSlider parent) {
this.mainSliderColor = mainSliderColor;
this.podRadius = radius;
this.podColor = color;
this.selectedPodColor = selectedPodColor;
this.parent = parent;
init();
}
public Pod(int mainSliderColor, int color,
int selectedPodColor, PodSlider parent, int position) {
this.mainSliderColor = mainSliderColor;
this.podColor = color;
this.selectedPodColor = selectedPodColor;
this.parent = parent;
this.position = position;
this.centerText = String.valueOf(position + 1);
init();
}
public Pod(int mainSliderColor, int color,
int selectedPodColor, PodSlider parent, int position, String centerText) {
this.mainSliderColor = mainSliderColor;
this.podColor = color;
this.selectedPodColor = selectedPodColor;
this.parent = parent;
this.position = position;
this.centerText = centerText;
init();
}
public void setCenter(float cx, float cy) {
this.cx = cx;
this.cy = cy;
}
public void setCenterText(String centerText) {
this.centerText = centerText;
}
public void setCenterDrawable(Drawable drawable, PodSlider.DrawableSize size) {
this.mDrawable = drawable;
mDrawableSize = size;
}
public int getPosition() {
return position;
}
public float getCenterX() {
return cx;
}
public float getCenterY() {
return cy;
}
public void setPodRadius(float radius) {
this.podRadius = radius;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
private void init() {
handler = new Handler();
podCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
podCirclePaint.setColor(podColor);
podCirclePaint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK);
podCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE);
selectedPodPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
selectedPodPaint.setColor(selectedPodColor);
selectedPodPaint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK);
selectedPodPaint.setStyle(Paint.Style.FILL_AND_STROKE);
Paint mainSliderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mainSliderPaint.setColor(mainSliderColor);
mainSliderPaint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK);
mainSliderPaint.setStyle(Paint.Style.FILL_AND_STROKE);
selectedPodTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
selectedPodTextPaint.setColor(mainSliderColor);
selectedPodTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
selectedPodTextPaint.setStyle(Paint.Style.FILL_AND_STROKE);
selectedPodTextPaint.setTextAlign(Paint.Align.CENTER);
}
public void drawPod(Canvas canvas) {
if (!selected)
canvas.drawCircle(cx, cy, podRadius, podCirclePaint);
else {
canvas.drawCircle(cx, cy, podRadius + (podRadius * radiusIncrementor), selectedPodPaint);
float textSize = (podRadius + MAX_RADIUS_INCREMENT_FACTOR) * 2;
selectedPodTextPaint.setTextSize(textSize);
if (mDrawable == null) {
canvas.drawText(centerText,
cx,
// http://stackoverflow.com/questions/11120392/android-center-text-on-canvas
cy - ((selectedPodTextPaint.descent() + selectedPodTextPaint.ascent()) / 2),
selectedPodTextPaint);
} else {
float diameter;
switch (mDrawableSize) {
case FIT_LARGE_CIRCLE:
diameter = parent.largeCircleRadius * 2;
break;
case FIT_MEDIUM_CIRCLE:
diameter = parent.mediumCircleRadius * 2;
break;
case FIT_POD_CIRCLE:
diameter = (podRadius + MAX_RADIUS_INCREMENT_FACTOR) * 2;
break;
default:
diameter = (podRadius + MAX_RADIUS_INCREMENT_FACTOR) * 2;
}
float squareSideLengthBy2 = (getSquareSideLength(diameter) / 2);
mDrawable.setBounds(
(int) (cx - squareSideLengthBy2),
(int) (cy - squareSideLengthBy2),
(int) (cx + squareSideLengthBy2),
(int) (cy + squareSideLengthBy2)
);
mDrawable.draw(canvas);
}
}
}
private float getSquareSideLength(float radius) {
return (float) Math.sqrt(Math.pow(radius, 2) / 2);
}
public boolean doesCoOrdinatesLieInSelectRange(float x, float y) {
float range = podRadius * (7 / 3);
return x > cx - range && x < cx + range && y > cy - range && y < cy + range;
}
public boolean isSelected() {
return selected;
}
public void animatePod() {
if (!selected)
return;
radiusIncrementor = 0;
// handler.post(new Runnable() {
// @Override
// public void run() {
// if (radiusIncrementor >= MAX_RADIUS_INCREMENT_FACTOR) {
// handler.removeCallbacks(this);
// } else {
// float v = (MAX_RADIUS_INCREMENT_FACTOR - radiusIncrementor) /
// PodSlider.LARGE_CIRCLE_MOVE_TIME_IN_MS;
// radiusIncrementor += v * PodSlider.TIME_FOR_EACH_INCREMENT_IN_MS;
// handler.postDelayed(this, PodSlider.TIME_FOR_EACH_INCREMENT_IN_MS);
// parent.invalidate();
// }
// }
// });
ValueAnimator animator = ValueAnimator.ofFloat(radiusIncrementor, MAX_RADIUS_INCREMENT_FACTOR);
animator.setDuration(PodSlider.ANIMATION_DURATION);
animator.setInterpolator(new DecelerateInterpolator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
radiusIncrementor = (float) animation.getAnimatedValue();
int left = (int) (cx - podRadius);
int right = (int) (cx + podRadius);
int top = (int) (cy - podRadius);
int bottom = (int) (cy + podRadius);
parent.invalidate(left, top, right, bottom);
}
});
animator.start();
}
}
================================================
FILE: library/src/main/java/com/bhargavms/podslider/PodSlider.java
================================================
package com.bhargavms.podslider;
import android.animation.ValueAnimator;
import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Interpolator;
import java.lang.ref.WeakReference;
/**
* A view that looks like this http://codepen.io/chrisgannon/pen/mPoMxq
*/
public class PodSlider extends View {
public enum DrawableSize {
FIT_POD_CIRCLE, FIT_MEDIUM_CIRCLE, FIT_LARGE_CIRCLE
}
public static final int ANIMATION_DURATION = 600;
private int numberOfPods;
private Paint mainPaint;
private Pod[] pods;
private OnPodClickListener mPodClickListener;
private int currentlySelectedPod = -1;
private boolean firstDraw = true;
private ViewPager mViewPager;
private boolean isViewMeasured = false;
private int mainSliderColor;
private int podColor;
private int selectedPodColor;
private int mediumCircleColor;
private int largeCircleColor;
private Paint mediumCirclePaint;
private Paint largeCirclePaint;
private float touchStartX;
private float touchStartY;
float largeCircleRadius;
float mediumCircleRadius;
private float largeCircleCurrentCenterX;
private float mediumCircleCurrentCenterX;
private ValueAnimator largeCircleAnimator = null;
private ValueAnimator mediumCircleAnimator = null;
private Interpolator largeCircleInterpolator = null;
private Interpolator mediumCircleInterpolator = null;
private boolean usePageTitle = true;
@SuppressWarnings("FieldCanBeLocal")
private float podRadius;
private ValueAnimator.AnimatorUpdateListener largeCircleAnimatorListener =
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
updateLargeCircleCenterX(animation);
}
};
private ValueAnimator.AnimatorUpdateListener mediumCircleAnimatorListener =
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
updateMediumCircleCenterX(animation);
}
};
private Rect clipBounds;
public PodSlider(Context context) {
super(context);
}
public PodSlider(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public PodSlider(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs);
}
@TargetApi(21)
public PodSlider(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init(context, attrs);
}
public void setPodClickListener(OnPodClickListener listener) {
this.mPodClickListener = listener;
}
private void init(Context c, AttributeSet attrs) {
TypedArray a = c.getTheme().obtainStyledAttributes(attrs, R.styleable.PodSlider, 0, 0);
try {
int mainSliderColor = a.getColor(R.styleable.PodSlider_mainSliderColor, 0);
int numberOfPods = a.getInt(R.styleable.PodSlider_numberOfPods, 1);
int podColor = a.getColor(R.styleable.PodSlider_podColor, 0);
int selectedPodColor = a.getColor(R.styleable.PodSlider_selectedPodColor, Color.WHITE);
mediumCircleColor = a.getColor(R.styleable.PodSlider_mediumCircleColor, podColor);
largeCircleColor = a.getColor(R.styleable.PodSlider_largeCircleColor, mainSliderColor);
init(numberOfPods, podColor, mainSliderColor, selectedPodColor);
} finally {
a.recycle();
}
}
@Override
public void setBackgroundColor(int color) {
mainSliderColor = color;
this.mainPaint.setColor(color);
invalidate();
}
public void setNumberOfPods(int numberOfPods) {
this.numberOfPods = numberOfPods;
pods = new Pod[numberOfPods];
for (int i = 0; i < numberOfPods; i++) {
pods[i] = new Pod(mainSliderColor, podColor, selectedPodColor, this, i);
}
if (currentlySelectedPod != -1 && currentlySelectedPod < PodSlider.this.numberOfPods) {
setCurrentlySelectedPod(currentlySelectedPod);
} else {
setCurrentlySelectedPod(0);
}
if (!isViewMeasured) {
return;
}
requestLayout();
}
public void setPodTexts(String[] texts) {
if (texts.length < pods.length) {
throw new IllegalStateException("The length of the texts array must be same " +
"as the number of pods.");
}
for (int i = 0; i < pods.length; i++) {
pods[i].setCenterText(texts[i]);
}
invalidate();
}
public void setPodDrawables(Drawable[] drawables, DrawableSize size) {
if (drawables.length < pods.length)
throw new IllegalStateException("The length of the drawables array must be same " +
"as the number of pods.");
for (int i = 0; i < pods.length; i++) {
pods[i].setCenterDrawable(drawables[i], size);
}
invalidate();
}
private void init(final int numberOfPods, int podColor,
int mainSliderColor, int selectedPodColor) {
this.mainSliderColor = mainSliderColor;
this.podColor = podColor;
this.selectedPodColor = selectedPodColor;
clipBounds = new Rect();
mainPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mainPaint.setColor(mainSliderColor);
mainPaint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK);
mainPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mediumCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mediumCirclePaint.setColor(mediumCircleColor);
mediumCirclePaint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK);
mediumCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE);
largeCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
largeCirclePaint.setColor(largeCircleColor);
largeCirclePaint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK);
largeCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE);
setNumberOfPods(numberOfPods);
currentlySelectedPod = 0;
largeCircleInterpolator = new EaseOutElasticInterpolator(1.0f, 1.9f);
mediumCircleInterpolator = new EaseOutElasticInterpolator(1.0f, 1.3f);
}
/**
* Set the currently selected pod AND also animate the view.
*
* Please remember to use this only after
* the view has been rendered (i.e donot use this in onCreate()/onCreateView()
* this will cause the large and medium circle to be drawn at (0, height/2)
*
* @param currentlySelectedPod the position of pod you want to be selected.
*/
public void setCurrentlySelectedPodAndAnimate(int currentlySelectedPod) {
setCurrentlySelectedPod(currentlySelectedPod);
update(pods[currentlySelectedPod].getCenterX());
}
/**
* @param interpolator a custom interpolator to interpolate time for large circle animation
*/
@SuppressWarnings("unused")
public void setLargeCircleInterpolator(Interpolator interpolator) {
largeCircleInterpolator = interpolator;
}
/**
* @param interpolator a custom interpolator to interpolate time for medium circle animation.
*/
@SuppressWarnings("unused")
public void setMediumCircleInterpolator(Interpolator interpolator) {
this.mediumCircleInterpolator = interpolator;
}
public void setCurrentlySelectedPod(int currentlySelectedPod) {
this.currentlySelectedPod = currentlySelectedPod;
for (int i = 0; i < numberOfPods; i++) {
pods[i].setSelected(false);
}
pods[currentlySelectedPod].setSelected(true);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch (action) {
case MotionEvent.ACTION_DOWN:
touchStartX = event.getX();
touchStartY = event.getY();
return true;
case MotionEvent.ACTION_UP:
float endX = event.getX();
float endY = event.getY();
if (isAClick(touchStartX, endX, touchStartY, endY)) {
onClick(endX, endY);
}
return true;
default:
return false;
}
}
private void onClick(float x, float y) {
for (int i = 0; i < pods.length; i++) {
Pod pod = pods[i];
if (pod.doesCoOrdinatesLieInSelectRange(x, y)) {
setCurrentlySelectedPodAndAnimate(i);
// propagate click.
if (mPodClickListener != null)
this.mPodClickListener.onPodClick(i);
if (mViewPager != null)
mViewPager.setCurrentItem(i);
return;
}
}
}
private void moveMediumCircle(float toX) {
if (mediumCircleAnimator != null && mediumCircleAnimator.isRunning())
mediumCircleAnimator.cancel();
mediumCircleAnimator = ValueAnimator.ofFloat(mediumCircleCurrentCenterX, toX);
mediumCircleAnimator.setDuration(ANIMATION_DURATION);
mediumCircleAnimator.setInterpolator(mediumCircleInterpolator);
mediumCircleAnimator.addUpdateListener(mediumCircleAnimatorListener);
mediumCircleAnimator.start();
}
private void moveLargeCircle(float toX) {
if (largeCircleAnimator != null && largeCircleAnimator.isRunning())
largeCircleAnimator.cancel();
largeCircleAnimator = ValueAnimator.ofFloat(largeCircleCurrentCenterX, toX);
largeCircleAnimator.setDuration(ANIMATION_DURATION);
largeCircleAnimator.setInterpolator(largeCircleInterpolator);
largeCircleAnimator.addUpdateListener(largeCircleAnimatorListener);
largeCircleAnimator.start();
}
private void updateLargeCircleCenterX(ValueAnimator animator) {
largeCircleCurrentCenterX = (float) animator.getAnimatedValue();
invalidateOnlyRectIfPossible();
}
private void invalidateOnlyRectIfPossible() {
if (clipBounds != null && clipBounds.left != 0 &&
clipBounds.top != 0 && clipBounds.right != 0 && clipBounds.bottom != 0)
invalidate(clipBounds);
else
invalidate();
}
private void updateMediumCircleCenterX(ValueAnimator animator) {
mediumCircleCurrentCenterX = (float) animator.getAnimatedValue();
invalidateOnlyRectIfPossible();
}
private void update(float toX) {
pods[currentlySelectedPod].animatePod();
moveLargeCircle(toX);
moveMediumCircle(toX);
}
public void usePageTitles(boolean usePageTitle) {
this.usePageTitle = usePageTitle;
}
public void setUpWithViewPager(ViewPager pager) {
mViewPager = pager;
final PagerAdapter adapter = pager.getAdapter();
if (adapter == null) {
throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");
}
setNumberOfPods(adapter.getCount());
if (usePageTitle) {
for (int i = 0; i < pods.length; i++) {
String pageTitle = adapter.getPageTitle(i) != null ?
adapter.getPageTitle(i).toString() : null;
if (pageTitle != null)
pods[i].setCenterText(pageTitle);
}
}
pager.addOnPageChangeListener(new PodSliderOnPageChangeListener(this));
if (adapter.getCount() > 0) {
final int curItem = pager.getCurrentItem();
if (currentlySelectedPod != curItem) {
currentlySelectedPod = curItem;
}
}
}
//
// public Pod getPod(int position) {
// if (pods == null) {
// throw new IllegalStateException("You need to init the pods first by calling " +
// "setNumberOfPods() or setUpWithViewPager");
// }
// if (position >= pods.length || position <= 0) {
// throw new IndexOutOfBoundsException("Number of pods is " + pods.length
// + " passed position is " + position);
// }
// return pods[position];
// }
private boolean isAClick(float startX, float endX, float startY, float endY) {
float differenceX = Math.abs(startX - endX);
float differenceY = Math.abs(startY - endY);
return !(differenceX > 5f || differenceY > 5f);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.getClipBounds(clipBounds);
// make large circle diameter equal to the height of the canvas.
largeCircleRadius = Math.min((getHeight() - getPaddingTop() - getPaddingBottom()) / 2,
(getWidth() - getPaddingRight() - getPaddingLeft()) / 2);
mediumCircleRadius = largeCircleRadius / 1.5f;
podRadius = largeCircleRadius * 2 / 7;
float rectangleRight = clipBounds.right - getPaddingRight() - (largeCircleRadius / 5);
float rectangleLeft = clipBounds.left + getPaddingLeft() + (largeCircleRadius / 5);
float rectangleTop = getPaddingTop() + clipBounds.top + (largeCircleRadius / 5);
float rectangleBottom = clipBounds.bottom - getPaddingBottom() - (largeCircleRadius / 5);
drawRoundedRect(canvas, rectangleLeft, rectangleTop, rectangleRight, rectangleBottom);
float podCenterY = rectangleTop + ((rectangleBottom - rectangleTop) / 2);
if (numberOfPods == 1) {
// draw one at the center and be done.
float centerX = rectangleLeft + ((rectangleRight - rectangleLeft) / 2);
largeCircleCurrentCenterX = centerX;
mediumCircleCurrentCenterX = centerX;
Pod pod = pods[0];
pod.setCenter(centerX, podCenterY);
pod.setPodRadius(podRadius);
canvas.drawCircle(largeCircleCurrentCenterX, podCenterY, largeCircleRadius, largeCirclePaint);
canvas.drawCircle(mediumCircleCurrentCenterX, podCenterY, mediumCircleRadius, mediumCirclePaint);
pod.drawPod(canvas);
return;
}
// else you start calculation.
float startX = rectangleLeft + (rectangleBottom - rectangleTop) / 2;
float gapBetweenPodCenters = calculateGapBetweenPodCenters(rectangleLeft, rectangleRight,
rectangleTop, rectangleBottom);
if (firstDraw) {
firstDraw = false;
largeCircleCurrentCenterX = startX + currentlySelectedPod * gapBetweenPodCenters;
mediumCircleCurrentCenterX = startX + currentlySelectedPod * gapBetweenPodCenters;
}
canvas.drawCircle(largeCircleCurrentCenterX, podCenterY, largeCircleRadius, largeCirclePaint);
canvas.drawCircle(mediumCircleCurrentCenterX, podCenterY, mediumCircleRadius, mediumCirclePaint);
for (int i = 0, n = numberOfPods; i < n; i++) {
float podCenterX = startX + i * gapBetweenPodCenters;
Pod pod = pods[i];
pod.setPodRadius(podRadius);
pod.setCenter(podCenterX, podCenterY);
pod.drawPod(canvas);
}
}
private float calculateGapBetweenPodCenters(float left, float right, float top, float bottom) {
// The center of leftmost circle is at getHeight() / 2, getHeight() / 2 (by design)
// The center of rightmost circle is at getWidth() - getHeight /2, getHeight / 2 (by design)
// So the distance between these 2 points is the difference is their x-axis co ordinates
// as both have the same y-axis coordinate.
// Which is nothing but (getWidth() - getHeight / 2) - getHeight / 2
// which equal to getWidth() - 2 * getHeight / 2
// which is equal to getWidth() - getHeight()
float distanceBetweenTheCentersOfPodsAtTheEnd = (right - left) - (bottom - top);
// Now to determine the distance between the center of each pod
// I divide the distanceBetweenTheCentersOfPodsAtTheEnd by number of Pods -1
// because distance between one pod starts at the 0th position.
return distanceBetweenTheCentersOfPodsAtTheEnd / (numberOfPods - 1);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int width;
int height;
int desiredHeight = (int) (getContext().getResources().getDisplayMetrics().density * 30);
//Measure Height
if (heightMode == MeasureSpec.EXACTLY) {
//Must be this size
height = heightSize;
} else if (heightMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
height = Math.min(desiredHeight, heightSize);
} else {
//Be whatever you want
height = desiredHeight;
}
int desiredWidth = getDesiredWidth(height);
//Measure Width
if (widthMode == MeasureSpec.EXACTLY) {
//Must be this size
width = widthSize;
} else if (widthMode == MeasureSpec.AT_MOST) {
//Can't be bigger than...
width = Math.min(desiredWidth, widthSize);
} else {
//Be whatever you want
width = desiredWidth;
}
setMeasuredDimension(width, height);
isViewMeasured = true;
}
private int getDesiredWidth(int height) {
return height * numberOfPods;
}
private void drawRoundedRect(Canvas canvas, float left, float top, float right, float bottom) {
float radius = Math.min((bottom - top) / 2, (right - left) / 2);
canvas.drawCircle(left + radius, top + radius, radius, mainPaint);
canvas.drawCircle(right - radius, top + radius, radius, mainPaint);
canvas.drawRect(left + radius, top, right - radius, bottom, mainPaint);
}
public static class PodSliderOnPageChangeListener implements ViewPager.OnPageChangeListener {
private final WeakReference mPodSliderRef;
// private int mScrollState;
// private int mPendingSelection = -1;
public PodSliderOnPageChangeListener(PodSlider podSlider) {
mPodSliderRef = new WeakReference<>(podSlider);
}
@Override
public void onPageScrollStateChanged(int state) {
// mScrollState = state;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
// final PodSlider podSlider = mPodSliderRef.get();
// if (podSlider == null) {
// return;
// }
/*float currentX = podSlider.largeAndSmallCircleCurrentCenterX;
float differenceX;
if (position == podSlider.currentlySelectedPod) {
differenceX = podSlider.pods[position + 1].getCenterX() - currentX;
podSlider.largeAndSmallCircleCurrentCenterX += differenceX * positionOffset;
} else {
differenceX = podSlider.pods[position - 1].getCenterX() - currentX;
podSlider.largeAndSmallCircleCurrentCenterX -= differenceX * positionOffset;
}
podSlider.invalidate();*/
/*if (mPendingSelection == -1 ||
podSlider.pods[podSlider.currentlySelectedPod].getCenterX() !=
podSlider.pods[mPendingSelection].getCenterX()) {
float currentX = podSlider.largeAndSmallCircleCurrentCenterX;
float differenceX;
if (positionOffset > 0 || mPendingSelection == -1)
differenceX = podSlider.pods[position + 1].getCenterX() - currentX;
else
differenceX = podSlider.pods[mPendingSelection].getCenterX() - currentX;
podSlider.largeAndSmallCircleCurrentCenterX += differenceX * positionOffset;
podSlider.invalidate();
}
if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
if (mPendingSelection != -1) {
podSlider.currentlySelectedPod = mPendingSelection;
podSlider.pods[mPendingSelection].animatePod();
mPendingSelection = -1;
}
}*/
/*if (mPendingSelection != -1 && mScrollState == ViewPager.SCROLL_STATE_IDLE) {
podSlider.currentlySelectedPod = mPendingSelection;
podSlider.pods[mPendingSelection].animatePod();
}*/
}
@Override
public void onPageSelected(int position) {
PodSlider podSlider = mPodSliderRef.get();
if (podSlider != null) {
podSlider.setCurrentlySelectedPodAndAnimate(position);
}
}
}
}
================================================
FILE: library/src/main/res/drawable/ic_accessibility_black_24dp.xml
================================================
================================================
FILE: library/src/main/res/drawable/ic_account_circle_black_24dp.xml
================================================
================================================
FILE: library/src/main/res/drawable/ic_directions_car_black_24dp.xml
================================================
================================================
FILE: library/src/main/res/values/attrs.xml
================================================
================================================
FILE: library/src/main/res/values/strings.xml
================================================
PodSlider
================================================
FILE: library/src/test/java/com/bhargavms/podslider/ExampleUnitTest.java
================================================
package com.bhargavms.podslider;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* To work on unit tests, switch the Test Artifact in the Build Variants view.
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
================================================
FILE: readme.md
================================================
# PodSlider
----
[](https://android-arsenal.com/details/1/3836)
[](https://jitpack.io/bhargavms/PodSLider)
[](https://github.com/JStumpp/awesome-android)
#### Sample:


## A slider view.
> This project is an attempt to port the svg pod slider created by Chris Gannon to android.
> see [CodePen](http://codepen.io/chrisgannon/pen/mPoMxq)
#### version 1.2.0 Update:
- Major enhancements in how animations are done.
- Added a ease out elastic effect(a wobble effect just before the circles stop).
#### Gradle:
Add it to your project build.gradle with:
```gradle
allprojects {
repositories {
maven { url "https://jitpack.io" }
}
}
```
and to your module's build.gradle dependencies block add the dependency to the library:
> P.S Check Jitpack badge at the top of the readme for the latest version name.
```gradle
dependencies {
compile 'com.github.bhargavms:PodSLider:X.X.X'
}
```
## Usage
#### Xml Attributes
```xml
app:mainSliderColor="@color/mainPodSlider"
app:numberOfPods="2"
app:podColor="#4CAF50"
app:selectedPodColor="#fff"
```
#### Setting a click listener
```java
PodSlider podSlider = (PodSlider) findViewById(R.id.pod_slider);
podSlider.setPodClickListener(new OnPodClickListener() {
@Override
public void onPodClick(int position) {
Log.d("PodPosition", "position = " + position);
}
});
```
#### To set Currently selected Pod
```java
podSlider.setCurrentlySelectedPod(1);
// if you want to change selected pod and also animate
// then use the below method, But please remember to use this only after
// the view has been rendered (i.e donot use this in onCreate()/onCreateView()
// this will cause the large and medium circle to be drawn at (0, height/2)
podSlider.setcurrentlySelectedPodAndAnimate(1);
```
#### To set up with a ViewPager
> By default, the widget uses the String returned by the viewpager
> adapter's `getPageTitle(int)` method, to disable it just set
> `pager.usePageTitle(false)` as false, **before setting up with viewPager**
```java
ViewPager pager = (ViewPager) findViewById(R.id.pager);
PodSlider pagerSlider = (PodSlider) findViewById(R.id.pager_slider);
PodPagerAdapter adapter = new PodPagerAdapter(getSupportFragmentManager());
pager.setAdapter(adapter);
pagerSlider.setUpWithViewPager(pager);
```
#### To change the number of pods programatically
```java
podSlider.setNumberOfPods(4);
```
#### To set custom text
```
// Use this after setting number of pods and make sure the length of texts
// array is equal to or greater than `numberOfPods` that you set using `setNumberOfPods()`
podSlider.setPodTexts(new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"});
```
> (ideally use single character don't ever have texts with more than 1 char looks ugly)
#### To set Drawables
```
Drawable access = getResources().getDrawable(R.drawable.ic_accessibility_black_24dp);
Drawable account = getResources().getDrawable(R.drawable.ic_account_circle_black_24dp);
Drawable car = getResources().getDrawable(R.drawable.ic_directions_car_black_24dp);
// Use this after setting number of pods and make sure the length
// of drawables array is equal to or greater than `numberOfPods`
// that you set using `setNumberOfPods()`
podSlider.setPodDrawables(
new Drawable[]{
access, account, car,
access, account, car,
access, account, car,
access
}, PodSlider.DrawableSize.FIT_POD_CIRCLE
);
```
> I have not added (and do not plan to in the near future) support for passing in
> drawable resource Ids, loading the drawable from resource/creating it from bitmaps
> or whatever is left to you, if you want further customization on deciding the
> size of the drawable please open an issue, based on the amount of traction it receives
> I might decide to implement it.
### LICENSE: (Apache 2.0)
```
Copyright [2016] [Bhargav M S]
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.
```
================================================
FILE: sample/.gitignore
================================================
/build
================================================
FILE: sample/build.gradle
================================================
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.example.podslidersample"
minSdkVersion 16
targetSdkVersion 23
versionCode 1
versionName "1.1.3"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':library')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:support-v4:23.4.0'
}
================================================
FILE: sample/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /home/talview23/Android/Sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
================================================
FILE: sample/src/androidTest/java/com/example/podslidersample/ApplicationTest.java
================================================
package com.example.podslidersample;
import android.app.Application;
import android.test.ApplicationTestCase;
/**
* Testing Fundamentals
*/
public class ApplicationTest extends ApplicationTestCase {
public ApplicationTest() {
super(Application.class);
}
}
================================================
FILE: sample/src/main/AndroidManifest.xml
================================================
================================================
FILE: sample/src/main/java/com/example/podslidersample/BlankFragment.java
================================================
package com.example.podslidersample;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A simple {@link Fragment} subclass.
*/
public class BlankFragment extends Fragment {
public BlankFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_blank, container, false);
}
}
================================================
FILE: sample/src/main/java/com/example/podslidersample/BlankFragmentTwo.java
================================================
package com.example.podslidersample;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
* A simple {@link Fragment} subclass.
*/
public class BlankFragmentTwo extends Fragment {
public BlankFragmentTwo() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_blank_two, container, false);
}
}
================================================
FILE: sample/src/main/java/com/example/podslidersample/MainActivity.java
================================================
package com.example.podslidersample;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.bhargavms.podslider.OnPodClickListener;
import com.bhargavms.podslider.PodSlider;
public class MainActivity extends AppCompatActivity implements OnPodClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Drawable access = getResources().getDrawable(R.drawable.ic_accessibility_black_24dp);
final Drawable account = getResources().getDrawable(R.drawable.ic_account_circle_black_24dp);
final Drawable car = getResources().getDrawable(R.drawable.ic_directions_car_black_24dp);
final PodSlider podSlider = (PodSlider) findViewById(R.id.pod_slider);
assert podSlider != null;
podSlider.setPodClickListener(new OnPodClickListener() {
@Override
public void onPodClick(int position) {
Log.d("PodPosition", "position = " + position);
}
});
podSlider.setCurrentlySelectedPod(1);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
podSlider.setNumberOfPods(8);
}
}, 5000);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
podSlider.setPodTexts(new String[]{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"});
}
}, 10000);
// new Handler().postDelayed(new Runnable() {
// @Override
// public void run() {
// podSlider.setPodDrawables(
// new Drawable[]{
// access, account, car,
// access, account, car,
// access, account, car,
// access
// }, PodSlider.DrawableSize.FIT_POD_CIRCLE
// );
// }
// }, 15000);
// ViewPager pager = (ViewPager) findViewById(R.id.pager);
// PodSlider pagerSlider = (PodSlider) findViewById(R.id.pager_slider);
// PodPagerAdapter adapter = new PodPagerAdapter(getSupportFragmentManager());
// assert pager != null;
// pager.setAdapter(adapter);
// assert pagerSlider != null;
// pagerSlider.setUpWithViewPager(pager);
//// int accentColor = getResources().getColor(R.color.colorAccent);
// Drawable[] drawables = new Drawable[]{
// access, account, car
// };
// pagerSlider.setPodDrawables(drawables, PodSlider.DrawableSize.FIT_MEDIUM_CIRCLE);
}
@Override
public void onPodClick(int position) {
}
private class PodPagerAdapter extends FragmentStatePagerAdapter {
public PodPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return new BlankFragment();
}
@Override
public int getCount() {
return 3;
}
}
}
================================================
FILE: sample/src/main/java/com/example/podslidersample/PagerInteractionActivity.java
================================================
package com.example.podslidersample;
import android.graphics.Color;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.bhargavms.podslider.OnPodClickListener;
import com.bhargavms.podslider.PodSlider;
import java.util.ArrayList;
import java.util.List;
public class PagerInteractionActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pager_interaction);
ViewPager pager = (ViewPager) findViewById(R.id.pager);
final PodSlider pagerSlider = (PodSlider) findViewById(R.id.pager_slider);
List fragments = new ArrayList<>(2);
fragments.add(new BlankFragment());
fragments.add(new BlankFragmentTwo());
List titles = new ArrayList<>(2);
titles.add("A");
titles.add("B");
// final int[] colors = new int[]{
// Color.parseColor("#FFC169"),
// Color.parseColor("#F68C6F")
// };
assert pager != null;
pager.setAdapter(new PagerAdapter(getSupportFragmentManager(), fragments, titles));
assert pagerSlider != null;
pagerSlider.setUpWithViewPager(pager);
// pagerSlider.setPodClickListener(new OnPodClickListener() {
// @Override
// public void onPodClick(int position) {
// pagerSlider.setBackgroundColor(colors[position]);
// }
// });
}
private static class PagerAdapter extends FragmentStatePagerAdapter {
private List fragments;
private List titles;
public PagerAdapter(FragmentManager fm,
List fragments, List titles) {
super(fm);
this.fragments = fragments;
this.titles = titles;
}
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
}
}
================================================
FILE: sample/src/main/res/drawable/ic_android_black_24dp.xml
================================================
================================================
FILE: sample/src/main/res/drawable/ic_android_black_24dp1.xml
================================================
================================================
FILE: sample/src/main/res/drawable/ic_build_black_24dp.xml
================================================
================================================
FILE: sample/src/main/res/drawable/ic_weekend_black_24dp.xml
================================================
================================================
FILE: sample/src/main/res/layout/activity_main.xml
================================================
================================================
FILE: sample/src/main/res/layout/activity_pager_interaction.xml
================================================
================================================
FILE: sample/src/main/res/layout/fragment_blank.xml
================================================
================================================
FILE: sample/src/main/res/layout/fragment_blank_two.xml
================================================
================================================
FILE: sample/src/main/res/values/colors.xml
================================================
#3F51B5
#303F9F
#FF4081
#2E7D31
================================================
FILE: sample/src/main/res/values/dimens.xml
================================================
16dp
16dp
================================================
FILE: sample/src/main/res/values/strings.xml
================================================
PodSliderSample
Hello blank fragment
================================================
FILE: sample/src/main/res/values/styles.xml
================================================
================================================
FILE: sample/src/main/res/values-w820dp/dimens.xml
================================================
64dp
================================================
FILE: sample/src/test/java/com/example/podslidersample/ExampleUnitTest.java
================================================
package com.example.podslidersample;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* To work on unit tests, switch the Test Artifact in the Build Variants view.
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}
================================================
FILE: settings.gradle
================================================
include ':sample', ':library'