diff --git a/build.gradle b/build.gradle index 49166ee..745beef 100644 --- a/build.gradle +++ b/build.gradle @@ -1,21 +1,24 @@ // 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() + jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.2' - classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.10.+' + classpath 'com.android.tools.build:gradle:2.2.0' } } allprojects { repositories { - mavenCentral() + jcenter() } } + +task clean(type: Delete) { + delete rootProject.buildDir +} + +project.ext { + minSDKVersion = "9" +} \ No newline at end of file diff --git a/demo/build.gradle b/demo/build.gradle index de31b19..76b9831 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -1,16 +1,16 @@ -apply plugin: 'android-sdk-manager' + apply plugin: 'com.android.application' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 24 + buildToolsVersion "24.0.2" defaultConfig { - minSdkVersion 8 - targetSdkVersion 22 + minSdkVersion project.minSDKVersion + targetSdkVersion 24 versionCode 2 - versionName "1.0.1" + versionName "1.0.2" } buildTypes { release { @@ -22,7 +22,7 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':library') - compile 'com.android.support:appcompat-v7:22.+' + compile 'com.android.support:appcompat-v7:24.2.1' compile 'com.nineoldandroids:library:2.4.0' compile 'com.daimajia.androidanimations:library:1.0.3@aar' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 918e0f3..69ba861 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 +#Mon Sep 26 15:56:13 CAT 2016 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-2.14.1-all.zip diff --git a/library/build.gradle b/library/build.gradle index b2e8cc6..4e4a762 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -1,14 +1,14 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 22 - buildToolsVersion "22.0.1" + compileSdkVersion 24 + buildToolsVersion "24.0.2" defaultConfig { - minSdkVersion 8 - targetSdkVersion 22 - versionCode 15 - versionName "1.1.5" + minSdkVersion project.minSDKVersion + targetSdkVersion 24 + versionCode 16 + versionName "1.1.6" } buildTypes { release { @@ -16,15 +16,14 @@ android { } } lintOptions { - abortOnError false - } + abortOnError false + } } 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.android.support:appcompat-v7:24.2.1' + compile 'com.android.support:support-v4:24.2.1' compile 'com.squareup.picasso:picasso:2.5.2' - compile 'com.nineoldandroids:library:2.4.0' } apply from: './gradle-mvn-push.gradle' diff --git a/library/gradle-mvn-push.gradle b/library/gradle-mvn-push.gradle index 873d7b0..149c5f7 100644 --- a/library/gradle-mvn-push.gradle +++ b/library/gradle-mvn-push.gradle @@ -92,7 +92,7 @@ afterEvaluate { project -> sign configurations.archives } - task apklib(type: Zip){ + task apklib(type: Zip) { appendix = extension = 'apklib' from 'AndroidManifest.xml' @@ -109,7 +109,7 @@ afterEvaluate { project -> source = android.sourceSets.main.java.srcDirs classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) options.links("http://docs.oracle.com/javase/7/docs/api/"); - options.linksOffline "http://d.android.com/reference","${android.sdkDirectory}/docs/reference" + options.linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference" exclude '**/BuildConfig.java' exclude '**/R.java' failOnError = false diff --git a/library/gradle.properties b/library/gradle.properties index e912316..4d33d20 100644 --- a/library/gradle.properties +++ b/library/gradle.properties @@ -1,22 +1,17 @@ # Project-wide Gradle settings. - # IDE (e.g. Android Studio) users: # Settings specified in this file will override any Gradle settings # configured through the IDE. - # 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 - POM_NAME=AndroidImageSlider Library POM_ARTIFACT_ID=library POM_PACKAGING=aar diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index e6cc2e8..513fb6f 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ + \ No newline at end of file diff --git a/library/src/main/java/com/daimajia/slider/library/Animations/BaseAnimationInterface.java b/library/src/main/java/com/daimajia/slider/library/Animations/BaseAnimationInterface.java index c7df71a..ed1b23e 100644 --- a/library/src/main/java/com/daimajia/slider/library/Animations/BaseAnimationInterface.java +++ b/library/src/main/java/com/daimajia/slider/library/Animations/BaseAnimationInterface.java @@ -5,16 +5,16 @@ /** * This interface gives you chance to inject your own animation or do something when the * {@link com.daimajia.slider.library.Tricks.ViewPagerEx} animation (PagerTransformer) starts or ends. - * - * + *

+ *

* There are two items you have to know. The first item is the slider you are dragging. This item * I call it Current Item. The second is the slider that gonna to show. I call that Next Item. - * + *

* When you start to drag the slider in front of you, onPrepareCurrentItemLeaveScreen() and * onPrepareNextItemShowInScreen will be called. - * + *

* When you finish drag, the onCurrentItemDisappear and onNextItemAppear will be invoked. - * + *

* You can see a demo class {@link com.daimajia.slider.library.Animations.DescriptionAnimation}, * this class gives the description text an animation. */ @@ -22,24 +22,28 @@ public interface BaseAnimationInterface { /** * When the current item prepare to start leaving the screen. + * * @param current */ public void onPrepareCurrentItemLeaveScreen(View current); /** * The next item which will be shown in ViewPager/ + * * @param next */ public void onPrepareNextItemShowInScreen(View next); /** * Current item totally disappear from screen. + * * @param view */ public void onCurrentItemDisappear(View view); /** * Next item totally show in screen. + * * @param view */ public void onNextItemAppear(View view); diff --git a/library/src/main/java/com/daimajia/slider/library/Animations/DescriptionAnimation.java b/library/src/main/java/com/daimajia/slider/library/Animations/DescriptionAnimation.java index 6c03d99..29df46c 100644 --- a/library/src/main/java/com/daimajia/slider/library/Animations/DescriptionAnimation.java +++ b/library/src/main/java/com/daimajia/slider/library/Animations/DescriptionAnimation.java @@ -1,11 +1,10 @@ package com.daimajia.slider.library.Animations; +import android.animation.ObjectAnimator; +import android.animation.ValueAnimator; import android.view.View; import com.daimajia.slider.library.R; -import com.nineoldandroids.animation.ObjectAnimator; -import com.nineoldandroids.animation.ValueAnimator; -import com.nineoldandroids.view.ViewHelper; /** * A demo class to show how to use {@link com.daimajia.slider.library.Animations.BaseAnimationInterface} @@ -16,19 +15,20 @@ public class DescriptionAnimation implements BaseAnimationInterface { @Override public void onPrepareCurrentItemLeaveScreen(View current) { View descriptionLayout = current.findViewById(R.id.description_layout); - if(descriptionLayout!=null){ + if (descriptionLayout != null) { current.findViewById(R.id.description_layout).setVisibility(View.INVISIBLE); } } /** * When next item is coming to show, let's hide the description layout. + * * @param next */ @Override public void onPrepareNextItemShowInScreen(View next) { View descriptionLayout = next.findViewById(R.id.description_layout); - if(descriptionLayout!=null){ + if (descriptionLayout != null) { next.findViewById(R.id.description_layout).setVisibility(View.INVISIBLE); } } @@ -42,17 +42,18 @@ public void onCurrentItemDisappear(View view) { /** * When next item show in ViewPagerEx, let's make an animation to show the * description layout. + * * @param view */ @Override public void onNextItemAppear(View view) { View descriptionLayout = view.findViewById(R.id.description_layout); - if(descriptionLayout!=null){ - float layoutY = ViewHelper.getY(descriptionLayout); + if (descriptionLayout != null) { + float layoutY = View.Y.get(descriptionLayout); view.findViewById(R.id.description_layout).setVisibility(View.VISIBLE); ValueAnimator animator = ObjectAnimator.ofFloat( - descriptionLayout,"y",layoutY + descriptionLayout.getHeight(), + descriptionLayout, "y", layoutY + descriptionLayout.getHeight(), layoutY).setDuration(500); animator.start(); } diff --git a/library/src/main/java/com/daimajia/slider/library/Indicators/PagerIndicator.java b/library/src/main/java/com/daimajia/slider/library/Indicators/PagerIndicator.java index b10abee..d3e482d 100644 --- a/library/src/main/java/com/daimajia/slider/library/Indicators/PagerIndicator.java +++ b/library/src/main/java/com/daimajia/slider/library/Indicators/PagerIndicator.java @@ -22,7 +22,7 @@ /** * Pager Indicator. */ -public class PagerIndicator extends LinearLayout implements ViewPagerEx.OnPageChangeListener{ +public class PagerIndicator extends LinearLayout implements ViewPagerEx.OnPageChangeListener { private Context mContext; @@ -56,8 +56,8 @@ public class PagerIndicator extends LinearLayout implements ViewPagerEx.OnPageCh private Drawable mUnselectedDrawable; /** - *This value is from {@link com.daimajia.slider.library.SliderAdapter} getRealCount() represent - * + * This value is from {@link com.daimajia.slider.library.SliderAdapter} getRealCount() represent + *

* the indicator count that we should draw. */ private int mItemCount = 0; @@ -74,41 +74,69 @@ public class PagerIndicator extends LinearLayout implements ViewPagerEx.OnPageCh private float mDefaultUnSelectedWidth; private float mDefaultUnSelectedHeight; - - public enum IndicatorVisibility{ - Visible, - Invisible; - }; - private GradientDrawable mUnSelectedGradientDrawable; - private GradientDrawable mSelectedGradientDrawable; + ; + private GradientDrawable mSelectedGradientDrawable; private LayerDrawable mSelectedLayerDrawable; private LayerDrawable mUnSelectedLayerDrawable; - private float mPadding_left; private float mPadding_right; private float mPadding_top; private float mPadding_bottom; - private float mSelectedPadding_Left; private float mSelectedPadding_Right; private float mSelectedPadding_Top; private float mSelectedPadding_Bottom; - private float mUnSelectedPadding_Left; private float mUnSelectedPadding_Right; private float mUnSelectedPadding_Top; private float mUnSelectedPadding_Bottom; - /** * Put all the indicators into a ArrayList, so we can remove them easily. */ private ArrayList mIndicators = new ArrayList(); + private DataSetObserver dataChangeObserver = new DataSetObserver() { + @Override + public void onChanged() { + PagerAdapter adapter = mPager.getAdapter(); + int count = 0; + if (adapter instanceof InfinitePagerAdapter) { + count = ((InfinitePagerAdapter) adapter).getRealCount(); + } else { + count = adapter.getCount(); + } + if (count > mItemCount) { + for (int i = 0; i < count - mItemCount; i++) { + ImageView indicator = new ImageView(mContext); + indicator.setImageDrawable(mUnselectedDrawable); + indicator.setPadding((int) mUnSelectedPadding_Left, + (int) mUnSelectedPadding_Top, + (int) mUnSelectedPadding_Right, + (int) mUnSelectedPadding_Bottom); + addView(indicator); + mIndicators.add(indicator); + } + } else if (count < mItemCount) { + for (int i = 0; i < mItemCount - count; i++) { + removeView(mIndicators.get(0)); + mIndicators.remove(0); + } + } + mItemCount = count; + mPager.setCurrentItem(mItemCount * 20 + mPager.getCurrentItem()); + } + + @Override + public void onInvalidated() { + super.onInvalidated(); + redraw(); + } + }; public PagerIndicator(Context context) { - this(context,null); + this(context, null); } public PagerIndicator(Context context, AttributeSet attrs) { @@ -116,20 +144,20 @@ public PagerIndicator(Context context, AttributeSet attrs) { mContext = context; - final TypedArray attributes = context.obtainStyledAttributes(attrs,R.styleable.PagerIndicator,0,0); + final TypedArray attributes = context.obtainStyledAttributes(attrs, R.styleable.PagerIndicator, 0, 0); - int visibility = attributes.getInt(R.styleable.PagerIndicator_visibility,IndicatorVisibility.Visible.ordinal()); + int visibility = attributes.getInt(R.styleable.PagerIndicator_visibility, IndicatorVisibility.Visible.ordinal()); - for(IndicatorVisibility v : IndicatorVisibility.values()){ - if(v.ordinal() == visibility){ + for (IndicatorVisibility v : IndicatorVisibility.values()) { + if (v.ordinal() == visibility) { mVisibility = v; break; } } int shape = attributes.getInt(R.styleable.PagerIndicator_shape, Shape.Oval.ordinal()); - for(Shape s: Shape.values()){ - if(s.ordinal() == shape){ + for (Shape s : Shape.values()) { + if (s.ordinal() == shape) { mIndicatorShape = s; break; } @@ -141,89 +169,86 @@ public PagerIndicator(Context context, AttributeSet attrs) { 0); mDefaultSelectedColor = attributes.getColor(R.styleable.PagerIndicator_selected_color, Color.rgb(255, 255, 255)); - mDefaultUnSelectedColor = attributes.getColor(R.styleable.PagerIndicator_unselected_color, Color.argb(33,255,255,255)); + mDefaultUnSelectedColor = attributes.getColor(R.styleable.PagerIndicator_unselected_color, Color.argb(33, 255, 255, 255)); - mDefaultSelectedWidth = attributes.getDimension(R.styleable.PagerIndicator_selected_width,(int)pxFromDp(6)); - mDefaultSelectedHeight = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_height,(int)pxFromDp(6)); + mDefaultSelectedWidth = attributes.getDimension(R.styleable.PagerIndicator_selected_width, (int) pxFromDp(6)); + mDefaultSelectedHeight = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_height, (int) pxFromDp(6)); - mDefaultUnSelectedWidth = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_width,(int)pxFromDp(6)); - mDefaultUnSelectedHeight = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_height,(int)pxFromDp(6)); + mDefaultUnSelectedWidth = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_width, (int) pxFromDp(6)); + mDefaultUnSelectedHeight = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_height, (int) pxFromDp(6)); mSelectedGradientDrawable = new GradientDrawable(); mUnSelectedGradientDrawable = new GradientDrawable(); - mPadding_left = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_padding_left,(int)pxFromDp(3)); - mPadding_right = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_padding_right,(int)pxFromDp(3)); - mPadding_top = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_padding_top,(int)pxFromDp(0)); - mPadding_bottom = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_padding_bottom,(int)pxFromDp(0)); + mPadding_left = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_padding_left, (int) pxFromDp(3)); + mPadding_right = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_padding_right, (int) pxFromDp(3)); + mPadding_top = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_padding_top, (int) pxFromDp(0)); + mPadding_bottom = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_padding_bottom, (int) pxFromDp(0)); - mSelectedPadding_Left = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_padding_left,(int)mPadding_left); - mSelectedPadding_Right = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_padding_right,(int)mPadding_right); - mSelectedPadding_Top = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_padding_top,(int)mPadding_top); - mSelectedPadding_Bottom = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_padding_bottom,(int)mPadding_bottom); + mSelectedPadding_Left = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_padding_left, (int) mPadding_left); + mSelectedPadding_Right = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_padding_right, (int) mPadding_right); + mSelectedPadding_Top = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_padding_top, (int) mPadding_top); + mSelectedPadding_Bottom = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_selected_padding_bottom, (int) mPadding_bottom); - mUnSelectedPadding_Left = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_padding_left,(int)mPadding_left); - mUnSelectedPadding_Right = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_padding_right,(int)mPadding_right); - mUnSelectedPadding_Top = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_padding_top,(int)mPadding_top); - mUnSelectedPadding_Bottom = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_padding_bottom,(int)mPadding_bottom); + mUnSelectedPadding_Left = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_padding_left, (int) mPadding_left); + mUnSelectedPadding_Right = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_padding_right, (int) mPadding_right); + mUnSelectedPadding_Top = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_padding_top, (int) mPadding_top); + mUnSelectedPadding_Bottom = attributes.getDimensionPixelSize(R.styleable.PagerIndicator_unselected_padding_bottom, (int) mPadding_bottom); mSelectedLayerDrawable = new LayerDrawable(new Drawable[]{mSelectedGradientDrawable}); mUnSelectedLayerDrawable = new LayerDrawable(new Drawable[]{mUnSelectedGradientDrawable}); - setIndicatorStyleResource(mUserSetSelectedIndicatorResId,mUserSetUnSelectedIndicatorResId); + setIndicatorStyleResource(mUserSetSelectedIndicatorResId, mUserSetUnSelectedIndicatorResId); setDefaultIndicatorShape(mIndicatorShape); - setDefaultSelectedIndicatorSize(mDefaultSelectedWidth,mDefaultSelectedHeight,Unit.Px); - setDefaultUnselectedIndicatorSize(mDefaultUnSelectedWidth,mDefaultUnSelectedHeight,Unit.Px); + setDefaultSelectedIndicatorSize(mDefaultSelectedWidth, mDefaultSelectedHeight, Unit.Px); + setDefaultUnselectedIndicatorSize(mDefaultUnSelectedWidth, mDefaultUnSelectedHeight, Unit.Px); setDefaultIndicatorColor(mDefaultSelectedColor, mDefaultUnSelectedColor); setIndicatorVisibility(mVisibility); attributes.recycle(); } - public enum Shape{ - Oval,Rectangle - } - /** * if you are using the default indicator, this method will help you to set the shape of * indicator, there are two kind of shapes you can set, oval and rect. + * * @param shape */ - public void setDefaultIndicatorShape(Shape shape){ - if(mUserSetSelectedIndicatorResId == 0){ - if(shape == Shape.Oval){ + public void setDefaultIndicatorShape(Shape shape) { + if (mUserSetSelectedIndicatorResId == 0) { + if (shape == Shape.Oval) { mSelectedGradientDrawable.setShape(GradientDrawable.OVAL); - }else{ + } else { mSelectedGradientDrawable.setShape(GradientDrawable.RECTANGLE); } } - if(mUserSetUnSelectedIndicatorResId == 0){ - if(shape == Shape.Oval){ + if (mUserSetUnSelectedIndicatorResId == 0) { + if (shape == Shape.Oval) { mUnSelectedGradientDrawable.setShape(GradientDrawable.OVAL); - }else{ + } else { mUnSelectedGradientDrawable.setShape(GradientDrawable.RECTANGLE); } } resetDrawable(); } - /** * Set Indicator style. - * @param selected page selected drawable + * + * @param selected page selected drawable * @param unselected page unselected drawable */ - public void setIndicatorStyleResource(int selected, int unselected){ + public void setIndicatorStyleResource(int selected, int unselected) { mUserSetSelectedIndicatorResId = selected; mUserSetUnSelectedIndicatorResId = unselected; - if(selected == 0){ + if (selected == 0) { mSelectedDrawable = mSelectedLayerDrawable; - }else{ + } else { mSelectedDrawable = mContext.getResources().getDrawable(mUserSetSelectedIndicatorResId); } - if(unselected == 0){ + if (unselected == 0) { mUnselectedDrawable = mUnSelectedLayerDrawable; - }else{ + } else { mUnselectedDrawable = mContext.getResources().getDrawable(mUserSetUnSelectedIndicatorResId); } @@ -233,28 +258,25 @@ public void setIndicatorStyleResource(int selected, int unselected){ /** * if you are using the default indicator , this method will help you to set the selected status and * the unselected status color. + * * @param selectedColor * @param unselectedColor */ - public void setDefaultIndicatorColor(int selectedColor,int unselectedColor){ - if(mUserSetSelectedIndicatorResId == 0){ + public void setDefaultIndicatorColor(int selectedColor, int unselectedColor) { + if (mUserSetSelectedIndicatorResId == 0) { mSelectedGradientDrawable.setColor(selectedColor); } - if(mUserSetUnSelectedIndicatorResId == 0){ + if (mUserSetUnSelectedIndicatorResId == 0) { mUnSelectedGradientDrawable.setColor(unselectedColor); } resetDrawable(); } - public enum Unit{ - DP,Px - } - - public void setDefaultSelectedIndicatorSize(float width,float height,Unit unit){ - if(mUserSetSelectedIndicatorResId == 0){ + public void setDefaultSelectedIndicatorSize(float width, float height, Unit unit) { + if (mUserSetSelectedIndicatorResId == 0) { float w = width; float h = height; - if(unit == Unit.DP){ + if (unit == Unit.DP) { w = pxFromDp(width); h = pxFromDp(height); } @@ -263,11 +285,11 @@ public void setDefaultSelectedIndicatorSize(float width,float height,Unit unit){ } } - public void setDefaultUnselectedIndicatorSize(float width,float height,Unit unit){ - if(mUserSetUnSelectedIndicatorResId == 0){ + public void setDefaultUnselectedIndicatorSize(float width, float height, Unit unit) { + if (mUserSetUnSelectedIndicatorResId == 0) { float w = width; float h = height; - if(unit == Unit.DP){ + if (unit == Unit.DP) { w = pxFromDp(width); h = pxFromDp(height); } @@ -276,44 +298,29 @@ public void setDefaultUnselectedIndicatorSize(float width,float height,Unit unit } } - public void setDefaultIndicatorSize(float width, float height, Unit unit){ - setDefaultSelectedIndicatorSize(width,height,unit); - setDefaultUnselectedIndicatorSize(width,height,unit); + public void setDefaultIndicatorSize(float width, float height, Unit unit) { + setDefaultSelectedIndicatorSize(width, height, unit); + setDefaultUnselectedIndicatorSize(width, height, unit); } - private float dpFromPx(float px) - { + private float dpFromPx(float px) { return px / this.getContext().getResources().getDisplayMetrics().density; } - private float pxFromDp(float dp) - { + private float pxFromDp(float dp) { return dp * this.getContext().getResources().getDisplayMetrics().density; } - /** - * set the visibility of indicator. - * @param visibility - */ - public void setIndicatorVisibility(IndicatorVisibility visibility){ - if(visibility == IndicatorVisibility.Visible){ - setVisibility(View.VISIBLE); - }else{ - setVisibility(View.INVISIBLE); - } - resetDrawable(); - } - /** * clear self means unregister the dataset observer and remove all the child views(indicators). */ - public void destroySelf(){ - if(mPager == null || mPager.getAdapter() == null){ + public void destroySelf() { + if (mPager == null || mPager.getAdapter() == null) { return; } - InfinitePagerAdapter wrapper = (InfinitePagerAdapter)mPager.getAdapter(); + InfinitePagerAdapter wrapper = (InfinitePagerAdapter) mPager.getAdapter(); PagerAdapter adapter = wrapper.getRealAdapter(); - if(adapter!=null){ + if (adapter != null) { adapter.unregisterDataSetObserver(dataChangeObserver); } removeAllViews(); @@ -321,25 +328,24 @@ public void destroySelf(){ /** * bind indicator with viewpagerEx. + * * @param pager */ - public void setViewPager(ViewPagerEx pager){ - if(pager.getAdapter() == null){ + public void setViewPager(ViewPagerEx pager) { + if (pager.getAdapter() == null) { throw new IllegalStateException("Viewpager does not have adapter instance"); } mPager = pager; mPager.addOnPageChangeListener(this); - ((InfinitePagerAdapter)mPager.getAdapter()).getRealAdapter().registerDataSetObserver(dataChangeObserver); + ((InfinitePagerAdapter) mPager.getAdapter()).getRealAdapter().registerDataSetObserver(dataChangeObserver); } - - private void resetDrawable(){ - for(View i : mIndicators){ - if(mPreviousSelectedIndicator!= null && mPreviousSelectedIndicator.equals(i)){ - ((ImageView)i).setImageDrawable(mSelectedDrawable); - } - else{ - ((ImageView)i).setImageDrawable(mUnselectedDrawable); + private void resetDrawable() { + for (View i : mIndicators) { + if (mPreviousSelectedIndicator != null && mPreviousSelectedIndicator.equals(i)) { + ((ImageView) i).setImageDrawable(mSelectedDrawable); + } else { + ((ImageView) i).setImageDrawable(mUnselectedDrawable); } } } @@ -347,21 +353,21 @@ private void resetDrawable(){ /** * redraw the indicators. */ - public void redraw(){ + public void redraw() { mItemCount = getShouldDrawCount(); mPreviousSelectedIndicator = null; - for(View i:mIndicators){ + for (View i : mIndicators) { removeView(i); } - for(int i =0 ;i< mItemCount; i++){ + for (int i = 0; i < mItemCount; i++) { ImageView indicator = new ImageView(mContext); indicator.setImageDrawable(mUnselectedDrawable); - indicator.setPadding((int)mUnSelectedPadding_Left, - (int)mUnSelectedPadding_Top, - (int)mUnSelectedPadding_Right, - (int)mUnSelectedPadding_Bottom); + indicator.setPadding((int) mUnSelectedPadding_Left, + (int) mUnSelectedPadding_Top, + (int) mUnSelectedPadding_Right, + (int) mUnSelectedPadding_Bottom); addView(indicator); mIndicators.add(indicator); } @@ -370,72 +376,35 @@ public void redraw(){ /** * since we used a adapter wrapper, so we can't getCount directly from wrapper. + * * @return */ - private int getShouldDrawCount(){ - if(mPager.getAdapter() instanceof InfinitePagerAdapter){ - return ((InfinitePagerAdapter)mPager.getAdapter()).getRealCount(); - }else{ + private int getShouldDrawCount() { + if (mPager.getAdapter() instanceof InfinitePagerAdapter) { + return ((InfinitePagerAdapter) mPager.getAdapter()).getRealCount(); + } else { return mPager.getAdapter().getCount(); } } - private DataSetObserver dataChangeObserver = new DataSetObserver() { - @Override - public void onChanged() { - PagerAdapter adapter = mPager.getAdapter(); - int count = 0; - if(adapter instanceof InfinitePagerAdapter){ - count = ((InfinitePagerAdapter)adapter).getRealCount(); - }else{ - count = adapter.getCount(); - } - if(count > mItemCount){ - for(int i =0 ; i< count - mItemCount;i++){ - ImageView indicator = new ImageView(mContext); - indicator.setImageDrawable(mUnselectedDrawable); - indicator.setPadding((int)mUnSelectedPadding_Left, - (int)mUnSelectedPadding_Top, - (int)mUnSelectedPadding_Right, - (int)mUnSelectedPadding_Bottom); - addView(indicator); - mIndicators.add(indicator); - } - }else if(count < mItemCount){ - for(int i = 0; i < mItemCount - count;i++){ - removeView(mIndicators.get(0)); - mIndicators.remove(0); - } - } - mItemCount = count; - mPager.setCurrentItem(mItemCount*20 + mPager.getCurrentItem()); - } - - @Override - public void onInvalidated() { - super.onInvalidated(); - redraw(); - } - }; - - private void setItemAsSelected(int position){ - if(mPreviousSelectedIndicator != null){ + private void setItemAsSelected(int position) { + if (mPreviousSelectedIndicator != null) { mPreviousSelectedIndicator.setImageDrawable(mUnselectedDrawable); mPreviousSelectedIndicator.setPadding( - (int)mUnSelectedPadding_Left, - (int)mUnSelectedPadding_Top, - (int)mUnSelectedPadding_Right, - (int)mUnSelectedPadding_Bottom + (int) mUnSelectedPadding_Left, + (int) mUnSelectedPadding_Top, + (int) mUnSelectedPadding_Right, + (int) mUnSelectedPadding_Bottom ); } - ImageView currentSelected = (ImageView)getChildAt(position + 1); - if(currentSelected != null){ + ImageView currentSelected = (ImageView) getChildAt(position + 1); + if (currentSelected != null) { currentSelected.setImageDrawable(mSelectedDrawable); currentSelected.setPadding( - (int)mSelectedPadding_Left, - (int)mSelectedPadding_Top, - (int)mSelectedPadding_Right, - (int)mSelectedPadding_Bottom + (int) mSelectedPadding_Left, + (int) mSelectedPadding_Top, + (int) mSelectedPadding_Right, + (int) mSelectedPadding_Bottom ); mPreviousSelectedIndicator = currentSelected; } @@ -446,27 +415,55 @@ private void setItemAsSelected(int position){ public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } - public IndicatorVisibility getIndicatorVisibility(){ + public IndicatorVisibility getIndicatorVisibility() { return mVisibility; } + /** + * set the visibility of indicator. + * + * @param visibility + */ + public void setIndicatorVisibility(IndicatorVisibility visibility) { + if (visibility == IndicatorVisibility.Visible) { + setVisibility(View.VISIBLE); + } else { + setVisibility(View.INVISIBLE); + } + resetDrawable(); + } + @Override public void onPageSelected(int position) { - if(mItemCount == 0){ + if (mItemCount == 0) { return; } - setItemAsSelected(position-1); + setItemAsSelected(position - 1); } + @Override public void onPageScrollStateChanged(int state) { } - public int getSelectedIndicatorResId(){ + public int getSelectedIndicatorResId() { return mUserSetSelectedIndicatorResId; } - public int getUnSelectedIndicatorResId(){ + public int getUnSelectedIndicatorResId() { return mUserSetUnSelectedIndicatorResId; } + public enum IndicatorVisibility { + Visible, + Invisible; + } + + public enum Shape { + Oval, Rectangle + } + + public enum Unit { + DP, Px + } + } diff --git a/library/src/main/java/com/daimajia/slider/library/SliderAdapter.java b/library/src/main/java/com/daimajia/slider/library/SliderAdapter.java index bc0a90a..bf8bc85 100644 --- a/library/src/main/java/com/daimajia/slider/library/SliderAdapter.java +++ b/library/src/main/java/com/daimajia/slider/library/SliderAdapter.java @@ -12,26 +12,26 @@ /** * A slider adapter */ -public class SliderAdapter extends PagerAdapter implements BaseSliderView.ImageLoadListener{ +public class SliderAdapter extends PagerAdapter implements BaseSliderView.ImageLoadListener { private Context mContext; private ArrayList mImageContents; - public SliderAdapter(Context context){ + public SliderAdapter(Context context) { mContext = context; mImageContents = new ArrayList(); } - public void addSlider(T slider){ + public void addSlider(T slider) { slider.setOnImageLoadListener(this); mImageContents.add(slider); notifyDataSetChanged(); } - public BaseSliderView getSliderView(int position){ - if(position < 0 || position >= mImageContents.size()){ + public BaseSliderView getSliderView(int position) { + if (position < 0 || position >= mImageContents.size()) { return null; - }else{ + } else { return mImageContents.get(position); } } @@ -41,21 +41,21 @@ public int getItemPosition(Object object) { return POSITION_NONE; } - public void removeSlider(T slider){ - if(mImageContents.contains(slider)){ + public void removeSlider(T slider) { + if (mImageContents.contains(slider)) { mImageContents.remove(slider); notifyDataSetChanged(); } } - public void removeSliderAt(int position){ - if(mImageContents.size() > position){ + public void removeSliderAt(int position) { + if (mImageContents.size() > position) { mImageContents.remove(position); notifyDataSetChanged(); } } - public void removeAllSliders(){ + public void removeAllSliders() { mImageContents.clear(); notifyDataSetChanged(); } @@ -67,7 +67,7 @@ public int getCount() { @Override public boolean isViewFromObject(View view, Object object) { - return view==object; + return view == object; } @Override @@ -90,16 +90,17 @@ public void onStart(BaseSliderView target) { /** * When image download error, then remove. + * * @param result * @param target */ @Override public void onEnd(boolean result, BaseSliderView target) { - if(target.isErrorDisappear() == false || result == true){ + if (target.isErrorDisappear() == false || result == true) { return; } - for (BaseSliderView slider: mImageContents){ - if(slider.equals(target)){ + for (BaseSliderView slider : mImageContents) { + if (slider.equals(target)) { removeSlider(target); break; } diff --git a/library/src/main/java/com/daimajia/slider/library/SliderLayout.java b/library/src/main/java/com/daimajia/slider/library/SliderLayout.java index ba36e5e..c7e2f1d 100644 --- a/library/src/main/java/com/daimajia/slider/library/SliderLayout.java +++ b/library/src/main/java/com/daimajia/slider/library/SliderLayout.java @@ -43,48 +43,46 @@ /** * SliderLayout is compound layout. This is combined with {@link com.daimajia.slider.library.Indicators.PagerIndicator} * and {@link com.daimajia.slider.library.Tricks.ViewPagerEx} . - * + *

* There is some properties you can set in XML: - * + *

* indicator_visibility - * visible - * invisible - * + * visible + * invisible + *

* indicator_shape - * oval - * rect - * + * oval + * rect + *

* indicator_selected_color - * + *

* indicator_unselected_color - * + *

* indicator_selected_drawable - * + *

* indicator_unselected_drawable - * + *

* pager_animation - * Default - * Accordion - * Background2Foreground - * CubeIn - * DepthPage - * Fade - * FlipHorizontal - * FlipPage - * Foreground2Background - * RotateDown - * RotateUp - * Stack - * Tablet - * ZoomIn - * ZoomOutSlide - * ZoomOut - * + * Default + * Accordion + * Background2Foreground + * CubeIn + * DepthPage + * Fade + * FlipHorizontal + * FlipPage + * Foreground2Background + * RotateDown + * RotateUp + * Stack + * Tablet + * ZoomIn + * ZoomOutSlide + * ZoomOut + *

* pager_animation_span - * - * */ -public class SliderLayout extends RelativeLayout{ +public class SliderLayout extends RelativeLayout { private Context mContext; /** @@ -153,17 +151,24 @@ public class SliderLayout extends RelativeLayout{ * @see com.daimajia.slider.library.Animations.BaseAnimationInterface */ private BaseAnimationInterface mCustomAnimation; + private android.os.Handler mh = new android.os.Handler() { + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + moveNextPosition(true); + } + }; /** * {@link com.daimajia.slider.library.Indicators.PagerIndicator} shape, rect or oval. */ public SliderLayout(Context context) { - this(context,null); + this(context, null); } public SliderLayout(Context context, AttributeSet attrs) { - this(context,attrs,R.attr.SliderStyle); + this(context, attrs, R.attr.SliderStyle); } public SliderLayout(Context context, AttributeSet attrs, int defStyle) { @@ -171,15 +176,15 @@ public SliderLayout(Context context, AttributeSet attrs, int defStyle) { mContext = context; LayoutInflater.from(context).inflate(R.layout.slider_layout, this, true); - final TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs,R.styleable.SliderLayout, - defStyle,0); + final TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SliderLayout, + defStyle, 0); mTransformerSpan = attributes.getInteger(R.styleable.SliderLayout_pager_animation_span, 1100); mTransformerId = attributes.getInt(R.styleable.SliderLayout_pager_animation, Transformer.Default.ordinal()); - mAutoCycle = attributes.getBoolean(R.styleable.SliderLayout_auto_cycle,true); - int visibility = attributes.getInt(R.styleable.SliderLayout_indicator_visibility,0); - for(PagerIndicator.IndicatorVisibility v: PagerIndicator.IndicatorVisibility.values()){ - if(v.ordinal() == visibility){ + mAutoCycle = attributes.getBoolean(R.styleable.SliderLayout_auto_cycle, true); + int visibility = attributes.getInt(R.styleable.SliderLayout_indicator_visibility, 0); + for (PagerIndicator.IndicatorVisibility v : PagerIndicator.IndicatorVisibility.values()) { + if (v.ordinal() == visibility) { mIndicatorVisibility = v; break; } @@ -187,7 +192,7 @@ public SliderLayout(Context context, AttributeSet attrs, int defStyle) { mSliderAdapter = new SliderAdapter(mContext); PagerAdapter wrappedAdapter = new InfinitePagerAdapter(mSliderAdapter); - mViewPager = (InfiniteViewPager)findViewById(R.id.daimajia_slider_viewpager); + mViewPager = (InfiniteViewPager) findViewById(R.id.daimajia_slider_viewpager); mViewPager.setAdapter(wrappedAdapter); mViewPager.setOnTouchListener(new OnTouchListener() { @@ -195,7 +200,7 @@ public SliderLayout(Context context, AttributeSet attrs, int defStyle) { public boolean onTouch(View v, MotionEvent event) { int action = event.getAction(); switch (action) { - case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_UP: recoverCycle(); break; } @@ -206,15 +211,15 @@ public boolean onTouch(View v, MotionEvent event) { attributes.recycle(); setPresetIndicator(PresetIndicators.Center_Bottom); setPresetTransformer(mTransformerId); - setSliderTransformDuration(mTransformerSpan,null); + setSliderTransformDuration(mTransformerSpan, null); setIndicatorVisibility(mIndicatorVisibility); - if(mAutoCycle){ + if (mAutoCycle) { startAutoCycle(); } } - public void addOnPageChangeListener(ViewPagerEx.OnPageChangeListener onPageChangeListener){ - if(onPageChangeListener != null){ + public void addOnPageChangeListener(ViewPagerEx.OnPageChangeListener onPageChangeListener) { + if (onPageChangeListener != null) { mViewPager.addOnPageChangeListener(onPageChangeListener); } } @@ -223,8 +228,8 @@ public void removeOnPageChangeListener(ViewPagerEx.OnPageChangeListener onPageCh mViewPager.removeOnPageChangeListener(onPageChangeListener); } - public void setCustomIndicator(PagerIndicator indicator){ - if(mIndicator != null){ + public void setCustomIndicator(PagerIndicator indicator) { + if (mIndicator != null) { mIndicator.destroySelf(); } mIndicator = indicator; @@ -233,33 +238,26 @@ public void setCustomIndicator(PagerIndicator indicator){ mIndicator.redraw(); } - public void addSlider(T imageContent){ + public void addSlider(T imageContent) { mSliderAdapter.addSlider(imageContent); } - private android.os.Handler mh = new android.os.Handler(){ - @Override - public void handleMessage(Message msg) { - super.handleMessage(msg); - moveNextPosition(true); - } - }; - - public void startAutoCycle(){ + public void startAutoCycle() { startAutoCycle(mSliderDuration, mSliderDuration, mAutoRecover); } /** * start auto cycle. - * @param delay delay time - * @param duration animation duration time. + * + * @param delay delay time + * @param duration animation duration time. * @param autoRecover if recover after user touches the slider. */ - public void startAutoCycle(long delay,long duration,boolean autoRecover){ - if(mCycleTimer != null) mCycleTimer.cancel(); - if(mCycleTask != null) mCycleTask.cancel(); - if(mResumingTask != null) mResumingTask.cancel(); - if(mResumingTimer != null) mResumingTimer.cancel(); + public void startAutoCycle(long delay, long duration, boolean autoRecover) { + if (mCycleTimer != null) mCycleTimer.cancel(); + if (mCycleTask != null) mCycleTask.cancel(); + if (mResumingTask != null) mResumingTask.cancel(); + if (mResumingTimer != null) mResumingTimer.cancel(); mSliderDuration = duration; mCycleTimer = new Timer(); mAutoRecover = autoRecover; @@ -269,7 +267,7 @@ public void run() { mh.sendEmptyMessage(0); } }; - mCycleTimer.schedule(mCycleTask,delay,mSliderDuration); + mCycleTimer.schedule(mCycleTask, delay, mSliderDuration); mCycling = true; mAutoCycle = true; } @@ -277,13 +275,13 @@ public void run() { /** * pause auto cycle. */ - private void pauseAutoCycle(){ - if(mCycling){ + private void pauseAutoCycle() { + if (mCycling) { mCycleTimer.cancel(); mCycleTask.cancel(); mCycling = false; - }else{ - if(mResumingTimer != null && mResumingTask != null){ + } else { + if (mResumingTimer != null && mResumingTask != null) { recoverCycle(); } } @@ -291,12 +289,13 @@ private void pauseAutoCycle(){ /** * set the duration between two slider changes. the duration value must >= 500 + * * @param duration */ - public void setDuration(long duration){ - if(duration >= 500){ + public void setDuration(long duration) { + if (duration >= 500) { mSliderDuration = duration; - if(mAutoCycle && mCycling){ + if (mAutoCycle && mCycling) { startAutoCycle(); } } @@ -305,17 +304,17 @@ public void setDuration(long duration){ /** * stop the auto circle */ - public void stopAutoCycle(){ - if(mCycleTask!=null){ + public void stopAutoCycle() { + if (mCycleTask != null) { mCycleTask.cancel(); } - if(mCycleTimer!= null){ + if (mCycleTimer != null) { mCycleTimer.cancel(); } - if(mResumingTimer!= null){ + if (mResumingTimer != null) { mResumingTimer.cancel(); } - if(mResumingTask!=null){ + if (mResumingTask != null) { mResumingTask.cancel(); } mAutoCycle = false; @@ -325,13 +324,13 @@ public void stopAutoCycle(){ /** * when paused cycle, this method can weak it up. */ - private void recoverCycle(){ - if(!mAutoRecover || !mAutoCycle){ + private void recoverCycle() { + if (!mAutoRecover || !mAutoCycle) { return; } - if(!mCycling){ - if(mResumingTask != null && mResumingTimer!= null){ + if (!mCycling) { + if (mResumingTask != null && mResumingTimer != null) { mResumingTimer.cancel(); mResumingTask.cancel(); } @@ -347,7 +346,6 @@ public void run() { } - @Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); @@ -361,88 +359,58 @@ public boolean onInterceptTouchEvent(MotionEvent ev) { /** * set ViewPager transformer. + * * @param reverseDrawingOrder * @param transformer */ - public void setPagerTransformer(boolean reverseDrawingOrder,BaseTransformer transformer){ + public void setPagerTransformer(boolean reverseDrawingOrder, BaseTransformer transformer) { mViewPagerTransformer = transformer; mViewPagerTransformer.setCustomAnimationInterface(mCustomAnimation); - mViewPager.setPageTransformer(reverseDrawingOrder,mViewPagerTransformer); + mViewPager.setPageTransformer(reverseDrawingOrder, mViewPagerTransformer); } - /** * set the duration between two slider changes. + * * @param period * @param interpolator */ - public void setSliderTransformDuration(int period,Interpolator interpolator){ - try{ + public void setSliderTransformDuration(int period, Interpolator interpolator) { + try { Field mScroller = ViewPagerEx.class.getDeclaredField("mScroller"); mScroller.setAccessible(true); - FixedSpeedScroller scroller = new FixedSpeedScroller(mViewPager.getContext(),interpolator, period); - mScroller.set(mViewPager,scroller); - }catch (Exception e){ + FixedSpeedScroller scroller = new FixedSpeedScroller(mViewPager.getContext(), interpolator, period); + mScroller.set(mViewPager, scroller); + } catch (Exception e) { } } - /** - * preset transformers and their names - */ - public enum Transformer{ - Default("Default"), - Accordion("Accordion"), - Background2Foreground("Background2Foreground"), - CubeIn("CubeIn"), - DepthPage("DepthPage"), - Fade("Fade"), - FlipHorizontal("FlipHorizontal"), - FlipPage("FlipPage"), - Foreground2Background("Foreground2Background"), - RotateDown("RotateDown"), - RotateUp("RotateUp"), - Stack("Stack"), - Tablet("Tablet"), - ZoomIn("ZoomIn"), - ZoomOutSlide("ZoomOutSlide"), - ZoomOut("ZoomOut"); - - private final String name; - - private Transformer(String s){ - name = s; - } - public String toString(){ - return name; - } - - public boolean equals(String other){ - return (other == null)? false:name.equals(other); - } - }; - /** * set a preset viewpager transformer by id. + * * @param transformerId */ - public void setPresetTransformer(int transformerId){ - for(Transformer t : Transformer.values()){ - if(t.ordinal() == transformerId){ + public void setPresetTransformer(int transformerId) { + for (Transformer t : Transformer.values()) { + if (t.ordinal() == transformerId) { setPresetTransformer(t); break; } } } + ; + /** * set preset PagerTransformer via the name of transforemer. + * * @param transformerName */ - public void setPresetTransformer(String transformerName){ - for(Transformer t : Transformer.values()){ - if(t.equals(transformerName)){ + public void setPresetTransformer(String transformerName) { + for (Transformer t : Transformer.values()) { + if (t.equals(transformerName)) { setPresetTransformer(t); return; } @@ -453,11 +421,12 @@ public void setPresetTransformer(String transformerName){ * Inject your custom animation into PageTransformer, you can know more details in * {@link com.daimajia.slider.library.Animations.BaseAnimationInterface}, * and you can see a example in {@link com.daimajia.slider.library.Animations.DescriptionAnimation} + * * @param animation */ - public void setCustomAnimation(BaseAnimationInterface animation){ + public void setCustomAnimation(BaseAnimationInterface animation) { mCustomAnimation = animation; - if(mViewPagerTransformer != null){ + if (mViewPagerTransformer != null) { mViewPagerTransformer.setCustomAnimationInterface(mCustomAnimation); } } @@ -467,12 +436,12 @@ public void setCustomAnimation(BaseAnimationInterface animation){ * * @param ts */ - public void setPresetTransformer(Transformer ts){ + public void setPresetTransformer(Transformer ts) { // // special thanks to https://github.com/ToxicBakery/ViewPagerTransforms // BaseTransformer t = null; - switch (ts){ + switch (ts) { case Default: t = new DefaultTransformer(); break; @@ -522,143 +491,127 @@ public void setPresetTransformer(Transformer ts){ t = new ZoomOutTransformer(); break; } - setPagerTransformer(true,t); + setPagerTransformer(true, t); } + public PagerIndicator.IndicatorVisibility getIndicatorVisibility() { + if (mIndicator == null) { + return mIndicator.getIndicatorVisibility(); + } + return PagerIndicator.IndicatorVisibility.Invisible; + } /** * Set the visibility of the indicators. + * * @param visibility */ - public void setIndicatorVisibility(PagerIndicator.IndicatorVisibility visibility){ - if(mIndicator == null){ + public void setIndicatorVisibility(PagerIndicator.IndicatorVisibility visibility) { + if (mIndicator == null) { return; } mIndicator.setIndicatorVisibility(visibility); } - public PagerIndicator.IndicatorVisibility getIndicatorVisibility(){ - if(mIndicator == null){ - return mIndicator.getIndicatorVisibility(); - } - return PagerIndicator.IndicatorVisibility.Invisible; - - } - /** * get the {@link com.daimajia.slider.library.Indicators.PagerIndicator} instance. * You can manipulate the properties of the indicator. + * * @return */ - public PagerIndicator getPagerIndicator(){ + public PagerIndicator getPagerIndicator() { return mIndicator; } - public enum PresetIndicators{ - Center_Bottom("Center_Bottom",R.id.default_center_bottom_indicator), - Right_Bottom("Right_Bottom",R.id.default_bottom_right_indicator), - Left_Bottom("Left_Bottom",R.id.default_bottom_left_indicator), - Center_Top("Center_Top",R.id.default_center_top_indicator), - Right_Top("Right_Top",R.id.default_center_top_right_indicator), - Left_Top("Left_Top",R.id.default_center_top_left_indicator); - - private final String name; - private final int id; - private PresetIndicators(String name,int id){ - this.name = name; - this.id = id; - } - - public String toString(){ - return name; - } - - public int getResourceId(){ - return id; - } - } - public void setPresetIndicator(PresetIndicators presetIndicator){ - PagerIndicator pagerIndicator = (PagerIndicator)findViewById(presetIndicator.getResourceId()); + public void setPresetIndicator(PresetIndicators presetIndicator) { + PagerIndicator pagerIndicator = (PagerIndicator) findViewById(presetIndicator.getResourceId()); setCustomIndicator(pagerIndicator); } - private InfinitePagerAdapter getWrapperAdapter(){ + private InfinitePagerAdapter getWrapperAdapter() { PagerAdapter adapter = mViewPager.getAdapter(); - if(adapter!=null){ - return (InfinitePagerAdapter)adapter; - }else{ + if (adapter != null) { + return (InfinitePagerAdapter) adapter; + } else { return null; } } - private SliderAdapter getRealAdapter(){ + private SliderAdapter getRealAdapter() { PagerAdapter adapter = mViewPager.getAdapter(); - if(adapter!=null){ - return ((InfinitePagerAdapter)adapter).getRealAdapter(); + if (adapter != null) { + return ((InfinitePagerAdapter) adapter).getRealAdapter(); } return null; } /** * get the current item position + * * @return */ - public int getCurrentPosition(){ + public int getCurrentPosition() { - if(getRealAdapter() == null) + if (getRealAdapter() == null) throw new IllegalStateException("You did not set a slider adapter"); return mViewPager.getCurrentItem() % getRealAdapter().getCount(); } + public void setCurrentPosition(int position) { + setCurrentPosition(position, true); + } + /** * get current slider. + * * @return */ - public BaseSliderView getCurrentSlider(){ + public BaseSliderView getCurrentSlider() { - if(getRealAdapter() == null) + if (getRealAdapter() == null) throw new IllegalStateException("You did not set a slider adapter"); int count = getRealAdapter().getCount(); int realCount = mViewPager.getCurrentItem() % count; - return getRealAdapter().getSliderView(realCount); + return getRealAdapter().getSliderView(realCount); } /** * remove the slider at the position. Notice: It's a not perfect method, a very small bug still exists. */ - public void removeSliderAt(int position){ - if(getRealAdapter()!=null){ + public void removeSliderAt(int position) { + if (getRealAdapter() != null) { getRealAdapter().removeSliderAt(position); - mViewPager.setCurrentItem(mViewPager.getCurrentItem(),false); + mViewPager.setCurrentItem(mViewPager.getCurrentItem(), false); } } /** * remove all the sliders. Notice: It's a not perfect method, a very small bug still exists. */ - public void removeAllSliders(){ - if(getRealAdapter()!=null){ + public void removeAllSliders() { + if (getRealAdapter() != null) { int count = getRealAdapter().getCount(); getRealAdapter().removeAllSliders(); //a small bug, but fixed by this trick. //bug: when remove adapter's all the sliders.some caching slider still alive. - mViewPager.setCurrentItem(mViewPager.getCurrentItem() + count,false); + mViewPager.setCurrentItem(mViewPager.getCurrentItem() + count, false); } } /** - *set current slider + * set current slider + * * @param position */ public void setCurrentPosition(int position, boolean smooth) { if (getRealAdapter() == null) throw new IllegalStateException("You did not set a slider adapter"); - if(position >= getRealAdapter().getCount()){ + if (position >= getRealAdapter().getCount()) { throw new IllegalStateException("Item position is not exist"); } int p = mViewPager.getCurrentItem() % getRealAdapter().getCount(); @@ -666,10 +619,6 @@ public void setCurrentPosition(int position, boolean smooth) { mViewPager.setCurrentItem(n, smooth); } - public void setCurrentPosition(int position) { - setCurrentPosition(position, true); - } - /** * move to prev slide. */ @@ -681,7 +630,7 @@ public void movePrevPosition(boolean smooth) { mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1, smooth); } - public void movePrevPosition(){ + public void movePrevPosition() { movePrevPosition(true); } @@ -699,4 +648,65 @@ public void moveNextPosition(boolean smooth) { public void moveNextPosition() { moveNextPosition(true); } + + /** + * preset transformers and their names + */ + public enum Transformer { + Default("Default"), + Accordion("Accordion"), + Background2Foreground("Background2Foreground"), + CubeIn("CubeIn"), + DepthPage("DepthPage"), + Fade("Fade"), + FlipHorizontal("FlipHorizontal"), + FlipPage("FlipPage"), + Foreground2Background("Foreground2Background"), + RotateDown("RotateDown"), + RotateUp("RotateUp"), + Stack("Stack"), + Tablet("Tablet"), + ZoomIn("ZoomIn"), + ZoomOutSlide("ZoomOutSlide"), + ZoomOut("ZoomOut"); + + private final String name; + + private Transformer(String s) { + name = s; + } + + public String toString() { + return name; + } + + public boolean equals(String other) { + return (other == null) ? false : name.equals(other); + } + } + + public enum PresetIndicators { + Center_Bottom("Center_Bottom", R.id.default_center_bottom_indicator), + Right_Bottom("Right_Bottom", R.id.default_bottom_right_indicator), + Left_Bottom("Left_Bottom", R.id.default_bottom_left_indicator), + Center_Top("Center_Top", R.id.default_center_top_indicator), + Right_Top("Right_Top", R.id.default_center_top_right_indicator), + Left_Top("Left_Top", R.id.default_center_top_left_indicator); + + private final String name; + private final int id; + + private PresetIndicators(String name, int id) { + this.name = name; + this.id = id; + } + + public String toString() { + return name; + } + + public int getResourceId() { + return id; + } + } } 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..f3506de 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 @@ -22,25 +22,19 @@ public abstract class BaseSliderView { protected Context mContext; - + protected OnSliderClickListener mOnSliderClickListener; private Bundle mBundle; - /** * Error place holder image. */ private int mErrorPlaceHolderRes; - /** * Empty imageView placeholder. */ private int mEmptyPlaceHolderRes; - private String mUrl; private File mFile; private int mRes; - - protected OnSliderClickListener mOnSliderClickListener; - private boolean mErrorDisappear; private ImageLoadListener mLoadListener; @@ -54,61 +48,62 @@ public abstract class BaseSliderView { */ private ScaleType mScaleType = ScaleType.Fit; - public enum ScaleType{ - CenterCrop, CenterInside, Fit, FitCenterCrop - } - protected BaseSliderView(Context context) { mContext = context; } /** * the placeholder image when loading image from url or file. + * * @param resId Image resource id * @return */ - public BaseSliderView empty(int resId){ + public BaseSliderView empty(int resId) { mEmptyPlaceHolderRes = resId; return this; } /** * determine whether remove the image which failed to download or load from file + * * @param disappear * @return */ - public BaseSliderView errorDisappear(boolean disappear){ + public BaseSliderView errorDisappear(boolean disappear) { mErrorDisappear = disappear; return this; } /** * if you set errorDisappear false, this will set a error placeholder image. + * * @param resId image resource id * @return */ - public BaseSliderView error(int resId){ + public BaseSliderView error(int resId) { mErrorPlaceHolderRes = resId; return this; } /** * the description of a slider image. + * * @param description * @return */ - public BaseSliderView description(String description){ + public BaseSliderView description(String description) { mDescription = description; return this; } /** * set a url as a image that preparing to load + * * @param url * @return */ - public BaseSliderView image(String url){ - if(mFile != null || mRes != 0){ + public BaseSliderView image(String url) { + if (mFile != null || mRes != 0) { throw new IllegalStateException("Call multi image function," + "you only have permission to call it once"); } @@ -118,11 +113,12 @@ public BaseSliderView image(String url){ /** * set a file as a image that will to load + * * @param file * @return */ - public BaseSliderView image(File file){ - if(mUrl != null || mRes != 0){ + public BaseSliderView image(File file) { + if (mUrl != null || mRes != 0) { throw new IllegalStateException("Call multi image function," + "you only have permission to call it once"); } @@ -130,8 +126,8 @@ public BaseSliderView image(File file){ return this; } - public BaseSliderView image(int res){ - if(mUrl != null || mFile != null){ + public BaseSliderView image(int res) { + if (mUrl != null || mFile != null) { throw new IllegalStateException("Call multi image function," + "you only have permission to call it once"); } @@ -141,62 +137,65 @@ public BaseSliderView image(int res){ /** * lets users add a bundle of additional information + * * @param bundle * @return */ - public BaseSliderView bundle(Bundle bundle){ + public BaseSliderView bundle(Bundle bundle) { mBundle = bundle; return this; } - public String getUrl(){ + public String getUrl() { return mUrl; } - public boolean isErrorDisappear(){ + public boolean isErrorDisappear() { return mErrorDisappear; } - public int getEmpty(){ + public int getEmpty() { return mEmptyPlaceHolderRes; } - public int getError(){ + public int getError() { return mErrorPlaceHolderRes; } - public String getDescription(){ + public String getDescription() { return mDescription; } - public Context getContext(){ + public Context getContext() { return mContext; } /** * set a slider image click listener + * * @param l * @return */ - public BaseSliderView setOnSliderClickListener(OnSliderClickListener l){ + public BaseSliderView setOnSliderClickListener(OnSliderClickListener l) { mOnSliderClickListener = l; return this; } /** * 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 v the whole view * @param targetImageView where to place image */ - protected void bindEventAndShow(final View v, ImageView targetImageView){ + protected void bindEventAndShow(final View v, ImageView targetImageView) { final BaseSliderView me = this; v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if(mOnSliderClickListener != null){ - mOnSliderClickListener.onSliderClick(me); - } + if (mOnSliderClickListener != null) { + mOnSliderClickListener.onSliderClick(me); + } } }); @@ -209,29 +208,29 @@ public void onClick(View v) { Picasso p = (mPicasso != null) ? mPicasso : Picasso.with(mContext); RequestCreator rq = null; - if(mUrl!=null){ + if (mUrl != null) { rq = p.load(mUrl); - }else if(mFile != null){ + } else if (mFile != null) { rq = p.load(mFile); - }else if(mRes != 0){ + } else if (mRes != 0) { rq = p.load(mRes); - }else{ + } else { return; } - if(rq == null){ + if (rq == null) { return; } - if(getEmpty() != 0){ + if (getEmpty() != 0) { rq.placeholder(getEmpty()); } - if(getError() != 0){ + if (getError() != 0) { rq.error(getError()); } - switch (mScaleType){ + switch (mScaleType) { case Fit: rq.fit(); break; @@ -243,69 +242,61 @@ public void onClick(View v) { break; } - rq.into(targetImageView,new Callback() { + rq.into(targetImageView, new Callback() { @Override public void onSuccess() { - if(v.findViewById(R.id.loading_bar) != null){ + if (v.findViewById(R.id.loading_bar) != null) { v.findViewById(R.id.loading_bar).setVisibility(View.INVISIBLE); } } @Override public void onError() { - if(mLoadListener != null){ - mLoadListener.onEnd(false,me); + if (mLoadListener != null) { + mLoadListener.onEnd(false, me); } - if(v.findViewById(R.id.loading_bar) != null){ + if (v.findViewById(R.id.loading_bar) != null) { v.findViewById(R.id.loading_bar).setVisibility(View.INVISIBLE); } } }); - } - + } + public ScaleType getScaleType() { + return mScaleType; + } - public BaseSliderView setScaleType(ScaleType type){ + public BaseSliderView setScaleType(ScaleType type) { mScaleType = type; return this; } - public ScaleType getScaleType(){ - return mScaleType; - } - /** * the extended class have to implement getView(), which is called by the adapter, * every extended class response to render their own view. + * * @return */ public abstract View getView(); /** * set a listener to get a message , if load error. + * * @param l */ - public void setOnImageLoadListener(ImageLoadListener l){ + public void setOnImageLoadListener(ImageLoadListener l) { mLoadListener = l; } - public interface OnSliderClickListener { - public void onSliderClick(BaseSliderView slider); - } - /** * when you have some extra information, please put it in this bundle. + * * @return */ - public Bundle getBundle(){ + public Bundle getBundle() { return mBundle; } - public interface ImageLoadListener{ - public void onStart(BaseSliderView target); - public void onEnd(boolean result,BaseSliderView target); - } - /** * Get the last instance set via setPicasso(), or null if no user provided instance was set * @@ -325,4 +316,18 @@ public Picasso getPicasso() { public void setPicasso(Picasso picasso) { mPicasso = picasso; } + + public enum ScaleType { + CenterCrop, CenterInside, Fit, FitCenterCrop + } + + public interface OnSliderClickListener { + public void onSliderClick(BaseSliderView slider); + } + + public interface ImageLoadListener { + public void onStart(BaseSliderView target); + + public void onEnd(boolean result, BaseSliderView target); + } } diff --git a/library/src/main/java/com/daimajia/slider/library/SliderTypes/DefaultSliderView.java b/library/src/main/java/com/daimajia/slider/library/SliderTypes/DefaultSliderView.java index f6d52dd..ea0471d 100644 --- a/library/src/main/java/com/daimajia/slider/library/SliderTypes/DefaultSliderView.java +++ b/library/src/main/java/com/daimajia/slider/library/SliderTypes/DefaultSliderView.java @@ -9,10 +9,10 @@ /** * a simple slider view, which just show an image. If you want to make your own slider view, - * + *

* just extend BaseSliderView, and implement getView() method. */ -public class DefaultSliderView extends BaseSliderView{ +public class DefaultSliderView extends BaseSliderView { public DefaultSliderView(Context context) { super(context); @@ -20,8 +20,8 @@ public DefaultSliderView(Context context) { @Override public View getView() { - View v = LayoutInflater.from(getContext()).inflate(R.layout.render_type_default,null); - ImageView target = (ImageView)v.findViewById(R.id.daimajia_slider_image); + View v = LayoutInflater.from(getContext()).inflate(R.layout.render_type_default, null); + ImageView target = (ImageView) v.findViewById(R.id.daimajia_slider_image); bindEventAndShow(v, target); return v; } diff --git a/library/src/main/java/com/daimajia/slider/library/SliderTypes/TextSliderView.java b/library/src/main/java/com/daimajia/slider/library/SliderTypes/TextSliderView.java index 18c2580..f4b21aa 100644 --- a/library/src/main/java/com/daimajia/slider/library/SliderTypes/TextSliderView.java +++ b/library/src/main/java/com/daimajia/slider/library/SliderTypes/TextSliderView.java @@ -11,16 +11,16 @@ /** * This is a slider with a description TextView. */ -public class TextSliderView extends BaseSliderView{ +public class TextSliderView extends BaseSliderView { public TextSliderView(Context context) { super(context); } @Override public View getView() { - View v = LayoutInflater.from(getContext()).inflate(R.layout.render_type_text,null); - ImageView target = (ImageView)v.findViewById(R.id.daimajia_slider_image); - TextView description = (TextView)v.findViewById(R.id.description); + View v = LayoutInflater.from(getContext()).inflate(R.layout.render_type_text, null); + ImageView target = (ImageView) v.findViewById(R.id.daimajia_slider_image); + TextView description = (TextView) v.findViewById(R.id.description); description.setText(getDescription()); bindEventAndShow(v, target); return v; diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/AccordionTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/AccordionTransformer.java index e159b9b..141982a 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/AccordionTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/AccordionTransformer.java @@ -3,16 +3,15 @@ /** * Created by daimajia on 14-5-29. */ -import android.view.View; -import com.nineoldandroids.view.ViewHelper; +import android.view.View; public class AccordionTransformer extends BaseTransformer { @Override protected void onTransform(View view, float position) { - ViewHelper.setPivotX(view,position < 0 ? 0 : view.getWidth()); - ViewHelper.setScaleX(view,position < 0 ? 1f + position : 1f - position); + view.setPivotX(position < 0 ? 0 : view.getWidth()); + View.SCALE_X.set(view, position < 0 ? 1f + position : 1f - position); } } \ No newline at end of file diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/BackgroundToForegroundTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/BackgroundToForegroundTransformer.java index d5e1572..8852710 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/BackgroundToForegroundTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/BackgroundToForegroundTransformer.java @@ -2,25 +2,23 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class BackgroundToForegroundTransformer extends BaseTransformer { - @Override - protected void onTransform(View view, float position) { - final float height = view.getHeight(); - final float width = view.getWidth(); - final float scale = min(position < 0 ? 1f : Math.abs(1f - position), 0.5f); + private static final float min(float val, float min) { + return val < min ? min : val; + } - ViewHelper.setScaleX(view,scale); - ViewHelper.setScaleY(view,scale); - ViewHelper.setPivotX(view,width*0.5f); - ViewHelper.setPivotY(view,height*0.5f); - ViewHelper.setTranslationX(view,position < 0 ? width * position : -width * position * 0.25f); - } + @Override + protected void onTransform(View view, float position) { + final float height = view.getHeight(); + final float width = view.getWidth(); + final float scale = min(position < 0 ? 1f : Math.abs(1f - position), 0.5f); - private static final float min(float val, float min) { - return val < min ? min : val; - } + View.SCALE_X.set(view, scale); + View.SCALE_Y.set(view, scale); + view.setPivotX(width * 0.5f); + view.setPivotY(height * 0.5f); + View.TRANSLATION_X.set(view, position < 0 ? width * position : -width * position * 0.25f); + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/BaseTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/BaseTransformer.java index c1a78b9..dc26d1c 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/BaseTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/BaseTransformer.java @@ -4,28 +4,29 @@ import com.daimajia.slider.library.Animations.BaseAnimationInterface; import com.daimajia.slider.library.Tricks.ViewPagerEx; -import com.nineoldandroids.view.ViewHelper; import java.util.ArrayList; import java.util.HashMap; /** * This is all transformers father. - * + *

* BaseTransformer implement {@link com.daimajia.slider.library.Tricks.ViewPagerEx.PageTransformer} * which is just same as {@link android.support.v4.view.ViewPager.PageTransformer}. - * + *

* After you call setPageTransformer(), transformPage() will be called by {@link com.daimajia.slider.library.Tricks.ViewPagerEx} * when your slider are animating. - * + *

* In onPreTransform() function, that will make {@link com.daimajia.slider.library.Animations.BaseAnimationInterface} * work. - * + *

* if you want to make an acceptable transformer, please do not forget to extend from this class. */ public abstract class BaseTransformer implements ViewPagerEx.PageTransformer { + boolean isApp, isDis; private BaseAnimationInterface mCustomAnimationInterface; + private HashMap> h = new HashMap>(); /** * Called each {@link #transformPage(View, float)}. @@ -35,8 +36,6 @@ public abstract class BaseTransformer implements ViewPagerEx.PageTransformer { */ protected abstract void onTransform(View view, float position); - private HashMap> h = new HashMap>(); - @Override public void transformPage(View view, float position) { onPreTransform(view, position); @@ -72,44 +71,44 @@ protected boolean isPagingEnabled() { protected void onPreTransform(View view, float position) { final float width = view.getWidth(); - ViewHelper.setRotationX(view,0); - ViewHelper.setRotationY(view,0); - ViewHelper.setRotation(view,0); - ViewHelper.setScaleX(view,1); - ViewHelper.setScaleY(view,1); - ViewHelper.setPivotX(view,0); - ViewHelper.setPivotY(view,0); - ViewHelper.setTranslationY(view,0); - ViewHelper.setTranslationX(view,isPagingEnabled() ? 0f : -width * position); + View.ROTATION_X.set(view, 0f); + View.ROTATION_Y.set(view, 0f); + View.ROTATION.set(view, 0f); + View.SCALE_X.set(view, 1f); + View.SCALE_Y.set(view, 1f); + view.setPivotX(0); + view.setPivotY(0); + View.TRANSLATION_Y.set(view, 0f); + View.TRANSLATION_X.set(view, isPagingEnabled() ? 0f : -width * position); if (hideOffscreenPages()) { - ViewHelper.setAlpha(view,position <= -1f || position >= 1f ? 0f : 1f); + View.ALPHA.set(view, position <= -1f || position >= 1f ? 0f : 1f); } else { - ViewHelper.setAlpha(view,1f); + View.ALPHA.set(view, 1f); } - if(mCustomAnimationInterface != null){ - if(h.containsKey(view) == false || h.get(view).size() == 1){ - if(position > -1 && position < 1){ - if(h.get(view) == null){ - h.put(view,new ArrayList()); + if (mCustomAnimationInterface != null) { + if (h.containsKey(view) == false || h.get(view).size() == 1) { + if (position > -1 && position < 1) { + if (h.get(view) == null) { + h.put(view, new ArrayList()); } h.get(view).add(position); - if(h.get(view).size() == 2){ + if (h.get(view).size() == 2) { float zero = h.get(view).get(0); float cha = h.get(view).get(1) - h.get(view).get(0); - if(zero > 0){ - if(cha > -1 && cha < 0){ + if (zero > 0) { + if (cha > -1 && cha < 0) { //in mCustomAnimationInterface.onPrepareNextItemShowInScreen(view); - }else{ + } else { //out mCustomAnimationInterface.onPrepareCurrentItemLeaveScreen(view); } - }else{ - if(cha > -1 && cha < 0){ + } else { + if (cha > -1 && cha < 0) { //out mCustomAnimationInterface.onPrepareCurrentItemLeaveScreen(view); - }else{ + } else { //in mCustomAnimationInterface.onPrepareNextItemShowInScreen(view); } @@ -119,7 +118,7 @@ protected void onPreTransform(View view, float position) { } } } - boolean isApp,isDis; + /** * Called each {@link #transformPage(View, float)} call after {@link #onTransform(View, float)} is finished. * @@ -127,15 +126,15 @@ protected void onPreTransform(View view, float position) { * @param position */ protected void onPostTransform(View view, float position) { - if(mCustomAnimationInterface != null){ - if(position == -1 || position == 1){ + if (mCustomAnimationInterface != null) { + if (position == -1 || position == 1) { mCustomAnimationInterface.onCurrentItemDisappear(view); isApp = true; - }else if(position == 0){ + } else if (position == 0) { mCustomAnimationInterface.onNextItemAppear(view); isDis = true; } - if(isApp && isDis){ + if (isApp && isDis) { h.clear(); isApp = false; isDis = false; @@ -144,7 +143,7 @@ protected void onPostTransform(View view, float position) { } - public void setCustomAnimationInterface(BaseAnimationInterface animationInterface){ + public void setCustomAnimationInterface(BaseAnimationInterface animationInterface) { mCustomAnimationInterface = animationInterface; } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/CubeInTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/CubeInTransformer.java index 8a8c382..958f1ae 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/CubeInTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/CubeInTransformer.java @@ -2,21 +2,19 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class CubeInTransformer extends BaseTransformer { - @Override - protected void onTransform(View view, float position) { - // Rotate the fragment on the left or right edge - ViewHelper.setPivotX(view,position > 0 ? 0 : view.getWidth()); - ViewHelper.setPivotY(view,0); - ViewHelper.setRotation(view,-90f * position); - } + @Override + protected void onTransform(View view, float position) { + // Rotate the fragment on the left or right edge + view.setPivotX(position > 0 ? 0 : view.getWidth()); + view.setPivotY(0); + View.ROTATION.set(view, -90f * position); + } - @Override - public boolean isPagingEnabled() { - return true; - } + @Override + public boolean isPagingEnabled() { + return true; + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/DefaultTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/DefaultTransformer.java index 9489044..13d50c4 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/DefaultTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/DefaultTransformer.java @@ -4,13 +4,13 @@ public class DefaultTransformer extends BaseTransformer { - @Override - protected void onTransform(View view, float position) { - } + @Override + protected void onTransform(View view, float position) { + } - @Override - public boolean isPagingEnabled() { - return true; - } + @Override + public boolean isPagingEnabled() { + return true; + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/DepthPageTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/DepthPageTransformer.java index c72e0da..adea485 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/DepthPageTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/DepthPageTransformer.java @@ -2,31 +2,29 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class DepthPageTransformer extends BaseTransformer { - private static final float MIN_SCALE = 0.75f; + private static final float MIN_SCALE = 0.75f; - @Override - protected void onTransform(View view, float position) { - if (position <= 0f) { - ViewHelper.setTranslationX(view,0f); - ViewHelper.setScaleX(view,1f); - ViewHelper.setScaleY(view,1f); - } else if (position <= 1f) { - final float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); - ViewHelper.setAlpha(view,1-position); - ViewHelper.setPivotY(view,0.5f * view.getHeight()); - ViewHelper.setTranslationX(view,view.getWidth() * - position); - ViewHelper.setScaleX(view,scaleFactor); - ViewHelper.setScaleY(view,scaleFactor); - } - } + @Override + protected void onTransform(View view, float position) { + if (position <= 0f) { + View.TRANSLATION_X.set(view, 0f); + View.SCALE_X.set(view, 1f); + View.SCALE_Y.set(view, 1f); + } else if (position <= 1f) { + final float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); + View.ALPHA.set(view, 1 - position); + view.setPivotY(0.5f * view.getHeight()); + View.TRANSLATION_X.set(view, view.getWidth() * -position); + View.SCALE_X.set(view, scaleFactor); + View.SCALE_Y.set(view, scaleFactor); + } + } - @Override - protected boolean isPagingEnabled() { - return true; - } + @Override + protected boolean isPagingEnabled() { + return true; + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/FadeTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/FadeTransformer.java index c202ab3..01c26eb 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/FadeTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/FadeTransformer.java @@ -2,8 +2,6 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - /** * Created by realandylawton on 11/22/13. */ @@ -13,20 +11,20 @@ public class FadeTransformer extends BaseTransformer { protected void onTransform(View view, float position) { // Page is not an immediate sibling, just make transparent - if(position < -1 || position > 1) { - ViewHelper.setAlpha(view,0.6f); + if (position < -1 || position > 1) { + View.ALPHA.set(view, 0.6f); } // Page is sibling to left or right else if (position <= 0 || position <= 1) { // Calculate alpha. Position is decimal in [-1,0] or [0,1] float alpha = (position <= 0) ? position + 1 : 1 - position; - ViewHelper.setAlpha(view,alpha); + View.ALPHA.set(view, alpha); } // Page is active, make fully visible else if (position == 0) { - ViewHelper.setAlpha(view,1); + View.ALPHA.set(view, 1f); } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/FlipHorizontalTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/FlipHorizontalTransformer.java index ada24aa..74f16df 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/FlipHorizontalTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/FlipHorizontalTransformer.java @@ -2,17 +2,15 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class FlipHorizontalTransformer extends BaseTransformer { - @Override - protected void onTransform(View view, float position) { - final float rotation = 180f * position; - ViewHelper.setAlpha(view,rotation > 90f || rotation < -90f ? 0 : 1); - ViewHelper.setPivotY(view,view.getHeight()*0.5f); - ViewHelper.setPivotX(view,view.getWidth() * 0.5f); - ViewHelper.setRotationY(view,rotation); - } + @Override + protected void onTransform(View view, float position) { + final float rotation = 180f * position; + View.ALPHA.set(view, rotation > 90f || rotation < -90f ? 0 : 1f); + view.setPivotY(view.getHeight() * 0.5f); + view.setPivotX(view.getWidth() * 0.5f); + View.ROTATION_Y.set(view, rotation); + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/FlipPageViewTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/FlipPageViewTransformer.java index 31b0cf1..c01905d 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/FlipPageViewTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/FlipPageViewTransformer.java @@ -4,14 +4,13 @@ import android.view.View; import com.daimajia.slider.library.Tricks.ViewPagerEx; -import com.nineoldandroids.view.ViewHelper; public class FlipPageViewTransformer extends BaseTransformer { @Override protected void onTransform(View view, float position) { float percentage = 1 - Math.abs(position); - if(Build.VERSION.SDK_INT >= 13){ + if (Build.VERSION.SDK_INT >= 13) { view.setCameraDistance(12000); } setVisibility(view, position); @@ -30,20 +29,16 @@ private void setVisibility(View page, float position) { private void setTranslation(View view) { ViewPagerEx viewPager = (ViewPagerEx) view.getParent(); - int scroll = viewPager.getScrollX() - view.getLeft(); - ViewHelper.setTranslationX(view,scroll); + float scroll = viewPager.getScrollX() - view.getLeft(); + View.TRANSLATION_X.set(view, scroll); } private void setSize(View view, float position, float percentage) { - ViewHelper.setScaleX(view,(position != 0 && position != 1) ? percentage : 1); - ViewHelper.setScaleY(view,(position != 0 && position != 1) ? percentage : 1); + View.SCALE_X.set(view, (position != 0 && position != 1) ? percentage : 1); + View.SCALE_Y.set(view, (position != 0 && position != 1) ? percentage : 1); } private void setRotation(View view, float position, float percentage) { - if (position > 0) { - ViewHelper.setRotationY(view,-180 * (percentage + 1)); - } else { - ViewHelper.setRotationY(view,180 * (percentage + 1)); - } + View.ROTATION_Y.set(view, position > 0 ? -1 : 1 * 180 * (percentage + 1)); } } \ No newline at end of file diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/ForegroundToBackgroundTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/ForegroundToBackgroundTransformer.java index 7f53c98..f341d07 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/ForegroundToBackgroundTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/ForegroundToBackgroundTransformer.java @@ -2,25 +2,23 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class ForegroundToBackgroundTransformer extends BaseTransformer { - @Override - protected void onTransform(View view, float position) { - final float height = view.getHeight(); - final float width = view.getWidth(); - final float scale = min(position > 0 ? 1f : Math.abs(1f + position), 0.5f); + private static final float min(float val, float min) { + return val < min ? min : val; + } - ViewHelper.setScaleX(view,scale); - ViewHelper.setScaleY(view,scale); - ViewHelper.setPivotX(view,width * 0.5f); - ViewHelper.setPivotY(view,height * 0.5f); - ViewHelper.setTranslationX(view,position > 0 ? width * position : -width * position * 0.25f); - } + @Override + protected void onTransform(View view, float position) { + final float height = view.getHeight(); + final float width = view.getWidth(); + final float scale = min(position > 0 ? 1f : Math.abs(1f + position), 0.5f); - private static final float min(float val, float min) { - return val < min ? min : val; - } + View.SCALE_X.set(view, scale); + View.SCALE_Y.set(view, scale); + view.setPivotX(width * 0.5f); + view.setPivotY(height * 0.5f); + View.TRANSLATION_X.set(view, position > 0 ? width * position : -width * position * 0.25f); + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/RotateDownTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/RotateDownTransformer.java index a88bc22..2b27bef 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/RotateDownTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/RotateDownTransformer.java @@ -2,26 +2,24 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class RotateDownTransformer extends BaseTransformer { - private static final float ROT_MOD = -15f; + private static final float ROT_MOD = -15f; + + @Override + protected void onTransform(View view, float position) { + final float width = view.getWidth(); + final float height = view.getHeight(); + final float rotation = ROT_MOD * position * -1.25f; - @Override - protected void onTransform(View view, float position) { - final float width = view.getWidth(); - final float height = view.getHeight(); - final float rotation = ROT_MOD * position * -1.25f; + view.setPivotX(width * 0.5f); + view.setPivotY(height); + View.ROTATION.set(view, rotation); + } - ViewHelper.setPivotX(view,width * 0.5f); - ViewHelper.setPivotY(view,height); - ViewHelper.setRotation(view,rotation); - } - - @Override - protected boolean isPagingEnabled() { - return true; - } + @Override + protected boolean isPagingEnabled() { + return true; + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/RotateUpTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/RotateUpTransformer.java index 2619f3a..94ff878 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/RotateUpTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/RotateUpTransformer.java @@ -2,26 +2,24 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class RotateUpTransformer extends BaseTransformer { - private static final float ROT_MOD = -15f; + private static final float ROT_MOD = -15f; + + @Override + protected void onTransform(View view, float position) { + final float width = view.getWidth(); + final float rotation = ROT_MOD * position; - @Override - protected void onTransform(View view, float position) { - final float width = view.getWidth(); - final float rotation = ROT_MOD * position; + view.setPivotX(width * 0.5f); + view.setPivotY(0f); + View.TRANSLATION_X.set(view, 0f); + View.ROTATION.set(view, rotation); + } - ViewHelper.setPivotX(view,width * 0.5f); - ViewHelper.setPivotY(view,0f); - ViewHelper.setTranslationX(view,0f); - ViewHelper.setRotation(view,rotation); - } - - @Override - protected boolean isPagingEnabled() { - return true; - } + @Override + protected boolean isPagingEnabled() { + return true; + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/StackTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/StackTransformer.java index 495d7a2..a9af510 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/StackTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/StackTransformer.java @@ -2,13 +2,11 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class StackTransformer extends BaseTransformer { - @Override - protected void onTransform(View view, float position) { - ViewHelper.setTranslationX(view,position < 0 ? 0f : -view.getWidth() * position); - } + @Override + protected void onTransform(View view, float position) { + View.TRANSLATION_X.set(view, position < 0 ? 0f : -view.getWidth() * position); + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/TabletTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/TabletTransformer.java index e2fb6ce..34e8bd0 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/TabletTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/TabletTransformer.java @@ -4,37 +4,35 @@ import android.graphics.Matrix; import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class TabletTransformer extends BaseTransformer { - private static final Matrix OFFSET_MATRIX = new Matrix(); - private static final Camera OFFSET_CAMERA = new Camera(); - private static final float[] OFFSET_TEMP_FLOAT = new float[2]; - - @Override - protected void onTransform(View view, float position) { - final float rotation = (position < 0 ? 30f : -30f) * Math.abs(position); - - ViewHelper.setTranslationX(view,getOffsetXForRotation(rotation, view.getWidth(), view.getHeight())); - ViewHelper.setPivotX(view,view.getWidth() * 0.5f); - ViewHelper.setPivotY(view,0); - ViewHelper.setRotationY(view,rotation); - } - - protected static final float getOffsetXForRotation(float degrees, int width, int height) { - OFFSET_MATRIX.reset(); - OFFSET_CAMERA.save(); - OFFSET_CAMERA.rotateY(Math.abs(degrees)); - OFFSET_CAMERA.getMatrix(OFFSET_MATRIX); - OFFSET_CAMERA.restore(); - - OFFSET_MATRIX.preTranslate(-width * 0.5f, -height * 0.5f); - OFFSET_MATRIX.postTranslate(width * 0.5f, height * 0.5f); - OFFSET_TEMP_FLOAT[0] = width; - OFFSET_TEMP_FLOAT[1] = height; - OFFSET_MATRIX.mapPoints(OFFSET_TEMP_FLOAT); - return (width - OFFSET_TEMP_FLOAT[0]) * (degrees > 0.0f ? 1.0f : -1.0f); - } + private static final Matrix OFFSET_MATRIX = new Matrix(); + private static final Camera OFFSET_CAMERA = new Camera(); + private static final float[] OFFSET_TEMP_FLOAT = new float[2]; + + protected static final float getOffsetXForRotation(float degrees, int width, int height) { + OFFSET_MATRIX.reset(); + OFFSET_CAMERA.save(); + OFFSET_CAMERA.rotateY(Math.abs(degrees)); + OFFSET_CAMERA.getMatrix(OFFSET_MATRIX); + OFFSET_CAMERA.restore(); + + OFFSET_MATRIX.preTranslate(-width * 0.5f, -height * 0.5f); + OFFSET_MATRIX.postTranslate(width * 0.5f, height * 0.5f); + OFFSET_TEMP_FLOAT[0] = width; + OFFSET_TEMP_FLOAT[1] = height; + OFFSET_MATRIX.mapPoints(OFFSET_TEMP_FLOAT); + return (width - OFFSET_TEMP_FLOAT[0]) * (degrees > 0.0f ? 1.0f : -1.0f); + } + + @Override + protected void onTransform(View view, float position) { + final float rotation = (position < 0 ? 30f : -30f) * Math.abs(position); + + View.TRANSLATION_X.set(view, getOffsetXForRotation(rotation, view.getWidth(), view.getHeight())); + view.setPivotX(view.getWidth() * 0.5f); + view.setPivotY(0); + View.ROTATION_Y.set(view, rotation); + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomInTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomInTransformer.java index 4bacbc0..ec8370a 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomInTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomInTransformer.java @@ -2,18 +2,16 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class ZoomInTransformer extends BaseTransformer { - @Override - protected void onTransform(View view, float position) { - final float scale = position < 0 ? position + 1f : Math.abs(1f - position); - ViewHelper.setScaleX(view,scale); - ViewHelper.setScaleY(view,scale); - ViewHelper.setPivotX(view,view.getWidth() * 0.5f); - ViewHelper.setPivotY(view,view.getHeight() * 0.5f); - ViewHelper.setAlpha(view,position < -1f || position > 1f ? 0f : 1f - (scale - 1f)); - } + @Override + protected void onTransform(View view, float position) { + final float scale = position < 0 ? position + 1f : Math.abs(1f - position); + View.SCALE_X.set(view, scale); + View.SCALE_Y.set(view, scale); + view.setPivotX(view.getWidth() * 0.5f); + view.setPivotY(view.getHeight() * 0.5f); + View.ALPHA.set(view, position < -1f || position > 1f ? 0f : 1f - (scale - 1f)); + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomOutSlideTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomOutSlideTransformer.java index 3a2ba81..7cd6691 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomOutSlideTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomOutSlideTransformer.java @@ -2,39 +2,37 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class ZoomOutSlideTransformer extends BaseTransformer { - private static final float MIN_SCALE = 0.85f; - private static final float MIN_ALPHA = 0.5f; + private static final float MIN_SCALE = 0.85f; + private static final float MIN_ALPHA = 0.5f; - @Override - protected void onTransform(View view, float position) { - if (position >= -1 || position <= 1) { - // Modify the default slide transition to shrink the page as well - final float height = view.getHeight(); - final float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); - final float vertMargin = height * (1 - scaleFactor) / 2; - final float horzMargin = view.getWidth() * (1 - scaleFactor) / 2; + @Override + protected void onTransform(View view, float position) { + if (position >= -1 || position <= 1) { + // Modify the default slide transition to shrink the page as well + final float height = view.getHeight(); + final float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position)); + final float vertMargin = height * (1 - scaleFactor) / 2; + final float horzMargin = view.getWidth() * (1 - scaleFactor) / 2; // Center vertically - ViewHelper.setPivotY(view,0.5f * height); + view.setPivotY(0.5f * height); - if (position < 0) { - ViewHelper.setTranslationX(view,horzMargin - vertMargin / 2); - } else { - ViewHelper.setTranslationX(view,-horzMargin + vertMargin / 2); - } + if (position < 0) { + View.TRANSLATION_X.set(view, horzMargin - vertMargin / 2); + } else { + View.TRANSLATION_X.set(view, -horzMargin + vertMargin / 2); + } - // Scale the page down (between MIN_SCALE and 1) - ViewHelper.setScaleX(view,scaleFactor); - ViewHelper.setScaleY(view,scaleFactor); + // Scale the page down (between MIN_SCALE and 1) + View.SCALE_X.set(view, scaleFactor); + View.SCALE_Y.set(view, scaleFactor); - // Fade the page relative to its size. - ViewHelper.setAlpha(view,MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); - } - } + // Fade the page relative to its size. + View.ALPHA.set(view, MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); + } + } } diff --git a/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomOutTransformer.java b/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomOutTransformer.java index d5c33ec..1cef147 100644 --- a/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomOutTransformer.java +++ b/library/src/main/java/com/daimajia/slider/library/Transformers/ZoomOutTransformer.java @@ -2,21 +2,19 @@ import android.view.View; -import com.nineoldandroids.view.ViewHelper; - public class ZoomOutTransformer extends BaseTransformer { @Override protected void onTransform(View view, float position) { final float scale = 1f + Math.abs(position); - ViewHelper.setScaleX(view,scale); - ViewHelper.setScaleY(view,scale); - ViewHelper.setPivotX(view,view.getWidth() * 0.5f); - ViewHelper.setPivotY(view,view.getWidth() * 0.5f); - ViewHelper.setAlpha(view,position < -1f || position > 1f ? 0f : 1f - (scale - 1f)); - if(position < -0.9){ + View.SCALE_X.set(view, scale); + View.SCALE_Y.set(view, scale); + view.setPivotX(view.getWidth() * 0.5f); + view.setPivotY(view.getWidth() * 0.5f); + View.ALPHA.set(view, position < -1f || position > 1f ? 0f : 1f - (scale - 1f)); + if (position < -0.9) { //-0.9 to prevent a small bug - ViewHelper.setTranslationX(view,view.getWidth() * position); + View.TRANSLATION_X.set(view, view.getWidth() * position); } } diff --git a/library/src/main/java/com/daimajia/slider/library/Tricks/FixedSpeedScroller.java b/library/src/main/java/com/daimajia/slider/library/Tricks/FixedSpeedScroller.java index e523d86..e4417ba 100644 --- a/library/src/main/java/com/daimajia/slider/library/Tricks/FixedSpeedScroller.java +++ b/library/src/main/java/com/daimajia/slider/library/Tricks/FixedSpeedScroller.java @@ -16,8 +16,8 @@ public FixedSpeedScroller(Context context, Interpolator interpolator) { super(context, interpolator); } - public FixedSpeedScroller(Context context, Interpolator interpolator, int period){ - this(context,interpolator); + public FixedSpeedScroller(Context context, Interpolator interpolator, int period) { + this(context, interpolator); mDuration = period; } diff --git a/library/src/main/java/com/daimajia/slider/library/Tricks/InfinitePagerAdapter.java b/library/src/main/java/com/daimajia/slider/library/Tricks/InfinitePagerAdapter.java index 04f74ca..ef62c4d 100644 --- a/library/src/main/java/com/daimajia/slider/library/Tricks/InfinitePagerAdapter.java +++ b/library/src/main/java/com/daimajia/slider/library/Tricks/InfinitePagerAdapter.java @@ -23,7 +23,7 @@ public InfinitePagerAdapter(SliderAdapter adapter) { this.adapter = adapter; } - public SliderAdapter getRealAdapter(){ + public SliderAdapter getRealAdapter() { return this.adapter; } @@ -43,7 +43,7 @@ public int getRealCount() { @Override public Object instantiateItem(ViewGroup container, int position) { - if(getRealCount() == 0){ + if (getRealCount() == 0) { return null; } int virtualPosition = position % getRealCount(); @@ -56,7 +56,7 @@ public Object instantiateItem(ViewGroup container, int position) { @Override public void destroyItem(ViewGroup container, int position, Object object) { - if(getRealCount() == 0){ + if (getRealCount() == 0) { return; } int virtualPosition = position % getRealCount(); 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..eeb3c55 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 @@ -50,12 +50,12 @@ * Layout manager that allows the user to flip left and right * through pages of data. You supply an implementation of a * {@link PagerAdapter} to generate the pages that the view shows. - * + *

*

Note this class is currently under early design and * development. The API will likely change in later updates of * the compatibility library, requiring changes to the source code * of apps when they are compiled against the newer version.

- * + *

*

ViewPager is most often used in conjunction with {@link android.app.Fragment}, * which is a convenient way to supply and manage the lifecycle of each page. * There are standard adapters implemented for using fragments with the ViewPager, @@ -64,13 +64,13 @@ * {@link android.support.v4.app.FragmentStatePagerAdapter}; each of these * classes have simple code showing how to build a full user interface * with them. - * + *

*

Here is a more complicated example of ViewPager, using it in conjuction * with {@link android.app.ActionBar} tabs. You can find other examples of using * ViewPager in the API 4+ Support Demos and API 13+ Support Demos sample code. - * + *

* {@sample development/samples/Support13Demos/src/com/example/android/supportv13/app/ActionBarTabsPager.java - * complete} + * complete} */ @@ -80,57 +80,64 @@ * Thanks to JakeWharton. * http://github.com/JakeWharton/NineOldAndroids */ -public class ViewPagerEx extends ViewGroup{ +public class ViewPagerEx extends ViewGroup { + /** + * Indicates that the pager is in an idle, settled state. The current page + * is fully in view and no animation is in progress. + */ + public static final int SCROLL_STATE_IDLE = 0; + /** + * Indicates that the pager is currently being dragged by the user. + */ + public static final int SCROLL_STATE_DRAGGING = 1; + /** + * Indicates that the pager is in the process of settling to a final position. + */ + public static final int SCROLL_STATE_SETTLING = 2; private static final String TAG = "ViewPagerEx"; private static final boolean DEBUG = false; - private static final boolean USE_CACHE = false; - private static final int DEFAULT_OFFSCREEN_PAGES = 1; private static final int MAX_SETTLE_DURATION = 600; // ms private static final int MIN_DISTANCE_FOR_FLING = 25; // dips - private static final int DEFAULT_GUTTER_SIZE = 16; // dips - private static final int MIN_FLING_VELOCITY = 400; // dips - - private static final int[] LAYOUT_ATTRS = new int[] { + private static final int[] LAYOUT_ATTRS = new int[]{ android.R.attr.layout_gravity }; - - /** - * Used to track what the expected number of items in the adapter should be. - * If the app changes this when we don't expect it, we'll throw a big obnoxious exception. - */ - private int mExpectedAdapterCount; - - static class ItemInfo { - Object object; - int position; - boolean scrolling; - float widthFactor; - float offset; - } - - private static final Comparator COMPARATOR = new Comparator(){ + private static final Comparator COMPARATOR = new Comparator() { @Override public int compare(ItemInfo lhs, ItemInfo rhs) { return lhs.position - rhs.position; } }; - private static final Interpolator sInterpolator = new Interpolator() { public float getInterpolation(float t) { t -= 1.0f; return t * t * t * t * t + 1.0f; } }; - + /** + * Sentinel value for no current active pointer. + * Used by {@link #mActivePointerId}. + */ + private static final int INVALID_POINTER = -1; + // If the pager is at least this close to its final position, complete the scroll + // on touch down and let the user interact with the content inside instead of + // "catching" the flinging pager. + private static final int CLOSE_ENOUGH = 2; // dp + private static final int DRAW_ORDER_DEFAULT = 0; + private static final int DRAW_ORDER_FORWARD = 1; + private static final int DRAW_ORDER_REVERSE = 2; + private static final ViewPositionComparator sPositionComparator = new ViewPositionComparator(); private final ArrayList mItems = new ArrayList(); private final ItemInfo mTempItem = new ItemInfo(); - private final Rect mTempRect = new Rect(); - + /** + * Used to track what the expected number of items in the adapter should be. + * If the app changes this when we don't expect it, we'll throw a big obnoxious exception. + */ + private int mExpectedAdapterCount; private PagerAdapter mAdapter; private int mCurItem; // Index of currently displayed page. private int mRestoredCurItem = -1; @@ -138,27 +145,21 @@ public float getInterpolation(float t) { private ClassLoader mRestoredClassLoader = null; private Scroller mScroller; private PagerObserver mObserver; - private int mPageMargin; private Drawable mMarginDrawable; private int mTopPageBounds; private int mBottomPageBounds; - // Offsets of the first and last items, if known. // Set during population, used to determine if we are at the beginning // or end of the pager data set during touch scrolling. private float mFirstOffset = -Float.MAX_VALUE; private float mLastOffset = Float.MAX_VALUE; - private int mChildWidthMeasureSpec; private int mChildHeightMeasureSpec; private boolean mInLayout; - private boolean mScrollingCacheEnabled; - private boolean mPopulatePending; private int mOffscreenPageLimit = DEFAULT_OFFSCREEN_PAGES; - private boolean mIsBeingDragged; private boolean mIsUnableToDrag; private boolean mIgnoreGutter; @@ -177,12 +178,6 @@ public float getInterpolation(float t) { * drags/flings if multiple pointers are used. */ private int mActivePointerId = INVALID_POINTER; - /** - * Sentinel value for no current active pointer. - * Used by {@link #mActivePointerId}. - */ - private static final int INVALID_POINTER = -1; - /** * Determines speed during touch scrolling */ @@ -191,52 +186,22 @@ public float getInterpolation(float t) { private int mMaximumVelocity; private int mFlingDistance; private int mCloseEnough; - - // If the pager is at least this close to its final position, complete the scroll - // on touch down and let the user interact with the content inside instead of - // "catching" the flinging pager. - private static final int CLOSE_ENOUGH = 2; // dp - private boolean mFakeDragging; private long mFakeDragBeginTime; - private EdgeEffectCompat mLeftEdge; private EdgeEffectCompat mRightEdge; - private boolean mFirstLayout = true; private boolean mNeedCalculatePageOffsets = false; private boolean mCalledSuper; private int mDecorChildCount; - private ArrayList mOnPageChangeListeners = new ArrayList<>(); private OnPageChangeListener mInternalPageChangeListener; private OnAdapterChangeListener mAdapterChangeListener; private PageTransformer mPageTransformer; private Method mSetChildrenDrawingOrderEnabled; - - private static final int DRAW_ORDER_DEFAULT = 0; - private static final int DRAW_ORDER_FORWARD = 1; - private static final int DRAW_ORDER_REVERSE = 2; private int mDrawingOrder; private ArrayList mDrawingOrderedChildren; - private static final ViewPositionComparator sPositionComparator = new ViewPositionComparator(); - - /** - * Indicates that the pager is in an idle, settled state. The current page - * is fully in view and no animation is in progress. - */ - public static final int SCROLL_STATE_IDLE = 0; - - /** - * Indicates that the pager is currently being dragged by the user. - */ - public static final int SCROLL_STATE_DRAGGING = 1; - - /** - * Indicates that the pager is in the process of settling to a final position. - */ - public static final int SCROLL_STATE_SETTLING = 2; - + private int mScrollState = SCROLL_STATE_IDLE; private final Runnable mEndScrollRunnable = new Runnable() { public void run() { setScrollState(SCROLL_STATE_IDLE); @@ -244,71 +209,20 @@ public void run() { } }; - private int mScrollState = SCROLL_STATE_IDLE; - - /** - * Callback interface for responding to changing state of the selected page. - */ - public interface OnPageChangeListener { - - /** - * This method will be invoked when the current page is scrolled, either as part - * of a programmatically initiated smooth scroll or a user initiated touch scroll. - * - * @param position Position index of the first page currently being displayed. - * Page position+1 will be visible if positionOffset is nonzero. - * @param positionOffset Value from [0, 1) indicating the offset from the page at position. - * @param positionOffsetPixels Value in pixels indicating the offset from position. - */ - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels); - - /** - * This method will be invoked when a new page becomes selected. Animation is not - * necessarily complete. - * - * @param position Position index of the new selected page. - */ - public void onPageSelected(int position); - - /** - * Called when the scroll state changes. Useful for discovering when the user - * begins dragging, when the pager is automatically settling to the current page, - * or when it is fully stopped/idle. - * - * @param state The new scroll state. - * @see ViewPagerEx#SCROLL_STATE_IDLE - * @see ViewPagerEx#SCROLL_STATE_DRAGGING - * @see ViewPagerEx#SCROLL_STATE_SETTLING - */ - public void onPageScrollStateChanged(int state); + public ViewPagerEx(Context context) { + super(context); + initViewPager(); } - /** - * Simple implementation of the {@link OnPageChangeListener} interface with stub - * implementations of each method. Extend this if you do not intend to override - * every method of {@link OnPageChangeListener}. - */ - public static class SimpleOnPageChangeListener implements OnPageChangeListener { - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - // This space for rent - } - - @Override - public void onPageSelected(int position) { - // This space for rent - } - - @Override - public void onPageScrollStateChanged(int state) { - // This space for rent - } + public ViewPagerEx(Context context, AttributeSet attrs) { + super(context, attrs); + initViewPager(); } private void triggerOnPageChangeEvent(int position) { for (OnPageChangeListener eachListener : mOnPageChangeListeners) { if (eachListener != null) { - InfinitePagerAdapter infiniteAdapter = (InfinitePagerAdapter)mAdapter; + InfinitePagerAdapter infiniteAdapter = (InfinitePagerAdapter) mAdapter; if (infiniteAdapter.getRealCount() == 0) { return; } @@ -320,50 +234,6 @@ private void triggerOnPageChangeEvent(int position) { mInternalPageChangeListener.onPageSelected(position); } } - /** - * A PageTransformer is invoked whenever a visible/attached page is scrolled. - * This offers an opportunity for the application to apply a custom transformation - * to the page views using animation properties. - * - *

As property animation is only supported as of Android 3.0 and forward, - * setting a PageTransformer on a ViewPager on earlier platform versions will - * be ignored.

- */ - public interface PageTransformer { - /** - * Apply a property transformation to the given page. - * - * @param page Apply the transformation to this page - * @param position Position of page relative to the current front-and-center - * position of the pager. 0 is front and center. 1 is one full - * page position to the right, and -1 is one page position to the left. - */ - public void transformPage(View page, float position); - - } - - /** - * Used internally to monitor when adapters are switched. - */ - interface OnAdapterChangeListener { - public void onAdapterChanged(PagerAdapter oldAdapter, PagerAdapter newAdapter); - } - - /** - * Used internally to tag special types of child views that should be added as - * pager decorations by default. - */ - interface Decor {} - - public ViewPagerEx(Context context) { - super(context); - initViewPager(); - } - - public ViewPagerEx(Context context, AttributeSet attrs) { - super(context, attrs); - initViewPager(); - } void initViewPager() { setWillNotDraw(false); @@ -416,6 +286,26 @@ private void setScrollState(int newState) { } } + private void removeNonDecorViews() { + for (int i = 0; i < getChildCount(); i++) { + final View child = getChildAt(i); + final LayoutParams lp = (LayoutParams) child.getLayoutParams(); + if (!lp.isDecor) { + removeViewAt(i); + i--; + } + } + } + + /** + * Retrieve the current adapter supplying pages. + * + * @return The currently registered PagerAdapter + */ + public PagerAdapter getAdapter() { + return mAdapter; + } + /** * Set a PagerAdapter that will supply views for this pager as needed. * @@ -467,26 +357,6 @@ public void setAdapter(PagerAdapter adapter) { } } - private void removeNonDecorViews() { - for (int i = 0; i < getChildCount(); i++) { - final View child = getChildAt(i); - final LayoutParams lp = (LayoutParams) child.getLayoutParams(); - if (!lp.isDecor) { - removeViewAt(i); - i--; - } - } - } - - /** - * Retrieve the current adapter supplying pages. - * - * @return The currently registered PagerAdapter - */ - public PagerAdapter getAdapter() { - return mAdapter; - } - void setOnAdapterChangeListener(OnAdapterChangeListener listener) { mAdapterChangeListener = listener; } @@ -495,18 +365,6 @@ private int getClientWidth() { return getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); } - /** - * Set the currently selected page. If the ViewPager has already been through its first - * layout with its current adapter there will be a smooth animated transition between - * the current item and the specified item. - * - * @param item Item index to select - */ - public void setCurrentItem(int item) { - mPopulatePending = false; - setCurrentItemInternal(item, !mFirstLayout, false); - } - /** * Set the currently selected page. * @@ -522,6 +380,18 @@ public int getCurrentItem() { return mCurItem; } + /** + * Set the currently selected page. If the ViewPager has already been through its first + * layout with its current adapter there will be a smooth animated transition between + * the current item and the specified item. + * + * @param item Item index to select + */ + public void setCurrentItem(int item) { + mPopulatePending = false; + setCurrentItemInternal(item, !mFirstLayout, false); + } + void setCurrentItemInternal(int item, boolean smoothScroll, boolean always) { setCurrentItemInternal(item, smoothScroll, always, 0); } @@ -546,7 +416,7 @@ void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int // We are doing a jump by more than one page. To avoid // glitches, we want to keep all current pages in the view // until the scroll ends. - for (int i=0; i CREATOR - = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks() { - @Override - public SavedState createFromParcel(Parcel in, ClassLoader loader) { - return new SavedState(in, loader); - } - - @Override - public SavedState[] newArray(int size) { - return new SavedState[size]; - } - }); - - SavedState(Parcel in, ClassLoader loader) { - super(in); - if (loader == null) { - loader = getClass().getClassLoader(); - } - position = in.readInt(); - adapterState = in.readParcelable(loader); - this.loader = loader; + } + ii.offset = offset; + offset += ii.widthFactor + marginOffset; } + + mNeedCalculatePageOffsets = false; } @Override @@ -1291,7 +1108,7 @@ public void onRestoreInstanceState(Parcelable state) { return; } - SavedState ss = (SavedState)state; + SavedState ss = (SavedState) state; super.onRestoreInstanceState(ss.getSuperState()); if (mAdapter != null) { @@ -1340,7 +1157,7 @@ public void removeView(View view) { } ItemInfo infoForChild(View child) { - for (int i=0; i mTouchSlop && xDiff > yDiff) { if (DEBUG) Log.v(TAG, "Starting drag!"); mIsBeingDragged = true; @@ -2622,15 +2440,15 @@ private Rect getChildRectInPagerCoordinates(Rect outRect, View child) { boolean pageLeft() { if (mCurItem > 0) { - setCurrentItem(mCurItem-1, true); + setCurrentItem(mCurItem - 1, true); return true; } return false; } boolean pageRight() { - if (mAdapter != null && mCurItem < (mAdapter.getCount()-1)) { - setCurrentItem(mCurItem+1, true); + if (mAdapter != null && mCurItem < (mAdapter.getCount() - 1)) { + setCurrentItem(mCurItem + 1, true); return true; } return false; @@ -2775,70 +2593,158 @@ public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) { return new LayoutParams(getContext(), attrs); } - class MyAccessibilityDelegate extends AccessibilityDelegateCompat { + /** + * Callback interface for responding to changing state of the selected page. + */ + public interface OnPageChangeListener { + + /** + * This method will be invoked when the current page is scrolled, either as part + * of a programmatically initiated smooth scroll or a user initiated touch scroll. + * + * @param position Position index of the first page currently being displayed. + * Page position+1 will be visible if positionOffset is nonzero. + * @param positionOffset Value from [0, 1) indicating the offset from the page at position. + * @param positionOffsetPixels Value in pixels indicating the offset from position. + */ + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels); + + /** + * This method will be invoked when a new page becomes selected. Animation is not + * necessarily complete. + * + * @param position Position index of the new selected page. + */ + public void onPageSelected(int position); + + /** + * Called when the scroll state changes. Useful for discovering when the user + * begins dragging, when the pager is automatically settling to the current page, + * or when it is fully stopped/idle. + * + * @param state The new scroll state. + * @see ViewPagerEx#SCROLL_STATE_IDLE + * @see ViewPagerEx#SCROLL_STATE_DRAGGING + * @see ViewPagerEx#SCROLL_STATE_SETTLING + */ + public void onPageScrollStateChanged(int state); + } + + /** + * A PageTransformer is invoked whenever a visible/attached page is scrolled. + * This offers an opportunity for the application to apply a custom transformation + * to the page views using animation properties. + * + *

As property animation is only supported as of Android 3.0 and forward, + * setting a PageTransformer on a ViewPager on earlier platform versions will + * be ignored.

+ */ + public interface PageTransformer { + /** + * Apply a property transformation to the given page. + * + * @param page Apply the transformation to this page + * @param position Position of page relative to the current front-and-center + * position of the pager. 0 is front and center. 1 is one full + * page position to the right, and -1 is one page position to the left. + */ + public void transformPage(View page, float position); + } + + /** + * Used internally to monitor when adapters are switched. + */ + interface OnAdapterChangeListener { + public void onAdapterChanged(PagerAdapter oldAdapter, PagerAdapter newAdapter); + } + + /** + * Used internally to tag special types of child views that should be added as + * pager decorations by default. + */ + interface Decor { + } + + static class ItemInfo { + Object object; + int position; + boolean scrolling; + float widthFactor; + float offset; + } + + /** + * Simple implementation of the {@link OnPageChangeListener} interface with stub + * implementations of each method. Extend this if you do not intend to override + * every method of {@link OnPageChangeListener}. + */ + public static class SimpleOnPageChangeListener implements OnPageChangeListener { @Override - public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { - super.onInitializeAccessibilityEvent(host, event); - event.setClassName(ViewPagerEx.class.getName()); - final AccessibilityRecordCompat recordCompat = AccessibilityRecordCompat.obtain(); - recordCompat.setScrollable(canScroll()); - if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED - && mAdapter != null) { - recordCompat.setItemCount(mAdapter.getCount()); - recordCompat.setFromIndex(mCurItem); - recordCompat.setToIndex(mCurItem); - } + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + // This space for rent } @Override - public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { - super.onInitializeAccessibilityNodeInfo(host, info); - info.setClassName(ViewPagerEx.class.getName()); - info.setScrollable(canScroll()); - if (canScrollHorizontally(1)) { - info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD); - } - if (canScrollHorizontally(-1)) { - info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD); - } + public void onPageSelected(int position) { + // This space for rent } @Override - public boolean performAccessibilityAction(View host, int action, Bundle args) { - if (super.performAccessibilityAction(host, action, args)) { - return true; + public void onPageScrollStateChanged(int state) { + // This space for rent + } + } + + /** + * This is the persistent state that is saved by ViewPager. Only needed + * if you are creating a sublass of ViewPager that must save its own + * state, in which case it should implement a subclass of this which + * contains that state. + */ + public static class SavedState extends BaseSavedState { + public static final Parcelable.Creator CREATOR + = ParcelableCompat.newCreator(new ParcelableCompatCreatorCallbacks() { + @Override + public SavedState createFromParcel(Parcel in, ClassLoader loader) { + return new SavedState(in, loader); } - switch (action) { - case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: { - if (canScrollHorizontally(1)) { - setCurrentItem(mCurItem + 1); - return true; - } - } return false; - case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: { - if (canScrollHorizontally(-1)) { - setCurrentItem(mCurItem - 1); - return true; - } - } return false; + + @Override + public SavedState[] newArray(int size) { + return new SavedState[size]; } - return false; + }); + int position; + Parcelable adapterState; + ClassLoader loader; + + public SavedState(Parcelable superState) { + super(superState); } - private boolean canScroll() { - return (mAdapter != null) && (mAdapter.getCount() > 1); + SavedState(Parcel in, ClassLoader loader) { + super(in); + if (loader == null) { + loader = getClass().getClassLoader(); + } + position = in.readInt(); + adapterState = in.readParcelable(loader); + this.loader = loader; } - } - private class PagerObserver extends DataSetObserver { @Override - public void onChanged() { - dataSetChanged(); + public void writeToParcel(Parcel out, int flags) { + super.writeToParcel(out, flags); + out.writeInt(position); + out.writeParcelable(adapterState, flags); } + @Override - public void onInvalidated() { - dataSetChanged(); + public String toString() { + return "FragmentPager.SavedState{" + + Integer.toHexString(System.identityHashCode(this)) + + " position=" + position + "}"; } } @@ -2905,4 +2811,74 @@ public int compare(View lhs, View rhs) { return llp.position - rlp.position; } } + + class MyAccessibilityDelegate extends AccessibilityDelegateCompat { + + @Override + public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) { + super.onInitializeAccessibilityEvent(host, event); + event.setClassName(ViewPagerEx.class.getName()); + final AccessibilityRecordCompat recordCompat = AccessibilityRecordCompat.obtain(); + recordCompat.setScrollable(canScroll()); + if (event.getEventType() == AccessibilityEventCompat.TYPE_VIEW_SCROLLED + && mAdapter != null) { + recordCompat.setItemCount(mAdapter.getCount()); + recordCompat.setFromIndex(mCurItem); + recordCompat.setToIndex(mCurItem); + } + } + + @Override + public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) { + super.onInitializeAccessibilityNodeInfo(host, info); + info.setClassName(ViewPagerEx.class.getName()); + info.setScrollable(canScroll()); + if (canScrollHorizontally(1)) { + info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD); + } + if (canScrollHorizontally(-1)) { + info.addAction(AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD); + } + } + + @Override + public boolean performAccessibilityAction(View host, int action, Bundle args) { + if (super.performAccessibilityAction(host, action, args)) { + return true; + } + switch (action) { + case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD: { + if (canScrollHorizontally(1)) { + setCurrentItem(mCurItem + 1); + return true; + } + } + return false; + case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD: { + if (canScrollHorizontally(-1)) { + setCurrentItem(mCurItem - 1); + return true; + } + } + return false; + } + return false; + } + + private boolean canScroll() { + return (mAdapter != null) && (mAdapter.getCount() > 1); + } + } + + private class PagerObserver extends DataSetObserver { + @Override + public void onChanged() { + dataSetChanged(); + } + + @Override + public void onInvalidated() { + dataSetChanged(); + } + } } diff --git a/library/src/main/res/drawable/indicator_corner_bg.xml b/library/src/main/res/drawable/indicator_corner_bg.xml index 431871b..8707be0 100644 --- a/library/src/main/res/drawable/indicator_corner_bg.xml +++ b/library/src/main/res/drawable/indicator_corner_bg.xml @@ -1,9 +1,9 @@ - + - - + + \ No newline at end of file diff --git a/library/src/main/res/layout/indicator_layout.xml b/library/src/main/res/layout/indicator_layout.xml index 708880a..f02476d 100644 --- a/library/src/main/res/layout/indicator_layout.xml +++ b/library/src/main/res/layout/indicator_layout.xml @@ -1,8 +1,8 @@ - \ No newline at end of file + android:orientation="horizontal"> \ No newline at end of file diff --git a/library/src/main/res/layout/render_type_default.xml b/library/src/main/res/layout/render_type_default.xml index 6f714aa..db9b9b8 100644 --- a/library/src/main/res/layout/render_type_default.xml +++ b/library/src/main/res/layout/render_type_default.xml @@ -1,14 +1,17 @@ + android:layout_width="match_parent" + android:layout_height="match_parent"> + + + android:layout_height="wrap_content" + android:layout_centerInParent="true" /> \ No newline at end of file diff --git a/library/src/main/res/layout/render_type_text.xml b/library/src/main/res/layout/render_type_text.xml index f70b7b0..b389142 100644 --- a/library/src/main/res/layout/render_type_text.xml +++ b/library/src/main/res/layout/render_type_text.xml @@ -1,30 +1,35 @@ + android:layout_width="match_parent" + android:layout_height="match_parent"> + + + android:layout_height="wrap_content" + android:layout_centerInParent="true" /> + - - + android:minHeight="30dp" + android:orientation="vertical" + android:paddingLeft="10dp"> + + + \ No newline at end of file diff --git a/library/src/main/res/layout/slider_layout.xml b/library/src/main/res/layout/slider_layout.xml index 01fcf0d..747dab8 100644 --- a/library/src/main/res/layout/slider_layout.xml +++ b/library/src/main/res/layout/slider_layout.xml @@ -2,63 +2,70 @@ + android:layout_width="match_parent" + android:layout_height="match_parent"> + android:layout_height="wrap_content" /> + + android:paddingBottom="10dp" + custom:shape="oval" /> + + android:paddingRight="10dp" /> + + android:paddingLeft="10dp" /> + + android:gravity="center" + android:paddingTop="10dp" /> + + android:paddingTop="10dp" /> + + android:paddingTop="10dp" /> \ No newline at end of file diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml index 584d13e..52fa4ab 100644 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -4,11 +4,11 @@ - - + + - + @@ -31,55 +31,55 @@ - + - - + + - - + + - - + + - - + + - - + + - - + + - - - - + + + + - - - - + + + + - - - - + + + + - - + + \ No newline at end of file diff --git a/library/src/main/res/values/styles.xml b/library/src/main/res/values/styles.xml index f8d0ad2..ea6920f 100644 --- a/library/src/main/res/values/styles.xml +++ b/library/src/main/res/values/styles.xml @@ -1,5 +1,6 @@ +