diff --git a/README.md b/README.md index d8b8b5e..65ffa0c 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,15 @@ I wrote this library just because I want a lightweight slider. >Use your own imageloader; >Create your own indicator; ->Variety of transition effects; ->Customize the animation of each page. +>Variety of transition effects. -~(~ ̄▽ ̄)~ +这是一款轻量级的图片轮播器,它包括了一下几个特点: -## Demo +>与图片加载框架完全解耦; +>内置常用的指示器,基本满足对指示器的需求; +>丰富多彩的转场动画,亦可以发挥你的创意创造新的特效; +>内置不同款式的轮播器。 -[中文文档](http://www.cpacm.net/2016/06/03/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%EF%BC%9A%E4%B8%80%E4%B8%AA%E9%AB%98%E5%BA%A6%E8%87%AA%E7%94%B1%E7%9A%84%E8%BD%BB%E9%87%8F%E5%8C%96Slider/) - -![simpleslider](https://raw.githubusercontent.com/cpacm/SimpleSlider/develop/pic/simpleslider.png) ## How to use @@ -20,15 +19,41 @@ I wrote this library just because I want a lightweight slider. ```groovy dependencies { - compile 'com.cpacm.simpleslider:library:2.0.0' + compile 'com.cpacm.simpleslider:library:2.1.0' } ``` - + +### Add the slider to your layout +```xml + + + +``` + +### Config in your code + +```java +simpleSlider.setInfiniteEnable(true); +simpleSlider.startAutoScroll(true); +simpleSlider.setSliderDuration(3000); +simpleSlider.setSliderTransformDuration(DEFAULT_SCROLL_DURATION, new SpringInterpolator()); +simpleSlider.setPageTransformer(new ZoomOutSlideTransformer()); +circlePageIndicator = (CirclePageIndicator) findViewById(R.id.indicator); +circlePageIndicator.setViewPager(simpleSlider); +``` + ## Advanced usage +### Basic +![indicator](https://raw.githubusercontent.com/cpacm/SimpleSlider/develop/pic/BasicSlider.gif) + + ### Indicator -![indicator](https://raw.githubusercontent.com/cpacm/SimpleSlider/develop/pic/simpleslider_indicator.gif) +![indicator](https://raw.githubusercontent.com/cpacm/SimpleSlider/develop/pic/IndicatorSlider.gif) - `CirclePageIndicator` - `IconPageIndicator` @@ -44,17 +69,12 @@ Modify from [SpringIndicator](https://github.com/chenupt/SpringIndicator) **You can customize the indicator implements `PageIndicator`** ### Transform -![Transform](https://raw.githubusercontent.com/cpacm/SimpleSlider/develop/pic/simpleslider_transform.gif) +![Transform](https://raw.githubusercontent.com/cpacm/SimpleSlider/develop/pic/TransformSlider.gif) The above transforms come from [AndroidImageSlider](https://github.com/daimajia/AndroidImageSlider) **You can customize the transform extends `BaseTransformer`** -### Animation -![Transform](https://raw.githubusercontent.com/cpacm/SimpleSlider/develop/pic/simpleslider_animation.gif) - -**You can customize the animation implements `OnAnimationListener`** - ## **Note:** **In the infinite loop mode, at least three sliders.** **Android API >= 3.0** @@ -62,7 +82,7 @@ The above transforms come from [AndroidImageSlider](https://github.com/daimajia/ License --- - Copyright 2016 cpacm + Copyright 2018 cpacm Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/app/build.gradle b/app/build.gradle index 014e408..6a17216 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.cpacm.simpleslider" minSdkVersion 15 targetSdkVersion 27 - versionCode 2 - versionName "2.0" + versionCode 5 + versionName "2.1.0" } buildTypes { release { diff --git a/app/src/main/java/com/cpacm/simpleslider/BasicActivity.java b/app/src/main/java/com/cpacm/simpleslider/BasicActivity.java index f88e026..ccaf87d 100644 --- a/app/src/main/java/com/cpacm/simpleslider/BasicActivity.java +++ b/app/src/main/java/com/cpacm/simpleslider/BasicActivity.java @@ -3,8 +3,8 @@ import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; -import android.view.Menu; import android.view.MenuItem; +import android.view.animation.Interpolator; import com.cpacm.library.SimpleViewPager; import com.cpacm.library.transformers.CyclePageTransformer; @@ -12,9 +12,10 @@ import com.cpacm.library.indicator.ViewpagerIndicator.CirclePageIndicator; public class BasicActivity extends AppCompatActivity { + private final static int DEFAULT_SCROLL_DURATION = 500; - private SimpleViewPager simpleSlider; - private CirclePageIndicator circlePageIndicator; + + SimpleViewPager simpleSlider, simpleSlider2; @Override protected void onCreate(Bundle savedInstanceState) { @@ -27,9 +28,13 @@ protected void onCreate(Bundle savedInstanceState) { simpleSlider = (SimpleViewPager) findViewById(R.id.simple_slider); simpleSlider.setAdapter(new BasicPagerAdapter(this)); simpleSlider.startAutoScroll(true); - simpleSlider.setPageTransformer(new CyclePageTransformer(simpleSlider));//翻页动画 - //circlePageIndicator = (CirclePageIndicator) findViewById(R.id.indicator); - //simpleSlider.setViewPagerIndicator(circlePageIndicator);//为viewpager设置指示器 + simpleSlider.setSliderTransformDuration(DEFAULT_SCROLL_DURATION, new SpringInterpolator()); + + simpleSlider2 = (SimpleViewPager) findViewById(R.id.simple_slider2); + simpleSlider2.setAdapter(new BasicPagerAdapter(this)); + simpleSlider2.startAutoScroll(true); + simpleSlider2.setPageTransformer(new CyclePageTransformer(simpleSlider2));//翻页动画 + } @Override @@ -43,4 +48,16 @@ public boolean onOptionsItemSelected(MenuItem item) { } return super.onOptionsItemSelected(item); } + + //spring interpolator + private final class SpringInterpolator implements Interpolator { + + private final static float FACTOR = 0.5F; + + @Override + public float getInterpolation(final float input) { + return (float) (Math.pow(2.0F, -10.0F * input) * + Math.sin((input - FACTOR / 4.0F) * (2.0F * Math.PI) / FACTOR) + 1.0F); + } + } } diff --git a/app/src/main/java/com/cpacm/simpleslider/IndicatorActivity.java b/app/src/main/java/com/cpacm/simpleslider/IndicatorActivity.java index f4ab349..cbb7fbf 100644 --- a/app/src/main/java/com/cpacm/simpleslider/IndicatorActivity.java +++ b/app/src/main/java/com/cpacm/simpleslider/IndicatorActivity.java @@ -76,13 +76,6 @@ protected void onCreate(Bundle savedInstanceState) { springIndicator.setViewPager(simpleSliderLayout); } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will @@ -92,11 +85,7 @@ public boolean onOptionsItemSelected(MenuItem item) { if (id == android.R.id.home) { finish(); } - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; - } - return super.onOptionsItemSelected(item); } + } diff --git a/app/src/main/java/com/cpacm/simpleslider/SliderActivity.java b/app/src/main/java/com/cpacm/simpleslider/SliderActivity.java index 4c17462..f626ce7 100644 --- a/app/src/main/java/com/cpacm/simpleslider/SliderActivity.java +++ b/app/src/main/java/com/cpacm/simpleslider/SliderActivity.java @@ -17,6 +17,7 @@ package com.cpacm.simpleslider; import android.content.Intent; +import android.support.design.widget.Snackbar; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; @@ -74,6 +75,7 @@ public boolean onOptionsItemSelected(MenuItem item) { //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { + Snackbar.make(getWindow().getDecorView().findViewById(android.R.id.content), "SimpleSlider created by cpacm!", Snackbar.LENGTH_SHORT).show(); return true; } diff --git a/app/src/main/java/com/cpacm/simpleslider/TransformActivity.java b/app/src/main/java/com/cpacm/simpleslider/TransformActivity.java index 43e35b4..0ab9a23 100644 --- a/app/src/main/java/com/cpacm/simpleslider/TransformActivity.java +++ b/app/src/main/java/com/cpacm/simpleslider/TransformActivity.java @@ -33,18 +33,22 @@ import com.cpacm.library.transformers.BackgroundToForegroundTransformer; import com.cpacm.library.transformers.BaseTransformer; import com.cpacm.library.transformers.CubeInTransformer; +import com.cpacm.library.transformers.CubeOutTransformer; import com.cpacm.library.transformers.DefaultTransformer; import com.cpacm.library.transformers.DepthPageTransformer; +import com.cpacm.library.transformers.DrawerTransformer; import com.cpacm.library.transformers.FadeTransformer; import com.cpacm.library.transformers.FlipHorizontalTransformer; import com.cpacm.library.transformers.FlipPageViewTransformer; import com.cpacm.library.transformers.ForegroundToBackgroundTransformer; import com.cpacm.library.transformers.RotateDownTransformer; import com.cpacm.library.transformers.RotateUpTransformer; +import com.cpacm.library.transformers.ScaleInOutTransformer; import com.cpacm.library.transformers.StackTransformer; import com.cpacm.library.transformers.TabletTransformer; import com.cpacm.library.transformers.ZoomInTransformer; import com.cpacm.library.transformers.ZoomOutSlideTransformer; +import com.cpacm.library.transformers.ZoomOutTransformer; import java.util.ArrayList; import java.util.List; @@ -65,6 +69,7 @@ protected void onCreate(Bundle savedInstanceState) { setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); simpleViewPager = (SimpleViewPager) findViewById(R.id.simple_slider); + simpleViewPager.startAutoScroll(true); initTransforms(); @@ -77,13 +82,6 @@ protected void onCreate(Bundle savedInstanceState) { } - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // Inflate the menu; this adds items to the action bar if it is present. - getMenuInflater().inflate(R.menu.menu_main, menu); - return true; - } - @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will @@ -93,28 +91,34 @@ public boolean onOptionsItemSelected(MenuItem item) { if (id == android.R.id.home) { finish(); } - //noinspection SimplifiableIfStatement - if (id == R.id.action_settings) { - return true; - } - return super.onOptionsItemSelected(item); } public class TransformAdapter extends RecyclerView.Adapter { + private int selectIndex = -1; + @Override public NormalTextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new NormalTextViewHolder(LayoutInflater.from(TransformActivity.this).inflate(R.layout.list_item, parent, false)); } @Override - public void onBindViewHolder(NormalTextViewHolder holder, final int position) { + public void onBindViewHolder(final NormalTextViewHolder holder, final int position) { holder.mTextView.setText(transformerNames.get(position)); + if (selectIndex == position) { + holder.mTextView.setTextColor(getResources().getColor(R.color.colorPrimary)); + } else { + holder.mTextView.setTextColor(getResources().getColor(android.R.color.black)); + } holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { simpleViewPager.setPageTransformer(transformers.get(position)); + int lastPosition = selectIndex; + selectIndex = position; + notifyItemChanged(lastPosition); + notifyItemChanged(selectIndex); } }); } @@ -139,48 +143,60 @@ private void initTransforms() { transformerNames = new ArrayList<>(); transformers.add(new AccordionTransformer()); - transformerNames.add("AccordionTransformer"); + transformerNames.add(AccordionTransformer.class.getSimpleName()); transformers.add(new BackgroundToForegroundTransformer()); - transformerNames.add("BackgroundToForegroundTransformer"); + transformerNames.add(BackgroundToForegroundTransformer.class.getSimpleName()); transformers.add(new CubeInTransformer()); - transformerNames.add("CubeInTransformer"); + transformerNames.add(CubeInTransformer.class.getSimpleName()); + + transformers.add(new CubeOutTransformer()); + transformerNames.add(CubeOutTransformer.class.getSimpleName()); transformers.add(new DefaultTransformer()); - transformerNames.add("DefaultTransformer"); + transformerNames.add(DefaultTransformer.class.getSimpleName()); transformers.add(new DepthPageTransformer()); - transformerNames.add("DepthPageTransformer"); + transformerNames.add(DepthPageTransformer.class.getSimpleName()); + + transformers.add(new DrawerTransformer()); + transformerNames.add(DrawerTransformer.class.getSimpleName()); transformers.add(new FadeTransformer()); - transformerNames.add("FadeTransformer"); + transformerNames.add(FadeTransformer.class.getSimpleName()); transformers.add(new FlipHorizontalTransformer()); - transformerNames.add("FlipHorizontalTransformer"); + transformerNames.add(FlipHorizontalTransformer.class.getSimpleName()); transformers.add(new FlipPageViewTransformer()); - transformerNames.add("FlipPageViewTransformer"); + transformerNames.add(FlipPageViewTransformer.class.getSimpleName()); transformers.add(new ForegroundToBackgroundTransformer()); - transformerNames.add("ForegroundToBackgroundTransformer"); + transformerNames.add(ForegroundToBackgroundTransformer.class.getSimpleName()); transformers.add(new RotateDownTransformer()); - transformerNames.add("RotateDownTransformer"); + transformerNames.add(RotateDownTransformer.class.getSimpleName()); transformers.add(new RotateUpTransformer()); - transformerNames.add("RotateUpTransformer"); + transformerNames.add(RotateUpTransformer.class.getSimpleName()); + + transformers.add(new ScaleInOutTransformer()); + transformerNames.add(ScaleInOutTransformer.class.getSimpleName()); transformers.add(new StackTransformer()); - transformerNames.add("StackTransformer"); + transformerNames.add(StackTransformer.class.getSimpleName()); transformers.add(new TabletTransformer()); - transformerNames.add("TabletTransformer"); + transformerNames.add(TabletTransformer.class.getSimpleName()); transformers.add(new ZoomInTransformer()); - transformerNames.add("ZoomInTransformer"); + transformerNames.add(ZoomInTransformer.class.getSimpleName()); transformers.add(new ZoomOutSlideTransformer()); - transformerNames.add("ZoomOutSlideTransformer"); + transformerNames.add(ZoomOutSlideTransformer.class.getSimpleName()); + + transformers.add(new ZoomOutTransformer()); + transformerNames.add(ZoomOutTransformer.class.getSimpleName()); } } diff --git a/app/src/main/res/layout/activity_basic.xml b/app/src/main/res/layout/activity_basic.xml index bbc5fb8..d71b985 100644 --- a/app/src/main/res/layout/activity_basic.xml +++ b/app/src/main/res/layout/activity_basic.xml @@ -17,15 +17,16 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" - app:titleTextColor="@android:color/white" - app:popupTheme="@style/AppTheme.PopupOverlay" /> + app:popupTheme="@style/AppTheme.PopupOverlay" + app:titleTextColor="@android:color/white" /> - + android:layout_height="164dp" + android:layout_marginTop="20dp" /> - + + + + + + + diff --git a/app/src/main/res/layout/activity_indicator.xml b/app/src/main/res/layout/activity_indicator.xml index 3d751c4..89a051f 100644 --- a/app/src/main/res/layout/activity_indicator.xml +++ b/app/src/main/res/layout/activity_indicator.xml @@ -26,15 +26,12 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" - android:paddingBottom="@dimen/activity_vertical_margin" - android:paddingLeft="@dimen/activity_horizontal_margin" - android:paddingRight="@dimen/activity_horizontal_margin" - android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context=".BasicActivity"> @@ -61,7 +58,7 @@ android:layout_height="wrap_content" android:layout_below="@id/slider_layout" android:layout_centerHorizontal="true" - android:layout_marginTop="16dp" + android:layout_marginTop="40dp" android:padding="4dp" app:fillColor="@color/colorPrimary" app:strokeColor="#000000" /> diff --git a/app/src/main/res/layout/activity_transform.xml b/app/src/main/res/layout/activity_transform.xml index 93173b2..5894352 100644 --- a/app/src/main/res/layout/activity_transform.xml +++ b/app/src/main/res/layout/activity_transform.xml @@ -17,8 +17,8 @@ android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" - app:titleTextColor="@android:color/white" - app:popupTheme="@style/AppTheme.PopupOverlay" /> + app:popupTheme="@style/AppTheme.PopupOverlay" + app:titleTextColor="@android:color/white" /> @@ -26,17 +26,14 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff" - android:paddingBottom="@dimen/activity_vertical_margin" - android:paddingLeft="@dimen/activity_horizontal_margin" - android:paddingRight="@dimen/activity_horizontal_margin" - android:paddingTop="@dimen/activity_vertical_margin" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context=".BasicActivity"> + android:layout_height="wrap_content" + android:layout_margin="16dp"> - + android:layout_height="match_parent" + android:layout_below="@id/slider_layout" + android:layout_margin="16dp" + app:cardCornerRadius="8dp"> + + + + - diff --git a/app/src/main/res/layout/content_slider.xml b/app/src/main/res/layout/content_slider.xml index af73866..961d6b4 100644 --- a/app/src/main/res/layout/content_slider.xml +++ b/app/src/main/res/layout/content_slider.xml @@ -20,7 +20,7 @@ android:layout_marginBottom="20dp" android:background="@color/colorPrimary" android:gravity="center" - android:text="Basic\n(基本使用)" + android:text="Basic\n(基本样式)" android:textColor="#ffffff" android:textSize="18sp" /> diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml index 625dfa6..b8bfae9 100644 --- a/app/src/main/res/layout/list_item.xml +++ b/app/src/main/res/layout/list_item.xml @@ -1,15 +1,12 @@ - + android:gravity="center" + tools:text="transform" + android:drawableBottom="@android:drawable/divider_horizontal_bright" + android:minHeight="?android:attr/listPreferredItemHeightSmall" /> - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1983c2a..07195fc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ SimpleSlider - Settings + author Basic Transform Indicator diff --git a/library/build.gradle b/library/build.gradle index b40b769..e5b717a 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' apply plugin: 'com.jfrog.bintray' -version = '1.0.4' +version = '2.1.0' android { compileSdkVersion 27 @@ -12,8 +12,8 @@ android { defaultConfig { minSdkVersion 11 targetSdkVersion 27 - versionCode 1 - versionName "1.0.4" + versionCode 5 + versionName "2.1.0" } buildTypes { release { @@ -104,9 +104,9 @@ bintray { issueTrackerUrl = 'https://github.com/cpacm/SimpleSlider/issues' publicDownloadNumbers = true version { - name = '1.0.4' + name = '2.1.0' desc = 'simple slider release' - vcsTag = '1.0.4' + vcsTag = '2.1.0' attributes = ['gradle-plugin': 'com.use.less:com.use.less.gradle:gradle-useless-plugin'] } } diff --git a/library/src/main/java/com/cpacm/library/SimpleSliderLayout.java b/library/src/main/java/com/cpacm/library/SimpleSliderLayout.java deleted file mode 100644 index 884f27e..0000000 --- a/library/src/main/java/com/cpacm/library/SimpleSliderLayout.java +++ /dev/null @@ -1,261 +0,0 @@ -/* - * Copyright (C) 2016 cpacm - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.cpacm.library; - -import android.content.Context; -import android.os.Handler; -import android.os.Message; -import android.support.v4.view.PagerAdapter; -import android.support.v4.view.ViewPager; -import android.util.AttributeSet; -import android.view.LayoutInflater; -import android.view.MotionEvent; -import android.view.View; -import android.view.animation.Interpolator; -import android.widget.RelativeLayout; - -import com.cpacm.library.indicator.PageIndicator; -import com.cpacm.library.infinite.FixedSpeedScroller; -import com.cpacm.library.infinite.InfinitePagerAdapter; - -import java.lang.reflect.Field; - -/** - * simple slider - * Auther: cpacm - * Date: 2016/3/8. - */ -public class SimpleSliderLayout extends RelativeLayout { - - private Context mContext; - private InfinitePagerAdapter infinitePagerAdapter; - private ViewPager simpleViewPager; - private boolean autoCycling = true, isCycling = true; - - /** - * the duration between animation. - */ - private long sliderDuration = 3000; - - private final Handler sliderHandler = new Handler() { - @Override - public void dispatchMessage(Message msg) { - super.dispatchMessage(msg); - if (msg.what == 0) { - moveNextPosition(true); - sendEmptyMessageDelayed(0, sliderDuration); - } - } - }; - - public SimpleSliderLayout(Context context) { - super(context); - init(context, null); - } - - public SimpleSliderLayout(Context context, AttributeSet attrs) { - super(context, attrs); - init(context, attrs); - } - - public SimpleSliderLayout(Context context, AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(context, attrs); - } - - public void init(Context context, AttributeSet attrs) { - mContext = context; - View parent = LayoutInflater.from(mContext).inflate(R.layout.simple_slider_layout, this, true); - simpleViewPager = parent.findViewById(R.id.simple_slider_viewpager); - } - - public void setAdapter(PagerAdapter pagerAdapter) { - infinitePagerAdapter = new InfinitePagerAdapter(pagerAdapter); - setCycling(true); - setAutoCycling(true); - } - - /** - * set transformer for viewpager - * - * @param transformer - */ - public void setPageTransformer(ViewPager.PageTransformer transformer) { - simpleViewPager.setPageTransformer(true, transformer); - } - - /** - * speed settings for page - * - * @param period - * @param interpolator - */ - public void setSliderTransformDuration(int period, Interpolator interpolator) { - try { - Field mScroller = ViewPager.class.getDeclaredField("mScroller"); - mScroller.setAccessible(true); - FixedSpeedScroller scroller = new FixedSpeedScroller(simpleViewPager.getContext(), interpolator, period); - mScroller.set(simpleViewPager, scroller); - } catch (Exception e) { - - } - } - - public void setSliderTransformDuration(int period) { - try { - Field mScroller = ViewPager.class.getDeclaredField("mScroller"); - mScroller.setAccessible(true); - FixedSpeedScroller scroller = new FixedSpeedScroller(simpleViewPager.getContext(), period); - mScroller.set(simpleViewPager, scroller); - } catch (Exception e) { - - } - } - - /** - * set pageindicator to the simple viewpager - * - * @param pageIndicator - */ - public void setViewPagerIndicator(PageIndicator pageIndicator) { - if (pageIndicator == null) return; - pageIndicator.setViewPager(simpleViewPager); - pageIndicator.notifyDataSetChanged(); - } - - @Override - public boolean dispatchTouchEvent(MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) - if (autoCycling) stopAutoCycling(); - if (event.getAction() == MotionEvent.ACTION_UP) - if (autoCycling) startAutoCycling(); - return super.dispatchTouchEvent(event); - } - - /** - * if cycling - * 是否无限循环 - * - * @param isCycling - */ - public void setCycling(boolean isCycling) { - this.isCycling = isCycling; - if (this.isCycling && infinitePagerAdapter.getRealCount() > 2) { - cycling(); - } else { - stopCycling(); - } - - } - - private void cycling() { - simpleViewPager.setAdapter(infinitePagerAdapter); - } - - private void stopCycling() { - simpleViewPager.setAdapter(infinitePagerAdapter.getRealAdapter()); - } - - /** - * if auto isCycling - * 是否自动循环 - * - * @param autoCycling - */ - public void setAutoCycling(boolean autoCycling) { - this.autoCycling = autoCycling; - if (autoCycling) startAutoCycling(); - else stopAutoCycling(); - } - - private void startAutoCycling() { - sliderHandler.removeMessages(0); - sliderHandler.sendEmptyMessageDelayed(0, sliderDuration); - } - - private void stopAutoCycling() { - sliderHandler.removeMessages(0); - } - - /** - * set time to flip page - * - * @param sliderDuration - */ - public void setSliderDuration(long sliderDuration) { - this.sliderDuration = sliderDuration; - } - - public void addOnPageChangeListener(final ViewPager.OnPageChangeListener listener) { - if (listener == null) return; - simpleViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - listener.onPageScrolled(position % infinitePagerAdapter.getRealCount(), positionOffset, positionOffsetPixels); - } - - @Override - public void onPageSelected(int position) { - listener.onPageSelected(position % infinitePagerAdapter.getRealCount()); - } - - @Override - public void onPageScrollStateChanged(int state) { - listener.onPageScrollStateChanged(state); - } - }); - } - - /** - * move to prev slide. - */ - public void movePrevPosition(boolean smooth) { - if (getRealAdapter() == null) - throw new IllegalStateException("You did not set a slider adapter"); - simpleViewPager.setCurrentItem(simpleViewPager.getCurrentItem() - 1, smooth); - } - - /** - * move to next slide. - */ - public void moveNextPosition(boolean smooth) { - - if (getRealAdapter() == null) - throw new IllegalStateException("You did not set a slider adapter"); - if (getRealAdapter().getCount() <= 2 || (!isCycling && simpleViewPager.getCurrentItem() == getRealAdapter().getCount() - 1)) - simpleViewPager.setCurrentItem(0, false); - else { - simpleViewPager.setCurrentItem(simpleViewPager.getCurrentItem() + 1, smooth); - } - } - - private PagerAdapter getRealAdapter() { - PagerAdapter adapter = simpleViewPager.getAdapter(); - if (adapter != null && adapter instanceof InfinitePagerAdapter) { - return ((InfinitePagerAdapter) adapter).getRealAdapter(); - } - return adapter; - } - - public void moveNextPosition() { - moveNextPosition(true); - } - - public ViewPager getViewPager() { - return simpleViewPager; - } -} diff --git a/library/src/main/java/com/cpacm/library/SimpleViewPager.java b/library/src/main/java/com/cpacm/library/SimpleViewPager.java index 3f8c3ee..48c0f38 100644 --- a/library/src/main/java/com/cpacm/library/SimpleViewPager.java +++ b/library/src/main/java/com/cpacm/library/SimpleViewPager.java @@ -27,7 +27,7 @@ public class SimpleViewPager extends ViewPager { private int count;//item count private boolean autoScroll = false; - private boolean isCycling = true; + private boolean infiniteEnable = true; private boolean scrollPositive = true; private boolean mIsDataSetChanged; @@ -62,11 +62,6 @@ public SimpleViewPager(@NonNull Context context, @Nullable AttributeSet attrs) { private void init(Context context, AttributeSet attributeSet) { - //resetScroller(); - } - - private void resetScroller() { - setSliderTransformDuration(DEFAULT_SCROLL_DURATION, new SpringInterpolator()); } /** @@ -87,7 +82,7 @@ public void setSliderTransformDuration(int period, Interpolator interpolator) { } public void setPageTransformer(PageTransformer transformer) { - setPageTransformer(false, transformer); + setPageTransformer(true, transformer); } @Override @@ -97,7 +92,7 @@ public void setPageTransformer(boolean reverseDrawingOrder, @Nullable PageTransf @Override public void setAdapter(@Nullable PagerAdapter adapter) { - if (adapter != null && adapter.getCount() >= MIN_CYCLE_COUNT) { + if (adapter != null && adapter.getCount() >= MIN_CYCLE_COUNT && infiniteEnable) { count = adapter.getCount(); infinitePagerAdapter = new InfinitePagerAdapter(adapter); super.setAdapter(infinitePagerAdapter); @@ -190,7 +185,7 @@ public void resetPager() { * @return */ public int getRealItem() { - if (getRealAdapter() == null || getRealAdapter().getCount() < MIN_CYCLE_COUNT) + if (getRealAdapter() == null || getRealAdapter().getCount() < MIN_CYCLE_COUNT || !infiniteEnable) return getCurrentItem(); return infinitePagerAdapter.getRealPosition(getCurrentItem()); } @@ -234,7 +229,7 @@ public void startAutoScroll(final boolean scrollPositive) { this.scrollPositive = scrollPositive; autoScrollHandler.removeCallbacks(autoScrollRunnable); - autoScrollHandler.postDelayed(autoScrollRunnable,sliderDuration); + autoScrollHandler.postDelayed(autoScrollRunnable, sliderDuration); } // Stop auto scroll @@ -244,6 +239,15 @@ public void stopAutoScroll() { autoScrollHandler.removeCallbacks(autoScrollRunnable); } + public boolean isInfiniteEnable() { + return infiniteEnable; + } + + public void setInfiniteEnable(boolean enableInfinite) { + this.infiniteEnable = enableInfinite; + setAdapter(getRealAdapter()); + } + @Override public void setOverScrollMode(final int overScrollMode) { super.setOverScrollMode(OVER_SCROLL_NEVER); @@ -278,16 +282,4 @@ public boolean isInitialItem() { public void setInitialItem(boolean initialItem) { this.isInitialItem = initialItem; } - - // Default spring interpolator - private final class SpringInterpolator implements Interpolator { - - private final static float FACTOR = 0.5F; - - @Override - public float getInterpolation(final float input) { - return (float) (Math.pow(2.0F, -10.0F * input) * - Math.sin((input - FACTOR / 4.0F) * (2.0F * Math.PI) / FACTOR) + 1.0F); - } - } } diff --git a/library/src/main/java/com/cpacm/library/indicator/SpringIndicator/SpringIndicator.java b/library/src/main/java/com/cpacm/library/indicator/SpringIndicator/SpringIndicator.java index 91123e3..891314a 100644 --- a/library/src/main/java/com/cpacm/library/indicator/SpringIndicator/SpringIndicator.java +++ b/library/src/main/java/com/cpacm/library/indicator/SpringIndicator/SpringIndicator.java @@ -170,6 +170,13 @@ private void addTabItems() { if (textBgResId != 0) { textView.setBackgroundResource(textBgResId); } + final int finalI = i; + textView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + viewPager.setCurrentItem(finalI); + } + }); textView.setLayoutParams(layoutParams); tabs.add(textView); tabContainer.addView(textView); diff --git a/library/src/main/java/com/cpacm/library/indicator/ViewpagerIndicator/IconPageIndicator.java b/library/src/main/java/com/cpacm/library/indicator/ViewpagerIndicator/IconPageIndicator.java index d2ff80d..24ceea8 100644 --- a/library/src/main/java/com/cpacm/library/indicator/ViewpagerIndicator/IconPageIndicator.java +++ b/library/src/main/java/com/cpacm/library/indicator/ViewpagerIndicator/IconPageIndicator.java @@ -27,6 +27,7 @@ import android.widget.ImageView; import com.cpacm.library.R; +import com.cpacm.library.SimpleViewPager; import com.cpacm.library.indicator.PageIndicator; import com.cpacm.library.infinite.InfinitePagerAdapter; @@ -131,13 +132,21 @@ public void setViewPager(ViewPager view) { public void notifyDataSetChanged() { if (iconList.size() == 0) return; + if (mViewPager.getAdapter() == null) return; mIconsLayout.removeAllViews(); int count = mViewPager.getAdapter().getCount(); if (mViewPager.getAdapter() instanceof InfinitePagerAdapter) { count = ((InfinitePagerAdapter) mViewPager.getAdapter()).getRealCount(); } for (int i = 0; i < count; i++) { - ImageView view = new ImageView(getContext(), null, R.attr.vpiIconPageIndicatorStyle); + final ImageView view = new ImageView(getContext(), null, R.attr.vpiIconPageIndicatorStyle); + final int finalI = i; + view.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + mViewPager.setCurrentItem(finalI); + } + }); view.setImageResource(iconList.get(i % iconList.size())); mIconsLayout.addView(view); } diff --git a/library/src/main/java/com/cpacm/library/transformers/AccordionTransformer.java b/library/src/main/java/com/cpacm/library/transformers/AccordionTransformer.java index 6211523..0b55cfe 100644 --- a/library/src/main/java/com/cpacm/library/transformers/AccordionTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/AccordionTransformer.java @@ -9,8 +9,8 @@ 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.setScaleX(position < 0 ? 1f + position : 1f - position); } } \ No newline at end of file diff --git a/library/src/main/java/com/cpacm/library/transformers/BackgroundToForegroundTransformer.java b/library/src/main/java/com/cpacm/library/transformers/BackgroundToForegroundTransformer.java index 5208169..94803f6 100644 --- a/library/src/main/java/com/cpacm/library/transformers/BackgroundToForegroundTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/BackgroundToForegroundTransformer.java @@ -4,21 +4,17 @@ 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); + @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); - 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); - } - - private static final float min(float val, float min) { - return val < min ? min : val; - } + view.setScaleX(scale); + view.setScaleY(scale); + view.setPivotX(width * 0.5f); + view.setPivotY(height * 0.5f); + view.setTranslationX(position < 0 ? width * position : -width * position * 0.25f); + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/BaseTransformer.java b/library/src/main/java/com/cpacm/library/transformers/BaseTransformer.java index 2c532ce..21bb2c0 100644 --- a/library/src/main/java/com/cpacm/library/transformers/BaseTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/BaseTransformer.java @@ -21,23 +21,112 @@ public abstract class BaseTransformer implements ViewPager.PageTransformer { */ protected abstract void onTransform(View view, float position); + + /** + * Apply a property transformation to the given page. For most use cases, this method should not be overridden. + * Instead use {@link #transformPage(android.view.View, float)} to perform typical transformations. + * + * @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. + */ @Override - public void transformPage(View view, float position) { - //initLocation(view); - onTransform(view, position); + public void transformPage(View page, float position) { + float clampedPosition = clampPosition(position); + + onPreTransform(page, clampedPosition); + onTransform(page, clampedPosition); + onPostTransform(page, clampedPosition); + } + + /** + * Clamp the position. This step is required for some Android 4 devices. + * The position is dependant on the range of the ViewPager and whether it supports infinite scrolling in both directions. + * + * @param position Position of page relative to the current front-and-center position of the pager. + * @return A value between -1 and 1 + */ + private float clampPosition(float position) { + if (position < -1f) { + return -1f; + } else if (position > 1f) { + return 1f; + } + return position; } - private void initLocation(View view) { - 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, 0); - ViewHelper.setAlpha(view, 1f); + /** + * If the position offset of a fragment is less than negative one or greater than one, returning true will set the + * fragment alpha to 0f. Otherwise fragment alpha is always defaulted to 1f. + * + * @return + */ + protected boolean hideOffscreenPages() { + return true; + } + + /** + * Indicates if the default animations of the view pager should be used. + * + * @return + */ + protected boolean isPagingEnabled() { + return false; + } + + /** + * Called each {@link #transformPage(android.view.View, float)} before {{@link #onTransform(android.view.View, float)}. + *

+ * The default implementation attempts to reset all view properties. This is useful when toggling transforms that do + * not modify the same page properties. For instance changing from a transformation that applies rotation to a + * transformation that fades can inadvertently leave a fragment stuck with a rotation or with some degree of applied + * alpha. + * + * @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. + */ + protected void onPreTransform(View page, float position) { + final float width = page.getWidth(); + + page.setRotationX(0); + page.setRotationY(0); + page.setRotation(0); + page.setScaleX(1); + page.setScaleY(1); + page.setPivotX(0); + page.setPivotY(0); + page.setTranslationY(0); + page.setTranslationX(isPagingEnabled() ? 0f : -width * position); + + if (hideOffscreenPages()) { + page.setAlpha(position <= -1f || position >= 1f ? 0f : 1f); + page.setEnabled(false); + } else { + page.setEnabled(true); + page.setAlpha(1f); + } + } + + /** + * Called each {@link #transformPage(android.view.View, float)} after {@link #onTransform(android.view.View, float)}. + * + * @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. + */ + protected void onPostTransform(View page, float position) { + } + + /** + * Same as {@link Math#min(double, double)} without double casting, zero closest to infinity handling, or NaN support. + * + * @param val + * @param min + * @return + */ + protected static final float min(float val, float min) { + return val < min ? min : val; } } \ No newline at end of file diff --git a/library/src/main/java/com/cpacm/library/transformers/CubeInTransformer.java b/library/src/main/java/com/cpacm/library/transformers/CubeInTransformer.java index d778019..4260854 100644 --- a/library/src/main/java/com/cpacm/library/transformers/CubeInTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/CubeInTransformer.java @@ -4,12 +4,17 @@ 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.setRotation(-90f * position); + } + + @Override + public boolean isPagingEnabled() { + return true; + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/CubeOutTransformer.java b/library/src/main/java/com/cpacm/library/transformers/CubeOutTransformer.java new file mode 100644 index 0000000..edffdcd --- /dev/null +++ b/library/src/main/java/com/cpacm/library/transformers/CubeOutTransformer.java @@ -0,0 +1,19 @@ +package com.cpacm.library.transformers; + +import android.view.View; + +public class CubeOutTransformer extends BaseTransformer { + + @Override + protected void onTransform(View view, float position) { + view.setPivotX(position < 0f ? view.getWidth() : 0f); + view.setPivotY(view.getHeight() * 0.5f); + view.setRotationY(90f * position); + } + + @Override + public boolean isPagingEnabled() { + return true; + } + +} diff --git a/library/src/main/java/com/cpacm/library/transformers/CyclePageTransformer.java b/library/src/main/java/com/cpacm/library/transformers/CyclePageTransformer.java index 87c7c60..02a982b 100644 --- a/library/src/main/java/com/cpacm/library/transformers/CyclePageTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/CyclePageTransformer.java @@ -91,6 +91,12 @@ public CyclePageTransformer(SimpleViewPager viewPager) { resetScaleBy(); } + @Override + public void transformPage(View page, float position) { + onTransform(page, position); + } + + @Override public void onTransform(final View page, final float position) { // Handle page layer and bounds visibility diff --git a/library/src/main/java/com/cpacm/library/transformers/DefaultTransformer.java b/library/src/main/java/com/cpacm/library/transformers/DefaultTransformer.java index 272a51b..1d40d50 100644 --- a/library/src/main/java/com/cpacm/library/transformers/DefaultTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/DefaultTransformer.java @@ -4,8 +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; + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/DepthPageTransformer.java b/library/src/main/java/com/cpacm/library/transformers/DepthPageTransformer.java index cf814bf..a343288 100644 --- a/library/src/main/java/com/cpacm/library/transformers/DepthPageTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/DepthPageTransformer.java @@ -5,23 +5,28 @@ public class DepthPageTransformer extends BaseTransformer { - 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); - } - } + private static final float MIN_SCALE = 0.75f; + + @Override + protected void onTransform(View view, float position) { + if (position <= 0f) { + view.setTranslationX(0f); + view.setScaleX(1f); + view.setScaleY(1f); + } else if (position <= 1f) { + final float scaleFactor = MIN_SCALE + (1 - MIN_SCALE) * (1 - Math.abs(position)); + view.setAlpha(1 - position); + view.setPivotY(0.5f * view.getHeight()); + view.setTranslationX(view.getWidth() * -position); + view.setScaleX(scaleFactor); + view.setScaleY(scaleFactor); + } + } + + @Override + protected boolean isPagingEnabled() { + return true; + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/DrawerTransformer.java b/library/src/main/java/com/cpacm/library/transformers/DrawerTransformer.java new file mode 100644 index 0000000..eae9e33 --- /dev/null +++ b/library/src/main/java/com/cpacm/library/transformers/DrawerTransformer.java @@ -0,0 +1,15 @@ +package com.cpacm.library.transformers; + +import android.view.View; + +public class DrawerTransformer extends BaseTransformer { + + @Override + protected void onTransform(View view, float position) { + if (position <= 0) { + view.setTranslationX(0); + } else if (position > 0 && position <= 1) { + view.setTranslationX(-view.getWidth() / 2 * position); + } + } +} diff --git a/library/src/main/java/com/cpacm/library/transformers/FadeTransformer.java b/library/src/main/java/com/cpacm/library/transformers/FadeTransformer.java index 02be43e..d82e4f6 100644 --- a/library/src/main/java/com/cpacm/library/transformers/FadeTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/FadeTransformer.java @@ -11,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.setAlpha(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.setAlpha(alpha); } // Page is active, make fully visible else if (position == 0) { - ViewHelper.setAlpha(view,1); + view.setAlpha(1); } } diff --git a/library/src/main/java/com/cpacm/library/transformers/FlipHorizontalTransformer.java b/library/src/main/java/com/cpacm/library/transformers/FlipHorizontalTransformer.java index 59436d9..39038c6 100644 --- a/library/src/main/java/com/cpacm/library/transformers/FlipHorizontalTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/FlipHorizontalTransformer.java @@ -4,13 +4,25 @@ 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.setAlpha(rotation > 90f || rotation < -90f ? 0 : 1); + view.setPivotY(view.getHeight() * 0.5f); + view.setPivotX(view.getWidth() * 0.5f); + view.setRotationY(rotation); + } + + @Override + protected void onPostTransform(View page, float position) { + super.onPostTransform(page, position); + + //resolve problem: new page can't handle click event! + if (position > -0.5f && position < 0.5f) { + page.setVisibility(View.VISIBLE); + } else { + page.setVisibility(View.INVISIBLE); + } + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/FlipPageViewTransformer.java b/library/src/main/java/com/cpacm/library/transformers/FlipPageViewTransformer.java index 2de8948..a8b0249 100644 --- a/library/src/main/java/com/cpacm/library/transformers/FlipPageViewTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/FlipPageViewTransformer.java @@ -10,7 +10,7 @@ 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,19 +30,19 @@ private void setVisibility(View page, float position) { private void setTranslation(View view) { ViewPager viewPager = (ViewPager) view.getParent(); int scroll = viewPager.getScrollX() - view.getLeft(); - ViewHelper.setTranslationX(view,scroll); + view.setTranslationX(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.setScaleX((position != 0 && position != 1) ? percentage : 1); + view.setScaleY((position != 0 && position != 1) ? percentage : 1); } private void setRotation(View view, float position, float percentage) { if (position > 0) { - ViewHelper.setRotationY(view,-180 * (percentage + 1)); + view.setRotationY(-180 * (percentage + 1)); } else { - ViewHelper.setRotationY(view,180 * (percentage + 1)); + view.setRotationY(180 * (percentage + 1)); } } } \ No newline at end of file diff --git a/library/src/main/java/com/cpacm/library/transformers/ForegroundToBackgroundTransformer.java b/library/src/main/java/com/cpacm/library/transformers/ForegroundToBackgroundTransformer.java index 56ad781..0664ac3 100644 --- a/library/src/main/java/com/cpacm/library/transformers/ForegroundToBackgroundTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/ForegroundToBackgroundTransformer.java @@ -5,21 +5,17 @@ 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); + @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); - 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); - } - - private static final float min(float val, float min) { - return val < min ? min : val; - } + view.setScaleX(scale); + view.setScaleY(scale); + view.setPivotX(width * 0.5f); + view.setPivotY(height * 0.5f); + view.setTranslationX(position > 0 ? width * position : -width * position * 0.25f); + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/RotateDownTransformer.java b/library/src/main/java/com/cpacm/library/transformers/RotateDownTransformer.java index 966534d..6b1f370 100644 --- a/library/src/main/java/com/cpacm/library/transformers/RotateDownTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/RotateDownTransformer.java @@ -4,17 +4,21 @@ 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; - ViewHelper.setPivotX(view,width * 0.5f); - ViewHelper.setPivotY(view,height); - ViewHelper.setRotation(view,rotation); - } + view.setPivotX(width * 0.5f); + view.setPivotY(height); + view.setRotation(rotation); + } + @Override + protected boolean isPagingEnabled() { + return true; + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/RotateUpTransformer.java b/library/src/main/java/com/cpacm/library/transformers/RotateUpTransformer.java index a64ac05..1879ac3 100644 --- a/library/src/main/java/com/cpacm/library/transformers/RotateUpTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/RotateUpTransformer.java @@ -4,17 +4,22 @@ 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; - ViewHelper.setPivotX(view,width * 0.5f); - ViewHelper.setPivotY(view,0f); - ViewHelper.setTranslationX(view,0f); - ViewHelper.setRotation(view,rotation); - } + view.setPivotX(width * 0.5f); + view.setPivotY(0f); + view.setTranslationX(0f); + view.setRotation(rotation); + } + + @Override + protected boolean isPagingEnabled() { + return true; + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/ScaleInOutTransformer.java b/library/src/main/java/com/cpacm/library/transformers/ScaleInOutTransformer.java new file mode 100644 index 0000000..d785ccd --- /dev/null +++ b/library/src/main/java/com/cpacm/library/transformers/ScaleInOutTransformer.java @@ -0,0 +1,22 @@ +package com.cpacm.library.transformers; + +import android.view.View; + +/** + *

+ * + * @author cpacm 2018/6/6 + */ +public class ScaleInOutTransformer extends BaseTransformer { + + @Override + protected void onTransform(View view, float position) { + + view.setPivotX(position < 0 ? 0 : view.getWidth()); + view.setPivotY(view.getHeight() / 2f); + float scale = position < 0 ? 1f + position : 1f - position; + view.setScaleX(scale); + view.setScaleY(scale); + + } +} diff --git a/library/src/main/java/com/cpacm/library/transformers/StackTransformer.java b/library/src/main/java/com/cpacm/library/transformers/StackTransformer.java index d1b39cf..8b7a7c3 100644 --- a/library/src/main/java/com/cpacm/library/transformers/StackTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/StackTransformer.java @@ -6,7 +6,7 @@ public class StackTransformer extends BaseTransformer { @Override protected void onTransform(View view, float position) { - ViewHelper.setTranslationX(view,position < 0 ? 0f : -view.getWidth() * position); + view.setTranslationX(position < 0 ? 0f : -view.getWidth() * position); } } diff --git a/library/src/main/java/com/cpacm/library/transformers/TabletTransformer.java b/library/src/main/java/com/cpacm/library/transformers/TabletTransformer.java index dda2e4d..8943bc3 100644 --- a/library/src/main/java/com/cpacm/library/transformers/TabletTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/TabletTransformer.java @@ -6,33 +6,33 @@ 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]; + + @Override + protected void onTransform(View view, float position) { + final float rotation = (position < 0 ? 30f : -30f) * Math.abs(position); + + view.setTranslationX(getOffsetXForRotation(rotation, view.getWidth(), view.getHeight())); + view.setPivotX(view.getWidth() * 0.5f); + view.setPivotY(0); + view.setRotationY(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); + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/ViewHelper.java b/library/src/main/java/com/cpacm/library/transformers/ViewHelper.java deleted file mode 100644 index 1957b6f..0000000 --- a/library/src/main/java/com/cpacm/library/transformers/ViewHelper.java +++ /dev/null @@ -1,242 +0,0 @@ -package com.cpacm.library.transformers; - -/** - * user for android 3.0+ - * Auther: cpacm - * Date: 2016/3/18 0018 - */ - -import android.view.View; - - -public final class ViewHelper { - private ViewHelper() { - } - - public static float getAlpha(View view) { - return Honeycomb.getAlpha(view); - } - - public static void setAlpha(View view, float alpha) { - Honeycomb.setAlpha(view, alpha); - } - - public static float getPivotX(View view) { - return Honeycomb.getPivotX(view); - } - - public static void setPivotX(View view, float pivotX) { - Honeycomb.setPivotX(view, pivotX); - } - - public static float getPivotY(View view) { - return Honeycomb.getPivotY(view); - } - - public static void setPivotY(View view, float pivotY) { - Honeycomb.setPivotY(view, pivotY); - } - - public static float getRotation(View view) { - return Honeycomb.getRotation(view); - } - - public static void setRotation(View view, float rotation) { - Honeycomb.setRotation(view, rotation); - } - - public static float getRotationX(View view) { - return Honeycomb.getRotationX(view); - } - - public static void setRotationX(View view, float rotationX) { - Honeycomb.setRotationX(view, rotationX); - } - - public static float getRotationY(View view) { - return Honeycomb.getRotationY(view); - } - - public static void setRotationY(View view, float rotationY) { - Honeycomb.setRotationY(view, rotationY); - } - - public static float getScaleX(View view) { - return Honeycomb.getScaleX(view); - } - - public static void setScaleX(View view, float scaleX) { - Honeycomb.setScaleX(view, scaleX); - } - - public static float getScaleY(View view) { - return Honeycomb.getScaleY(view); - } - - public static void setScaleY(View view, float scaleY) { - Honeycomb.setScaleY(view, scaleY); - } - - public static float getScrollX(View view) { - return Honeycomb.getScrollX(view); - } - - public static void setScrollX(View view, int scrollX) { - Honeycomb.setScrollX(view, scrollX); - } - - public static float getScrollY(View view) { - return Honeycomb.getScrollY(view); - } - - public static void setScrollY(View view, int scrollY) { - Honeycomb.setScrollY(view, scrollY); - } - - public static float getTranslationX(View view) { - return Honeycomb.getTranslationX(view); - } - - public static void setTranslationX(View view, float translationX) { - Honeycomb.setTranslationX(view, translationX); - } - - public static float getTranslationY(View view) { - return Honeycomb.getTranslationY(view); - } - - public static void setTranslationY(View view, float translationY) { - Honeycomb.setTranslationY(view, translationY); - } - - public static float getX(View view) { - return Honeycomb.getX(view); - } - - public static void setX(View view, float x) { - Honeycomb.setX(view, x); - } - - public static float getY(View view) { - return Honeycomb.getY(view); - } - - public static void setY(View view, float y) { - Honeycomb.setY(view, y); - } - - private static final class Honeycomb { - static float getAlpha(View view) { - return view.getAlpha(); - } - - static void setAlpha(View view, float alpha) { - view.setAlpha(alpha); - } - - static float getPivotX(View view) { - return view.getPivotX(); - } - - static void setPivotX(View view, float pivotX) { - view.setPivotX(pivotX); - } - - static float getPivotY(View view) { - return view.getPivotY(); - } - - static void setPivotY(View view, float pivotY) { - view.setPivotY(pivotY); - } - - static float getRotation(View view) { - return view.getRotation(); - } - - static void setRotation(View view, float rotation) { - view.setRotation(rotation); - } - - static float getRotationX(View view) { - return view.getRotationX(); - } - - static void setRotationX(View view, float rotationX) { - view.setRotationX(rotationX); - } - - static float getRotationY(View view) { - return view.getRotationY(); - } - - static void setRotationY(View view, float rotationY) { - view.setRotationY(rotationY); - } - - static float getScaleX(View view) { - return view.getScaleX(); - } - - static void setScaleX(View view, float scaleX) { - view.setScaleX(scaleX); - } - - static float getScaleY(View view) { - return view.getScaleY(); - } - - static void setScaleY(View view, float scaleY) { - view.setScaleY(scaleY); - } - - static float getScrollX(View view) { - return view.getScrollX(); - } - - static void setScrollX(View view, int scrollX) { - view.setScrollX(scrollX); - } - - static float getScrollY(View view) { - return view.getScrollY(); - } - - static void setScrollY(View view, int scrollY) { - view.setScrollY(scrollY); - } - - static float getTranslationX(View view) { - return view.getTranslationX(); - } - - static void setTranslationX(View view, float translationX) { - view.setTranslationX(translationX); - } - - static float getTranslationY(View view) { - return view.getTranslationY(); - } - - static void setTranslationY(View view, float translationY) { - view.setTranslationY(translationY); - } - - static float getX(View view) { - return view.getX(); - } - - static void setX(View view, float x) { - view.setX(x); - } - - static float getY(View view) { - return view.getY(); - } - - static void setY(View view, float y) { - view.setY(y); - } - } -} - diff --git a/library/src/main/java/com/cpacm/library/transformers/ZoomInTransformer.java b/library/src/main/java/com/cpacm/library/transformers/ZoomInTransformer.java index e706ef7..8a69676 100644 --- a/library/src/main/java/com/cpacm/library/transformers/ZoomInTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/ZoomInTransformer.java @@ -4,14 +4,14 @@ 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.setScaleX(scale); + view.setScaleY(scale); + view.setPivotX(view.getWidth() * 0.5f); + view.setPivotY(view.getHeight() * 0.5f); + view.setAlpha(position < -1f || position > 1f ? 0f : 1f - (scale - 1f)); + } } diff --git a/library/src/main/java/com/cpacm/library/transformers/ZoomOutSlideTransformer.java b/library/src/main/java/com/cpacm/library/transformers/ZoomOutSlideTransformer.java index 4790562..711833a 100644 --- a/library/src/main/java/com/cpacm/library/transformers/ZoomOutSlideTransformer.java +++ b/library/src/main/java/com/cpacm/library/transformers/ZoomOutSlideTransformer.java @@ -12,26 +12,28 @@ 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 width = view.getWidth(); 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; + final float horzMargin = width * (1 - scaleFactor) / 2; - // Center vertically - ViewHelper.setPivotY(view,0.5f * height); + // Center vertically + view.setPivotY(0.5f * height); + view.setPivotX(0.5f * width); if (position < 0) { - ViewHelper.setTranslationX(view,horzMargin - vertMargin / 2); + view.setTranslationX(horzMargin - vertMargin / 2); } else { - ViewHelper.setTranslationX(view,-horzMargin + vertMargin / 2); + view.setTranslationX(-horzMargin + vertMargin / 2); } // Scale the page down (between MIN_SCALE and 1) - ViewHelper.setScaleX(view,scaleFactor); - ViewHelper.setScaleY(view,scaleFactor); + view.setScaleX(scaleFactor); + view.setScaleY(scaleFactor); // Fade the page relative to its size. - ViewHelper.setAlpha(view,MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); + view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA)); } } diff --git a/library/src/main/java/com/cpacm/library/transformers/ZoomOutTransformer.java b/library/src/main/java/com/cpacm/library/transformers/ZoomOutTransformer.java new file mode 100644 index 0000000..e1ea9d1 --- /dev/null +++ b/library/src/main/java/com/cpacm/library/transformers/ZoomOutTransformer.java @@ -0,0 +1,18 @@ +package com.cpacm.library.transformers; + +import android.view.View; + +public class ZoomOutTransformer extends BaseTransformer { + @Override + protected void onTransform(View view, float position) { + final float scale = 1f + Math.abs(position); + view.setScaleX(scale); + view.setScaleY(scale); + view.setPivotX(view.getWidth() * 0.5f); + view.setPivotY(view.getHeight() * 0.5f); + view.setAlpha(position < -1f || position > 1f ? 0f : 1f - (scale - 1f)); + if (position == -1) { + view.setTranslationX(view.getWidth() * -1); + } + } +} diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml deleted file mode 100644 index a955128..0000000 --- a/library/src/main/res/values/attrs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/pic/simpleslider.png b/pic/simpleslider.png deleted file mode 100644 index 144edd4..0000000 Binary files a/pic/simpleslider.png and /dev/null differ diff --git a/pic/simpleslider_animation.gif b/pic/simpleslider_animation.gif deleted file mode 100644 index e31d5eb..0000000 Binary files a/pic/simpleslider_animation.gif and /dev/null differ diff --git a/pic/simpleslider_indicator.gif b/pic/simpleslider_indicator.gif deleted file mode 100644 index 0fab5c9..0000000 Binary files a/pic/simpleslider_indicator.gif and /dev/null differ diff --git a/pic/simpleslider_transform.gif b/pic/simpleslider_transform.gif deleted file mode 100644 index 7ea6c0b..0000000 Binary files a/pic/simpleslider_transform.gif and /dev/null differ