diff --git a/.idea/misc.xml b/.idea/misc.xml index 061bf60..f2c4404 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,8 +1,5 @@ - - - @@ -95,17 +103,7 @@ - - - - - - - - - - - + diff --git a/.idea/modules.xml b/.idea/modules.xml index 3818a44..39c6a86 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,9 +2,9 @@ - - - + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 4b70033..94a25f7 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,7 +2,5 @@ - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 8592f62..caa8813 100644 --- a/build.gradle +++ b/build.gradle @@ -4,9 +4,10 @@ buildscript { repositories { jcenter() mavenCentral() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.0' + classpath 'com.android.tools.build:gradle:3.3.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -17,5 +18,6 @@ allprojects { repositories { jcenter() mavenCentral() + google() } } diff --git a/carouselview/build.gradle b/carouselview/build.gradle index f2ee634..7a12dde 100644 --- a/carouselview/build.gradle +++ b/carouselview/build.gradle @@ -2,17 +2,13 @@ apply plugin: 'com.android.library' apply plugin: 'maven' apply from: '../deploy.gradle' -group = 'com.gtomato.android.library' -archivesBaseName = 'carouselview' -version = '2.0.1' - android { - compileSdkVersion 21 - buildToolsVersion '25.0.3' + compileSdkVersion 28 + buildToolsVersion '29.0.0 rc1' defaultConfig { - minSdkVersion 11 - targetSdkVersion 21 + minSdkVersion 22 + targetSdkVersion 28 } buildTypes { release { @@ -23,10 +19,10 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:21.0.3' - compile 'com.android.support:recyclerview-v7:21.0.3' - compile 'com.android.support:support-annotations:23.1.1' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support:recyclerview-v7:28.0.0' + implementation 'com.android.support:support-annotations:28.0.0' } uploadArchives { diff --git a/carouselview/src/androidTest/java/com/gtomato/android/ui/widget/ApplicationTest.java b/carouselview/src/androidTest/java/com/gtomato/android/ui/widget/ApplicationTest.java deleted file mode 100644 index 1bf4e71..0000000 --- a/carouselview/src/androidTest/java/com/gtomato/android/ui/widget/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gtomato.android.ui.widget; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/carouselview/src/main/java/com/gtomato/android/ui/manager/CarouselLayoutManager.java b/carouselview/src/main/java/com/gtomato/android/ui/manager/CarouselLayoutManager.java index 434c26b..5d85dde 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/manager/CarouselLayoutManager.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/manager/CarouselLayoutManager.java @@ -1,9 +1,6 @@ package com.gtomato.android.ui.manager; -import android.graphics.PointF; import android.graphics.Rect; -import android.os.Build; -import android.os.Handler; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.Nullable; @@ -32,22 +29,16 @@ public class CarouselLayoutManager extends RecyclerView.LayoutManager { private static final String TAG = CarouselLayoutManager.class.getSimpleName(); public final static ViewTransformer DEFAULT_TRANSFORMER = new ImmutableTransformer(new LinearViewTransformer()); - public final static CarouselView.Scroller DEFAULT_SCROLLER = new NormalScroller(); + private final static CarouselView.Scroller DEFAULT_SCROLLER = new NormalScroller(); - // private boolean mInverseScrollDirection = false; private CarouselView.OnItemClickListener mOnItemClickListener = null; private boolean mInfinite = true; private CarouselView.DrawOrder mDrawOrder = CarouselView.DrawOrder.FirstBack; private int mExtraVisibleChilds = 0; private int mGravity = Gravity.CENTER_HORIZONTAL; -// private SparseArray> mViewAtPosition = new SparseArray<>(1000); - -// private PerformanceTimer mPerformanceTimer = new PerformanceTimer("CarouselLayoutManager"); private Queue mPendingTasks = new LinkedList<>(); - private Handler mHandler = new Handler(); - // temp cached values @Nullable private RecyclerView mRecyclerView = null; private int mDecoratedChildWidth, mDecoratedChildHeight; @@ -109,7 +100,7 @@ public CarouselLayoutManager setTransformer(ViewTransformer transformer) { * Note: Other options, e.g. extraVisibleChilds, that possibly set by * custom transformers may have to reset by developers manually. */ - public void resetOptions() { + private void resetOptions() { setScroller(null); setDrawOrder(CarouselView.DrawOrder.FirstBack); } @@ -122,15 +113,7 @@ public ViewTransformer getTransformer() { return mTransformer; } - /** - * Returns the number of extra children per side to be preserved and managed by transformations. - * @return - */ - public int getExtraVisibleChilds() { - return mExtraVisibleChilds; - } - - /** + /** * Set the number of extra children per side to be preserved and managed by transformations. *

* Number of cached children views = (num + 2) * 2 + 1 @@ -149,7 +132,7 @@ public CarouselLayoutManager setExtraVisibleChilds(CarouselView carouselView, in * Returns whether the items are recurring. * @return */ - public boolean isInfinite() { + private boolean isInfinite() { return mInfinite; } @@ -198,14 +181,6 @@ public int getGravity() { return mGravity; } - /** - * Returns the drawing order of the centermost item. - * @return - */ - public CarouselView.DrawOrder getDrawOrder() { - return mDrawOrder; - } - /** * Set the drawing order of the centermost item. * @param drawOrder @@ -249,15 +224,7 @@ public boolean canScrollVertically() { return false; } - /** - * Returns the current X-axis scrolling position in pixels. - * @return - */ - public int getScrollX() { - return mScrollOffset; - } - - private int getContentLeftX() { + private int getContentLeftX() { return mScrollOffset - getContentWidth() / 2; } @@ -298,8 +265,7 @@ public float getCurrentPositionPoint() { */ public float getCurrentOffset() { float totalOffset = pixelToPosition(mScrollOffset); - float offset = Math.abs(totalOffset - (float) Math.floor(totalOffset)); - return offset; + return Math.abs(totalOffset - (float) Math.floor(totalOffset)); } @Override @@ -326,16 +292,12 @@ public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, Recycler return dx; } - private int positionOfIndex(int childIndex) { - return childIndex; - } - - /** + /** * Returns a position based on a given pixel. * @param pixel * @return */ - protected float pixelToPosition(int pixel) { + private float pixelToPosition(int pixel) { return mDecoratedChildWidth != 0 ? (float) pixel / mDecoratedChildWidth : 0; } @@ -348,7 +310,7 @@ public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, mDecoratedChildWidth = 0; mDecoratedChildHeight = 0; super.onMeasure(recycler, state, widthSpec, heightSpec); - adjustHostDimension(recycler, state, widthSpec, heightSpec); + adjustHostDimension(recycler, widthSpec, heightSpec); log("carousel width = " + mMeasuredWidth + ", height = " + mMeasuredHeight); if (CarouselView.isDebug()) { @@ -360,7 +322,7 @@ public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, } } - void adjustHostDimension(RecyclerView.Recycler recycler, RecyclerView.State state, int widthSpec, int heightSpec) { + private void adjustHostDimension(RecyclerView.Recycler recycler, int widthSpec, int heightSpec) { final int widthMode = View.MeasureSpec.getMode(widthSpec); final int heightMode = View.MeasureSpec.getMode(heightSpec); final int widthSize = View.MeasureSpec.getSize(widthSpec); @@ -451,21 +413,21 @@ public void measureChildWithMargins(View child, int widthUsed, int heightUsed) { final int widthSpec = LayoutManager.getChildMeasureSpec(width, getPaddingLeft() + getPaddingRight() + lp.leftMargin + lp.rightMargin + widthUsed, lp.width, - false && canScrollHorizontally()); + false); final int heightSpec = LayoutManager.getChildMeasureSpec(height, getPaddingTop() + getPaddingBottom() + lp.topMargin + lp.bottomMargin + heightUsed, lp.height, - false && canScrollVertically()); + false); child.measure(widthSpec, heightSpec); } private void updateWindowVariables() { switch (mGravity & Gravity.HORIZONTAL_GRAVITY_MASK) { - case Gravity.LEFT: { + case Gravity.START: { mLeftOffset = getPaddingLeft(); } break; - case Gravity.RIGHT: { + case Gravity.END: { mLeftOffset = mMeasuredWidth - getPaddingRight() - mDecoratedChildWidth; } break; @@ -532,16 +494,12 @@ public void run() { logv("onLayoutChildren ============== end"); } - private int getVisibleChildCount() { - return getContentWidth() / mDecoratedChildWidth + 1; - } - - /** + /** * Returns an adapter position based on a given absolute position. * @param position * @return */ - public int translatePosition(int position) { + private int translatePosition(int position) { if (!mInfinite) return position; int itemCount = getItemCount(); position %= itemCount; @@ -569,10 +527,7 @@ public boolean isValidPosition(int position) { */ private void fillChildrenView(RecyclerView.Recycler recycler, RecyclerView.State state) { logv("fillChildrenView =============="); - // use MultiSparseArray instead of SparseArray because getPosition can be repeated, otherwise viewCache.put() would replace the views and cause memory leak - MultiSparseArray viewCache = new MultiSparseArray(getChildCount()); // at the end of iteration, all views in viewCache will be recycled - -// mPerformanceTimer.time("fillChildrenView start"); + MultiSparseArray viewCache = new MultiSparseArray<>(getChildCount()); // at the end of iteration, all views in viewCache will be recycled // Cache all views by their existing position and detach them logv("getChildCount() = " + getChildCount()); @@ -584,14 +539,10 @@ private void fillChildrenView(RecyclerView.Recycler recycler, RecyclerView.State detachView(child); } -// mPerformanceTimer.time("fillChildrenView detachView"); - int leftmostPosition = getLeftmostVisiblePosition(); int rightmostPosition = getRightmostVisiblePosition(); int currentPosition = getCurrentPosition(); - // ASSERT if mInfinite, 0 <= leftmostPosition <= rightmostPosition < getItemCount() - if (leftmostPosition <= rightmostPosition) { // draw all the children views that are in range of [leftmostPosition, rightmostPosition] @@ -651,20 +602,15 @@ private void fillChildrenView(RecyclerView.Recycler recycler, RecyclerView.State } -// mPerformanceTimer.time("fillChildrenView drawView"); // Recycle views that are not re-attached for (int i = viewCache.size() - 1; i >= 0; --i) { logv(String.format("recycleView (%d) %s", viewCache.keyAt(i), viewCache.valuesAt(i))); -// mViewAtPosition.remove(viewCache.keyAt(i)); -// recycler.recycleView(viewCache.valueAt(i)); for (View v : viewCache.valuesAt(i)) { recycler.recycleView(v); } } -// mPerformanceTimer.time("fillChildrenView recycleView"); - logv("getChildCount() = " + getChildCount()); logv("fillChildrenView ============== end"); @@ -692,18 +638,16 @@ private void drawChild(final int position, MultiSparseArray viewCache, Rec @Override public void onClick(View v) { if (mOnItemClickListener != null) { - mOnItemClickListener.onItemClick(null, v, position, translatePosition(position)); + mOnItemClickListener.onItemClick(v, position, translatePosition(position)); } } }); addView(view); -// mViewAtPosition.put(position, new WeakReference<>(view)); logv(String.format("addView (%d [%d]) %s", position, translatedPosition, view)); } else { // re-attach the cached view attachView(view); -// viewCache.remove(translatedPosition); } measureChildWithMargins(view, 0, 0); @@ -719,11 +663,6 @@ public void onClick(View v) { mTransformer.transform(view, -(pixelToPosition(mScrollOffset) - position)); } -// public View getViewAtPosition(int position) { -// WeakReference viewRef = mViewAtPosition.get(position); -// return viewRef != null ? viewRef.get() : null; -// } - @Override public void scrollToPosition(final int position) { if (mDecoratedChildWidth == 0 && getItemCount() > 0) { @@ -742,24 +681,13 @@ public void run() { log("scrollToPosition " + position + "set mScrollPositionUpdated"); } mScrollOffset = newOffset; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && mRecyclerView != null && !mRecyclerView.isInLayout()) { + if (mRecyclerView != null && !mRecyclerView.isInLayout()) { requestLayout(); } } @Override - public void smoothScrollToPosition(final RecyclerView recyclerView, final RecyclerView.State state, - int position) { -// LinearSmoothScroller linearSmoothScroller = -// new LinearSmoothScroller(recyclerView.getContext()) { -// @Override -// public PointF computeScrollVectorForPosition(int targetPosition) { -// return CarouselLayoutManager.this -// .computeScrollVectorForPosition(targetPosition); -// } -// }; -// linearSmoothScroller.setTargetPosition(position); -// startSmoothScroll(linearSmoothScroller); + public void smoothScrollToPosition(final RecyclerView recyclerView, final RecyclerView.State state, int position) { log("smoothScrollToPosition " + position + " " + recyclerView); int minScrollOffset = Integer.MAX_VALUE; final int nChilds = getItemCount(); @@ -792,25 +720,7 @@ public void run() { recyclerView.smoothScrollBy(minScrollOffset, 0); } - /** - * NOT USED. - * @param targetPosition - * @return - */ - private PointF computeScrollVectorForPosition(int targetPosition) { -// if (getChildCount() == 0) { -// return null; -// } - final int targetOffset = targetPosition * mDecoratedChildWidth; - final int direction = targetOffset < mScrollOffset ? -1 : 1; -// if (mOrientation == HORIZONTAL) { - return new PointF(direction /*targetOffset - mScrollOffset*/, 0); -// } else { -// return new PointF(0, direction); -// } - } - - @Override + @Override public void onAdapterChanged(RecyclerView.Adapter oldAdapter, RecyclerView.Adapter newAdapter) { super.onAdapterChanged(oldAdapter, newAdapter); removeAllViews(); @@ -829,7 +739,6 @@ public void onItemsUpdated(RecyclerView recyclerView, int positionStart, int ite for (int i = 0; i < itemCount; ++i) { View view = findViewByPosition(positionStart + i); if (view != null) view.forceLayout(); -// removeAndRecycleView(view, recyclerView.recyc); } } @@ -883,22 +792,13 @@ private static void logv(String format, Object... args) { } } - /** - * Retrieve the underlying CarouselView. - * @return - */ - @Nullable - protected CarouselView getCarouselView() { - return (CarouselView) mRecyclerView; - } - - /** + /** * Add a given runnable action to the underlying CarouselView. * @param action * @return whether the given action is successfully queued * @see CarouselView#post(Runnable) */ - protected boolean post(Runnable action) { + private boolean post(Runnable action) { if (mRecyclerView == null) return false; mRecyclerView.post(action); @@ -921,9 +821,7 @@ public SavedState[] newArray(int size) { int scrollOffset; - SavedState() { - - } + SavedState() {} private SavedState(Parcel in) { scrollOffset = in.readInt(); diff --git a/carouselview/src/main/java/com/gtomato/android/ui/scrolltweaker/InverseScroller.java b/carouselview/src/main/java/com/gtomato/android/ui/scrolltweaker/InverseScroller.java index 06477f1..36d421b 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/scrolltweaker/InverseScroller.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/scrolltweaker/InverseScroller.java @@ -14,28 +14,14 @@ public int tweakScrollDx(int dx) { return -dx; } - @Override - public int tweakScrollDy(int dy) { - return -dy; - } - @Override public int inverseTweakScrollDx(int dx) { return -dx; } - @Override - public int inverseTweakScrollDy(int dy) { - return -dy; - } - @Override public float tweakScrollDx(float dx) { return -dx; } - @Override - public float tweakScrollDy(float dy) { - return -dy; - } } diff --git a/carouselview/src/main/java/com/gtomato/android/ui/scrolltweaker/NormalScroller.java b/carouselview/src/main/java/com/gtomato/android/ui/scrolltweaker/NormalScroller.java index 5adce61..be072e3 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/scrolltweaker/NormalScroller.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/scrolltweaker/NormalScroller.java @@ -14,28 +14,14 @@ public int tweakScrollDx(int dx) { return dx; } - @Override - public int tweakScrollDy(int dy) { - return dy; - } - @Override public int inverseTweakScrollDx(int dx) { return dx; } - @Override - public int inverseTweakScrollDy(int dy) { - return dy; - } - @Override public float tweakScrollDx(float dx) { return dx; } - @Override - public float tweakScrollDy(float dy) { - return dy; - } } diff --git a/carouselview/src/main/java/com/gtomato/android/ui/transformer/CoverFlowViewTransformer.java b/carouselview/src/main/java/com/gtomato/android/ui/transformer/CoverFlowViewTransformer.java index 3bf087f..a4c3770 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/transformer/CoverFlowViewTransformer.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/transformer/CoverFlowViewTransformer.java @@ -1,6 +1,5 @@ package com.gtomato.android.ui.transformer; -import android.support.annotation.FloatRange; import android.view.View; import com.gtomato.android.ui.manager.CarouselLayoutManager; @@ -13,14 +12,13 @@ *

    *
  • {@link #setOffsetXPercent(float)} linear X-axis translation rate. Default 0.8
  • *
  • {@link #setScaleYFactor(float)} linear Y-axis scale rate. Default -0.2
  • - *
  • {@link #setYProjection(double)} Y-axis rotation degree when position = 2. Default 60
  • + *
  • Y-axis rotation degree when position = 2. Default 60
  • *
* * @author sunny-chung */ public class CoverFlowViewTransformer extends ParameterizableViewTransformer { - private double mYProjection = 60.0; public CoverFlowViewTransformer() { setOffsetXPercent(0.8f); @@ -32,41 +30,14 @@ public void onAttach(CarouselLayoutManager layoutManager) { layoutManager.setDrawOrder(CarouselView.DrawOrder.CenterFront); } - @Override - public void setOffsetXPercent(float offsetXPercent) { - super.setOffsetXPercent(offsetXPercent); - } - - @Override - public float getOffsetXPercent() { - return super.getOffsetXPercent(); - } - - @Override - public float getScaleYFactor() { - return super.getScaleYFactor(); - } - - @Override - public void setScaleYFactor(float scaleYFactor) { - super.setScaleYFactor(scaleYFactor); - } - - public double getYProjection() { - return mYProjection; - } - - public void setYProjection(@FloatRange(from = 0.0, to = 90.0) double yProjectionDegree) { - mYProjection = yProjectionDegree; - } - @Override public void transform(View view, float position) { int width = view.getMeasuredWidth(), height = view.getMeasuredHeight(); view.setPivotX(width / 2.0f); view.setPivotY(height / 2.0f); view.setTranslationX(width * position * mOffsetXPercent); - view.setRotationY(Math.signum(position) * (float)(Math.log(Math.abs(position) + 1) / Math.log(3) * - mYProjection)); + double mYProjection = 60.0; + view.setRotationY(Math.signum(position) * (float)(Math.log(Math.abs(position) + 1) / Math.log(3) * -mYProjection)); view.setScaleY(1 + mScaleYFactor * Math.abs(position)); } } diff --git a/carouselview/src/main/java/com/gtomato/android/ui/transformer/FlatMerryGoRoundTransformer.java b/carouselview/src/main/java/com/gtomato/android/ui/transformer/FlatMerryGoRoundTransformer.java index 9bbc704..69bfbde 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/transformer/FlatMerryGoRoundTransformer.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/transformer/FlatMerryGoRoundTransformer.java @@ -1,7 +1,5 @@ package com.gtomato.android.ui.transformer; -import android.support.annotation.FloatRange; -import android.support.annotation.IntRange; import android.view.View; import com.gtomato.android.ui.manager.CarouselLayoutManager; @@ -14,88 +12,34 @@ *
* Available parameters:
*
    - *
  • {@link #setNumPies(int)} number of item views to be distributed across the circle evenly. Default 7
  • - *
  • {@link #setHorizontalViewPort(double)} % of parent width to be used for display. Default 80%
  • - *
  • {@link #setViewPerspective(double)} normalized camera height. Default 0.6
  • - *
  • {@link #setFarScale(double)} scale of itemview when it is layout at a far distance (y = 0). Default 0.35
  • - *
  • {@link #setFarAlpha(double)} alpha of itemview when it is layout at a far distance (y = 0). Default 0
  • + *
  • number of item views to be distributed across the circle evenly. Default 7
  • + *
  • % of parent width to be used for display. Default 80%
  • + *
  • normalized camera height. Default 0.6
  • + *
  • scale of itemview when it is layout at a far distance (y = 0). Default 0.35
  • + *
  • alpha of itemview when it is layout at a far distance (y = 0). Default 0
  • *
* * @author sunny-chung */ public class FlatMerryGoRoundTransformer implements CarouselView.ViewTransformer { - private int mNumPies = 7; - private double mPieRad = Math.PI * 2.0 / mNumPies; // depends on mNumPies - - private double mHorizontalViewPort = 0.8; - private double mViewPerspective = 0.6; - private double mFarScale = 0.35; - private double mFarAlpha = 0; @Override public void onAttach(CarouselLayoutManager layoutManager) { layoutManager.setDrawOrder(CarouselView.DrawOrder.CenterFront); } - public int getNumPies() { - return mNumPies; - } - - public void setNumPies(@IntRange(from = 1) int numPies) { - mNumPies = numPies; - mPieRad = Math.PI * 2.0 / numPies; - } - - public double getHorizontalViewPort() { - return mHorizontalViewPort; - } - - public void setHorizontalViewPort(@FloatRange(from = 0.0, to = 1.0, fromInclusive = false) double horizontalViewPort) { - mHorizontalViewPort = horizontalViewPort; - } - - public double getViewPerspective() { - return mViewPerspective; - } - - public void setViewPerspective(double viewPerspective) { - mViewPerspective = viewPerspective; - } - - public double getFarAlpha() { - return mFarAlpha; - } - - public void setFarAlpha(@FloatRange(from = 0.0, to = 1.0) double farAlpha) { - mFarAlpha = farAlpha; - } - - public double getFarScale() { - return mFarScale; - } - - public void setFarScale(double farScale) { - mFarScale = farScale; - } - @Override public void transform(View view, float position) { - int width = view.getMeasuredWidth(), height = view.getMeasuredHeight(); int parentWidth = ((View) view.getParent()).getMeasuredWidth(); - int parentHeight = ((View) view.getParent()).getMeasuredHeight(); - - // create perspective view by - // compressing height of circle linearly to ellipse - // and proportioning scale and alpha linearly - - // ellipse formula: - // x(t) = a cos t - // y(t) = b sin t - // where t ∈ [0, 2π] + // depends on mNumPies + int mNumPies = 7; + double mPieRad = Math.PI * 2.0 / mNumPies; double rotateRad = Math.PI * 1.5 + position * mPieRad; + double mHorizontalViewPort = 0.8; double a = parentWidth * mHorizontalViewPort / 2.0; + double mViewPerspective = 0.6; double b = a * mViewPerspective; double x = a * Math.cos(rotateRad); @@ -104,13 +48,13 @@ public void transform(View view, float position) { double maxY = 2 * b; // since maximum of (1 - sin t) => 2 // TODO scale should depend on mViewPerspective as well + double mFarScale = 0.35; double scale = Math.max(0, (mFarScale - 1) * (y - maxY) / (0 - maxY) + 1); + double mFarAlpha = 0; double alpha = Math.max(0, (mFarAlpha - 1) * (y - maxY) / (0 - maxY) + 1); y -= maxY / 2; // reposition center so that y ∈ [-maxY/2, maxY/2] -// y += (parentHeight - maxY - height) / 2; // center vertically - view.setTranslationX((float) x); view.setTranslationY((float) y); view.setScaleX((float) scale); diff --git a/carouselview/src/main/java/com/gtomato/android/ui/transformer/ImmutableTransformer.java b/carouselview/src/main/java/com/gtomato/android/ui/transformer/ImmutableTransformer.java index cfeabd2..39dba14 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/transformer/ImmutableTransformer.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/transformer/ImmutableTransformer.java @@ -12,7 +12,7 @@ */ public final class ImmutableTransformer implements CarouselView.ViewTransformer { - private CarouselView.ViewTransformer mTransformer; + private final CarouselView.ViewTransformer mTransformer; public ImmutableTransformer(CarouselView.ViewTransformer transformer) { mTransformer = transformer; diff --git a/carouselview/src/main/java/com/gtomato/android/ui/transformer/InverseTimeMachineViewTransformer.java b/carouselview/src/main/java/com/gtomato/android/ui/transformer/InverseTimeMachineViewTransformer.java index 42a8ced..935b605 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/transformer/InverseTimeMachineViewTransformer.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/transformer/InverseTimeMachineViewTransformer.java @@ -12,7 +12,7 @@ */ public class InverseTimeMachineViewTransformer implements CarouselView.ViewTransformer { - protected static final float translationXRate = (1) * 0.5f; + private static final float translationXRate = (1) * 0.5f; @Override public void onAttach(CarouselLayoutManager layoutManager) { @@ -21,7 +21,7 @@ public void onAttach(CarouselLayoutManager layoutManager) { @Override public void transform(View view, float position) { - int width = view.getMeasuredWidth(), height = view.getMeasuredHeight(); + int width = view.getMeasuredWidth(); view.setTranslationX(width * position * translationXRate * (2f / (Math.abs(position) + 2))); view.setScaleX(2f / (position + 2)); view.setScaleY(2f / (position + 2)); diff --git a/carouselview/src/main/java/com/gtomato/android/ui/transformer/LinearViewTransformer.java b/carouselview/src/main/java/com/gtomato/android/ui/transformer/LinearViewTransformer.java index d7dfe2a..9424772 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/transformer/LinearViewTransformer.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/transformer/LinearViewTransformer.java @@ -6,19 +6,6 @@ *

Default it is a horizontal linear carousel. * You may set parameter offsetXPercent=0, offsetYPercent=1 for a vertical linear carousel.

* - * Available parameters:
- *
    - *
  • {@link #setOffsetXPercent(float)} linear X-axis translation rate. Default 1
  • - *
  • {@link #setOffsetYPercent(float)} linear Y-axis translation rate. Default 0
  • - *
  • {@link #setScaleXFactor(float)} linear X-axis scale rate
  • - *
  • {@link #setScaleYFactor(float)} linear Y-axis scale rate
  • - *
  • {@link #setMinScaleX(float)} minimum X-axis scale
  • - *
  • {@link #setMinScaleY(float)} minimum Y-axis scale
  • - *
  • {@link #setMaxScaleX(float)} maximum X-axis scale
  • - *
  • {@link #setMaxScaleY(float)} maximum Y-axis scale
  • - *
  • {@link #setScaleLargestAtCenter(boolean)} whether the current item should be scaled largest (inversely to scale rate). Default false
  • - *
- * * @author sunny-chung */ @@ -27,94 +14,4 @@ public LinearViewTransformer() { setOffsetXPercent(1); setOffsetYPercent(0); } - - @Override - public float getOffsetXPercent() { - return super.getOffsetXPercent(); - } - - @Override - public float getOffsetYPercent() { - return super.getOffsetYPercent(); - } - - @Override - public void setOffsetXPercent(float offsetXPercent) { - super.setOffsetXPercent(offsetXPercent); - } - - @Override - public void setOffsetYPercent(float offsetYPercent) { - super.setOffsetYPercent(offsetYPercent); - } - - @Override - public float getScaleXFactor() { - return super.getScaleXFactor(); - } - - @Override - public void setScaleXFactor(float scaleXFactor) { - super.setScaleXFactor(scaleXFactor); - } - - @Override - public void setScaleYFactor(float scaleYFactor) { - super.setScaleYFactor(scaleYFactor); - } - - @Override - public float getScaleYFactor() { - return super.getScaleYFactor(); - } - - @Override - public float getMaxScaleX() { - return super.getMaxScaleX(); - } - - @Override - public float getMaxScaleY() { - return super.getMaxScaleY(); - } - - @Override - public float getMinScaleX() { - return super.getMinScaleX(); - } - - @Override - public float getMinScaleY() { - return super.getMinScaleY(); - } - - @Override - public void setMaxScaleX(float maxScaleX) { - super.setMaxScaleX(maxScaleX); - } - - @Override - public void setMaxScaleY(float maxScaleY) { - super.setMaxScaleY(maxScaleY); - } - - @Override - public void setMinScaleX(float minScaleX) { - super.setMinScaleX(minScaleX); - } - - @Override - public void setMinScaleY(float minScaleY) { - super.setMinScaleY(minScaleY); - } - - @Override - public boolean isScaleLargestAtCenter() { - return super.isScaleLargestAtCenter(); - } - - @Override - public void setScaleLargestAtCenter(boolean scaleLargestAtCenter) { - super.setScaleLargestAtCenter(scaleLargestAtCenter); - } } diff --git a/carouselview/src/main/java/com/gtomato/android/ui/transformer/ParameterizableViewTransformer.java b/carouselview/src/main/java/com/gtomato/android/ui/transformer/ParameterizableViewTransformer.java index 2d4443e..d870907 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/transformer/ParameterizableViewTransformer.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/transformer/ParameterizableViewTransformer.java @@ -19,46 +19,29 @@ */ public abstract class ParameterizableViewTransformer implements CarouselView.ViewTransformer { - protected static final float EPS = 1e-3f; + private static final float EPS = 1e-3f; - protected float mOffsetXPercent = 0f, mOffsetYPercent = 0f; - protected float mMinScaleX = Float.NaN, mMaxScaleX = Float.NaN, mScaleXOffset = Float.NaN, mScaleXFactor = Float.NaN; - protected float mMinScaleY = Float.NaN, mMaxScaleY = Float.NaN, mScaleYOffset = Float.NaN, mScaleYFactor = Float.NaN; - protected float mRotateDegree = Float.NaN; - protected boolean mScaleLargestAtCenter = false; + float mOffsetXPercent = 0f; + private float mOffsetYPercent = 0f; + float mScaleYFactor = Float.NaN; + private float mRotateDegree = Float.NaN; - protected float mRotateDistFactor = Float.NaN; // depends on mRotateDegree + private float mRotateDistFactor = Float.NaN; // depends on mRotateDegree - protected ParameterizableViewTransformer() { - - } + ParameterizableViewTransformer() { } @Override - public void onAttach(CarouselLayoutManager layoutManager) { - - } - - protected float getOffsetXPercent() { - return mOffsetXPercent; - } + public void onAttach(CarouselLayoutManager layoutManager) { } - protected void setOffsetXPercent(float offsetXPercent) { + void setOffsetXPercent(float offsetXPercent) { mOffsetXPercent = offsetXPercent; } - protected float getOffsetYPercent() { - return mOffsetYPercent; - } - - protected void setOffsetYPercent(float offsetYPercent) { + void setOffsetYPercent(float offsetYPercent) { mOffsetYPercent = offsetYPercent; } - protected float getRotateDegree() { - return mRotateDegree; - } - - protected void setRotateDegree(float rotateDegree) { + void setRotateDegree(float rotateDegree) { mRotateDegree = rotateDegree; if (Float.isNaN(rotateDegree)) { mRotateDistFactor = Float.NaN; @@ -69,78 +52,10 @@ protected void setRotateDegree(float rotateDegree) { } } - protected float getMinScaleX() { - return mMinScaleX; - } - - protected void setMinScaleX(float minScaleX) { - mMinScaleX = minScaleX; - } - - protected float getMaxScaleX() { - return mMaxScaleX; - } - - protected void setMaxScaleX(float maxScaleX) { - mMaxScaleX = maxScaleX; - } - - protected float getScaleXFactor() { - return mScaleXFactor; - } - - protected void setScaleXFactor(float scaleXFactor) { - mScaleXFactor = scaleXFactor; - } - - protected float getMinScaleY() { - return mMinScaleY; - } - - protected void setMinScaleY(float minScaleY) { - mMinScaleY = minScaleY; - } - - protected float getMaxScaleY() { - return mMaxScaleY; - } - - protected void setMaxScaleY(float maxScaleY) { - mMaxScaleY = maxScaleY; - } - - protected float getScaleYFactor() { - return mScaleYFactor; - } - - protected void setScaleYFactor(float scaleYFactor) { + void setScaleYFactor(float scaleYFactor) { mScaleYFactor = scaleYFactor; } - protected float getScaleXOffset() { - return mScaleXOffset; - } - - protected void setScaleXOffset(float scaleXOffset) { - mScaleXOffset = scaleXOffset; - } - - protected float getScaleYOffset() { - return mScaleYOffset; - } - - protected void setScaleYOffset(float scaleYOffset) { - mScaleYOffset = scaleYOffset; - } - - protected boolean isScaleLargestAtCenter() { - return mScaleLargestAtCenter; - } - - protected void setScaleLargestAtCenter(boolean scaleLargestAtCenter) { - mScaleLargestAtCenter = scaleLargestAtCenter; - } - private static boolean isNonZero(float f) { return f > EPS || f < -EPS; } @@ -148,13 +63,11 @@ private static boolean isNonZero(float f) { @Override public void transform(View view, float position) { int width = view.getMeasuredWidth(), height = view.getMeasuredHeight(); -// int width = view.getWidth(), height = view.getHeight(); + boolean mScaleLargestAtCenter = false; + float mScaleXFactor = Float.NaN; if (!Float.isNaN(mScaleXFactor)) { float scale = (mScaleLargestAtCenter ? 1 - Math.abs(position) : position) * mScaleXFactor; - if (!Float.isNaN(mScaleXOffset)) scale += mScaleXOffset; - if (!Float.isNaN(mMinScaleX)) scale = Math.max(mMinScaleX, scale); - if (!Float.isNaN(mMaxScaleX)) scale = Math.min(mMaxScaleX, scale); view.setPivotX(width / 2.0f); view.setPivotY(height / 2.0f); view.setScaleX(scale); @@ -162,9 +75,6 @@ public void transform(View view, float position) { if (!Float.isNaN(mScaleYFactor)) { float scale = (mScaleLargestAtCenter ? 1 - Math.abs(position) : position) * mScaleYFactor; - if (!Float.isNaN(mScaleYOffset)) scale += mScaleYOffset; - if (!Float.isNaN(mMinScaleY)) scale = Math.max(mMinScaleY, scale); - if (!Float.isNaN(mMaxScaleY)) scale = Math.min(mMaxScaleY, scale); view.setPivotX(width / 2.0f); view.setPivotY(height / 2.0f); view.setScaleY(scale); diff --git a/carouselview/src/main/java/com/gtomato/android/ui/transformer/ParameterizedViewTransformer.java b/carouselview/src/main/java/com/gtomato/android/ui/transformer/ParameterizedViewTransformer.java index 85dcc74..9741499 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/transformer/ParameterizedViewTransformer.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/transformer/ParameterizedViewTransformer.java @@ -6,151 +6,8 @@ *

A carousel with limited set of customizable parameters. * Refer to {@link ParameterizableViewTransformer#transform(View, float)} for implementation details.

* - * Available parameters:
- *
    - *
  • {@link #setOffsetXPercent(float)} linear X-axis translation rate. Default 1
  • - *
  • {@link #setOffsetYPercent(float)} linear Y-axis translation rate. Default 0
  • - *
  • {@link #setScaleXFactor(float)} linear X-axis scale rate
  • - *
  • {@link #setScaleYFactor(float)} linear Y-axis scale rate
  • - *
  • {@link #setScaleXOffset(float)} X-axis scale offset after multiplied by scaleXFactor
  • - *
  • {@link #setScaleYOffset(float)} Y-axis scale offset after multiplied by scaleYFactor
  • - *
  • {@link #setMinScaleX(float)} minimum X-axis scale
  • - *
  • {@link #setMinScaleY(float)} minimum Y-axis scale
  • - *
  • {@link #setMaxScaleX(float)} maximum X-axis scale
  • - *
  • {@link #setMaxScaleY(float)} maximum Y-axis scale
  • - *
  • {@link #setScaleLargestAtCenter(boolean)} whether the current item should be scaled largest (inversely to scale rate). Default false
  • - *
  • {@link #setRotateDegree(float)} rotation in degree
  • - *
- * - * Explanations:
- *
    - *
  • TranslationX = item view width * offsetXPercent * position
  • - *
  • ScaleX = [MinScaleX |<=| ScaleXFactor * position + ScaleXOffset |<=| MaxScaleX]
  • - *
  • similar for those applied to Y-axis
  • - *
- * * @author sunny-chung */ public class ParameterizedViewTransformer extends ParameterizableViewTransformer { - - @Override - public float getMaxScaleX() { - return super.getMaxScaleX(); - } - - @Override - public float getMaxScaleY() { - return super.getMaxScaleY(); - } - - @Override - public float getMinScaleX() { - return super.getMinScaleX(); - } - - @Override - public float getMinScaleY() { - return super.getMinScaleY(); - } - - @Override - public float getOffsetXPercent() { - return super.getOffsetXPercent(); - } - - @Override - public float getOffsetYPercent() { - return super.getOffsetYPercent(); - } - - @Override - public float getRotateDegree() { - return super.getRotateDegree(); - } - - @Override - public float getScaleXFactor() { - return super.getScaleXFactor(); - } - - @Override - public float getScaleXOffset() { - return super.getScaleXOffset(); - } - - @Override - public float getScaleYFactor() { - return super.getScaleYFactor(); - } - - @Override - public float getScaleYOffset() { - return super.getScaleYOffset(); - } - - @Override - public boolean isScaleLargestAtCenter() { - return super.isScaleLargestAtCenter(); - } - - @Override - public void setMaxScaleX(float maxScaleX) { - super.setMaxScaleX(maxScaleX); - } - - @Override - public void setMaxScaleY(float maxScaleY) { - super.setMaxScaleY(maxScaleY); - } - - @Override - public void setMinScaleX(float minScaleX) { - super.setMinScaleX(minScaleX); - } - - @Override - public void setMinScaleY(float minScaleY) { - super.setMinScaleY(minScaleY); - } - - @Override - public void setOffsetXPercent(float offsetXPercent) { - super.setOffsetXPercent(offsetXPercent); - } - - @Override - public void setOffsetYPercent(float offsetYPercent) { - super.setOffsetYPercent(offsetYPercent); - } - - @Override - public void setRotateDegree(float rotateDegree) { - super.setRotateDegree(rotateDegree); - } - - @Override - public void setScaleLargestAtCenter(boolean scaleLargestAtCenter) { - super.setScaleLargestAtCenter(scaleLargestAtCenter); - } - - @Override - public void setScaleXFactor(float scaleXFactor) { - super.setScaleXFactor(scaleXFactor); - } - - @Override - public void setScaleXOffset(float scaleXOffset) { - super.setScaleXOffset(scaleXOffset); - } - - @Override - public void setScaleYFactor(float scaleYFactor) { - super.setScaleYFactor(scaleYFactor); - } - - @Override - public void setScaleYOffset(float scaleYOffset) { - super.setScaleYOffset(scaleYOffset); - } } diff --git a/carouselview/src/main/java/com/gtomato/android/ui/transformer/TimeMachineViewTransformer.java b/carouselview/src/main/java/com/gtomato/android/ui/transformer/TimeMachineViewTransformer.java index 2ae0b6d..9926baf 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/transformer/TimeMachineViewTransformer.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/transformer/TimeMachineViewTransformer.java @@ -13,7 +13,7 @@ */ public class TimeMachineViewTransformer implements CarouselView.ViewTransformer { - protected static final float translationXRate = (-1) * 0.5f; + private static final float translationXRate = (-1) * 0.5f; @Override public void onAttach(CarouselLayoutManager layoutManager) { @@ -23,7 +23,7 @@ public void onAttach(CarouselLayoutManager layoutManager) { @Override public void transform(View view, float position) { - int width = view.getMeasuredWidth(), height = view.getMeasuredHeight(); + int width = view.getMeasuredWidth(); view.setTranslationX(width * position * translationXRate * (2f / (Math.abs(position) + 2))); view.setScaleX(2f / (position + 2)); view.setScaleY(2f / (position + 2)); diff --git a/carouselview/src/main/java/com/gtomato/android/ui/transformer/WheelViewTransformer.java b/carouselview/src/main/java/com/gtomato/android/ui/transformer/WheelViewTransformer.java index af9d474..77fad0e 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/transformer/WheelViewTransformer.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/transformer/WheelViewTransformer.java @@ -3,18 +3,6 @@ /** *

Simulates the effect of a wheel.

* - * Available parameters:
- *
    - *
  • {@link #setRotateDegree(float)} rotation in degree. Default 30
  • - *
  • {@link #setScaleLargestAtCenter(boolean)} whether the current item should be scaled largest (inversely to scale rate). Default false
  • - *
  • {@link #setScaleXFactor(float)} linear X-axis scale rate
  • - *
  • {@link #setScaleYFactor(float)} linear Y-axis scale rate
  • - *
  • {@link #setMinScaleX(float)} minimum X-axis scale
  • - *
  • {@link #setMinScaleY(float)} minimum Y-axis scale
  • - *
  • {@link #setMaxScaleX(float)} maximum X-axis scale
  • - *
  • {@link #setMaxScaleY(float)} maximum Y-axis scale
  • - *
- * * @author sunny-chung */ @@ -23,84 +11,4 @@ public class WheelViewTransformer extends ParameterizableViewTransformer { public WheelViewTransformer() { setRotateDegree(30); } - - @Override - public float getRotateDegree() { - return super.getRotateDegree(); - } - - @Override - public void setRotateDegree(float rotateDegree) { - super.setRotateDegree(rotateDegree); - } - - @Override - public boolean isScaleLargestAtCenter() { - return super.isScaleLargestAtCenter(); - } - - @Override - public void setScaleLargestAtCenter(boolean scaleLargestAtCenter) { - super.setScaleLargestAtCenter(scaleLargestAtCenter); - } - - @Override - public float getScaleXFactor() { - return super.getScaleXFactor(); - } - - @Override - public float getScaleYFactor() { - return super.getScaleYFactor(); - } - - @Override - public void setScaleXFactor(float scaleXFactor) { - super.setScaleXFactor(scaleXFactor); - } - - @Override - public void setScaleYFactor(float scaleYFactor) { - super.setScaleYFactor(scaleYFactor); - } - - @Override - public float getMaxScaleX() { - return super.getMaxScaleX(); - } - - @Override - public float getMaxScaleY() { - return super.getMaxScaleY(); - } - - @Override - public float getMinScaleX() { - return super.getMinScaleX(); - } - - @Override - public float getMinScaleY() { - return super.getMinScaleY(); - } - - @Override - public void setMaxScaleX(float maxScaleX) { - super.setMaxScaleX(maxScaleX); - } - - @Override - public void setMaxScaleY(float maxScaleY) { - super.setMaxScaleY(maxScaleY); - } - - @Override - public void setMinScaleX(float minScaleX) { - super.setMinScaleX(minScaleX); - } - - @Override - public void setMinScaleY(float minScaleY) { - super.setMinScaleY(minScaleY); - } } diff --git a/carouselview/src/main/java/com/gtomato/android/ui/widget/CarouselView.java b/carouselview/src/main/java/com/gtomato/android/ui/widget/CarouselView.java index 5936eef..dadc685 100644 --- a/carouselview/src/main/java/com/gtomato/android/ui/widget/CarouselView.java +++ b/carouselview/src/main/java/com/gtomato/android/ui/widget/CarouselView.java @@ -30,23 +30,19 @@ public class CarouselView extends RecyclerView { private ViewTransformer mTransformer = CarouselLayoutManager.DEFAULT_TRANSFORMER; private boolean mIsInfinite; private boolean mScrollingAlignToViews, mEnableFling, mClickToScroll; - private OnScrollListener mOnScrollListener; private OnItemClickListener mOnItemClickListener; private OnItemSelectedListener mOnItemSelectedListener; - private int mLastSelectedPosition = Integer.MIN_VALUE; private float mLastScrollStartPositionPoint = 0f; private boolean mIsScrollTriggeredByUser; - private boolean mShouldPostUpdatePositionCall = false; - - private RecyclerView.OnScrollListener mInternalOnScrollListener = new RecyclerView.OnScrollListener() { + private final RecyclerView.OnScrollListener mInternalOnScrollListener = new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); - /** - * Allowance of scroll offset to scroll to the next item instead of falling back to the current item. - * 0.3 stands for 30% offset of the item width. + /* + Allowance of scroll offset to scroll to the next item instead of falling back to the current item. + 0.3 stands for 30% offset of the item width. */ final float SCROLL_ALIGN_ALLOWANCE = 0.1f; @@ -81,39 +77,6 @@ public void onScrollStateChanged(RecyclerView recyclerView, int newState) { } break; } - - if (mOnScrollListener != null) { - mOnScrollListener.onScrollStateChanged((CarouselView) recyclerView, newState); - switch (newState) { - case SCROLL_STATE_IDLE: { - mOnScrollListener.onScrollEnd((CarouselView) recyclerView); - } - break; - - case SCROLL_STATE_DRAGGING: { - mOnScrollListener.onScrollBegin((CarouselView) recyclerView); - } - break; - - case SCROLL_STATE_SETTLING: { - mOnScrollListener.onFling((CarouselView) recyclerView); - } - break; - } - } - } - - @Override - public void onScrolled(RecyclerView recyclerView, int dx, int dy) { - super.onScrolled(recyclerView, dx, dy); - if (mOnScrollListener != null) { - mOnScrollListener.onScrolled((CarouselView) recyclerView, dx, dy); - mOnScrollListener.onScrolled((CarouselView) recyclerView, - (int) Math.floor(mLayoutManager.getCurrentPositionPoint()), - mLayoutManager.translatePosition((int) Math.floor(mLayoutManager.getCurrentPositionPoint())), - mLayoutManager.getCurrentOffset() - ); - } } }; @@ -138,7 +101,6 @@ private void init() { mEnableFling = true; mClickToScroll = true; setLayoutManagerInternal(new CarouselLayoutManager()); - mOnScrollListener = null; mOnItemClickListener = null; super.setOnScrollListener(mInternalOnScrollListener); } @@ -194,16 +156,15 @@ private void setLayoutManagerInternal(CarouselLayoutManager layout) { mLayoutManager = layout; mLayoutManager.setInfinite(mIsInfinite); setExtraVisibleChilds(1); -// setDisplayMode(aDisplayMode); mLayoutManager.setOnItemClickListener(new OnItemClickListener() { @Override - public void onItemClick(Adapter adapter, View view, int position, int adapterPosition) { + public void onItemClick(View view, int position, int adapterPosition) { if (mClickToScroll) { smoothScrollToPosition(position); } if (mOnItemClickListener != null) { - mOnItemClickListener.onItemClick(getAdapter(), view, position, adapterPosition); + mOnItemClickListener.onItemClick(view, position, adapterPosition); } } }); @@ -218,62 +179,6 @@ public CarouselLayoutManager getLayoutManager() { return mLayoutManager; } - /** - * Returns the current position. It can be negative or very large if - * the items are repeating. - * @return - * @see CarouselLayoutManager#getCurrentPosition() - */ - public int getCurrentPosition() { - return mLayoutManager.getCurrentPosition(); - } - - /** - * Returns the current adapter position, which is in the range of [0, itemCount). - * @return - * @see CarouselLayoutManager#translatePosition(int) - * @see CarouselLayoutManager#getCurrentPosition() - */ - public int getCurrentAdapterPosition() { - return mLayoutManager.translatePosition(mLayoutManager.getCurrentPosition()); - } - - /** - * Returns the scrolling position in pixel. - * @return - * @see CarouselLayoutManager#getCurrentOffset() - */ - public float getCurrentOffset() { - return mLayoutManager.getCurrentOffset(); - } - - /** - * Returns the current position in floating points. - * @return - * @see CarouselLayoutManager#getCurrentPositionPoint() - */ - public float getCurrentPositionPoint() { - return mLayoutManager.getCurrentPositionPoint(); - } - - /** - * Returns the last position in floating point when this CarouselView starts to scroll. - * @return Last position in floating point. - */ - public float getLastScrollStartPositionPoint() { - return mLastScrollStartPositionPoint; - } - - /** - * Returns whether the given position is valid. - * @param position - * @return - * @see CarouselLayoutManager#isValidPosition(int) - */ - public boolean isValidPosition(int position) { - return mLayoutManager.isValidPosition(position); - } - /** * Smooth scroll to a given position if it is valid. OnItemSelectedListener may be triggered at this point. * @param position @@ -303,46 +208,8 @@ public void scrollToPosition(int position) { */ private void dispatchPositionUpdateMessage(int position) { if (mOnItemSelectedListener != null) { - if (mLastSelectedPosition != Integer.MIN_VALUE && mLastSelectedPosition != position) { - mOnItemSelectedListener.onItemDeselected(this, mLastSelectedPosition, mLayoutManager.translatePosition(mLastSelectedPosition), getAdapter()); - } - mOnItemSelectedListener.onItemSelected(this, position, mLayoutManager.translatePosition(position), getAdapter()); - } else { - mShouldPostUpdatePositionCall = true; + mOnItemSelectedListener.onItemSelected(position); } - mLastSelectedPosition = position; - } - - /** - * Returns whether enableFling is set. - * @return - */ - public boolean isEnableFling() { - return mEnableFling; - } - - /** - * Set enableFling. If enableFling is false, scrolling stops once users' finger releases; - * otherwise, leave the scrolling behaviour as is. - * - *

- * - * Default value: true - * - * @param enableFling - * @return this - */ - public CarouselView setEnableFling(boolean enableFling) { - mEnableFling = enableFling; - return this; - } - - /** - * Returns whether scrollingAlignToViews is set. - * @return - */ - public boolean isScrollingAlignToViews() { - return mScrollingAlignToViews; } /** @@ -361,47 +228,15 @@ public CarouselView setScrollingAlignToViews(boolean scrollingAlignToViews) { return this; } - /** - * Returns if clickToScroll is set. - * @return - */ - public boolean isClickToScroll() { - return mClickToScroll; - } - - /** - * Set clickToScroll. If clickToScroll is true, this CarouselView will scroll to an item once it is clicked. - * Note that sometimes it may interfere with other touch events. - * - * Default value: true - * - * @param clickToScroll - * @return this - */ - public CarouselView setClickToScroll(boolean clickToScroll) { - mClickToScroll = clickToScroll; - return this; - } - @Override protected void onMeasure(int widthSpec, int heightSpec) { super.onMeasure(widthSpec, heightSpec); log("CarouselView onMeasure " + getMeasuredWidth() + ", " + getMeasuredHeight()); } - /** - * Set an OnItemClickListener. - * @param onItemClickListener - * @return this - */ - public CarouselView setOnItemClickListener(OnItemClickListener onItemClickListener) { - mOnItemClickListener = onItemClickListener; - return this; - } - @Override public boolean onTouchEvent(MotionEvent e) { - boolean result = false; + boolean result; final int action = MotionEventCompat.getActionMasked(e); // Remark: It seems action = MotionEvent.ACTION_DOWN is never trigged, and only MotionEvent.ACTION_UP and MotionEvent.ACTION_MOVE would be triggered. @@ -418,25 +253,9 @@ public boolean onTouchEvent(MotionEvent e) { } result = super.onTouchEvent(e); -// if (mScrollingAlignToViews) { -// if ((action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) -// && getScrollState() == RecyclerView.SCROLL_STATE_IDLE) { -// smoothScrollToPosition(mLayoutManager.getCurrentPosition()); -// } -// } return result; } - /** - * Set an OnScrollListener. - * @param onScrollListener - * @return this - */ - public CarouselView setOnScrollListener(OnScrollListener onScrollListener) { - mOnScrollListener = onScrollListener; - return this; - } - /** * @hide * @@ -457,36 +276,32 @@ public void setOnScrollListener(RecyclerView.OnScrollListener listener) { public CarouselView setOnItemSelectedListener(OnItemSelectedListener onItemSelectedListener) { mOnItemSelectedListener = onItemSelectedListener; -// if (mShouldPostUpdatePositionCall) { - post(new Runnable() { - @Override - public void run() { - int pos = mLayoutManager.getCurrentPosition(); - if (mLayoutManager.isValidPosition(pos)) { - dispatchPositionUpdateMessage(pos); - mShouldPostUpdatePositionCall = false; - } else { - getAdapter().registerAdapterDataObserver(new AdapterDataObserver() { - @Override - public void onChanged() { - final AdapterDataObserver observer = this; - post(new Runnable() { - @Override - public void run() { - int pos = mLayoutManager.getCurrentPosition(); - if (mLayoutManager.isValidPosition(pos)) { - getAdapter().unregisterAdapterDataObserver(observer); - mShouldPostUpdatePositionCall = false; - dispatchPositionUpdateMessage(pos); - } + post(new Runnable() { + @Override + public void run() { + int pos = mLayoutManager.getCurrentPosition(); + if (mLayoutManager.isValidPosition(pos)) { + dispatchPositionUpdateMessage(pos); + } else { + getAdapter().registerAdapterDataObserver(new AdapterDataObserver() { + @Override + public void onChanged() { + final AdapterDataObserver observer = this; + post(new Runnable() { + @Override + public void run() { + int pos = mLayoutManager.getCurrentPosition(); + if (mLayoutManager.isValidPosition(pos)) { + getAdapter().unregisterAdapterDataObserver(observer); + dispatchPositionUpdateMessage(pos); } - }); - } - }); - } + } + }); + } + }); } - }); -// } + } + }); return this; } @@ -530,8 +345,6 @@ public enum DisplayMode { /** * Simple carousel with customized parameters. - * - * @see #setParameter(Parameter, float) */ Parameterized, @@ -648,14 +461,6 @@ public CarouselView setInfinite(boolean isInfinite) { return this; } - /** - * Returns the number of extra children per side to be preserved and managed by transformations. - * @return - */ - public int getExtraVisibleChilds() { - return mLayoutManager.getExtraVisibleChilds(); - } - /** * Set the number of extra children per side to be preserved and managed by transformations. * @param num @@ -695,16 +500,6 @@ private static void log(String format, Object... args) { } } - private static void logv(String format, Object... args) { - if (sIsDebug) { - if (args.length > 0) { - Log.v(TAG, String.format(format, args)); - } else { - Log.v(TAG, format); - } - } - } - /** * Drawing order of item views. */ @@ -734,70 +529,17 @@ public enum DrawOrder { CenterBack } - /** - * Definition of a callback to be invoked when a CarouselView has been scrolled. - */ - public abstract static class OnScrollListener { - /** - * Callback method to be invoked when CarouselView is being dragged by outside input such as user touch input. - * @param carouselView - */ - public void onScrollBegin(CarouselView carouselView) {} - - /** - * Callback method to be invoked when CarouselView stops scrolling. - * @param carouselView - */ - public void onScrollEnd(CarouselView carouselView) {} - - /** - * Callback method to be invoked when CarouselView is animating to a final position while not under outside control. - * @param carouselView - */ - public void onFling(CarouselView carouselView) {} - - /** - * Callback method to be invoked when CarouselView's scroll state changes. - * - * @param carouselView The CarouselView whose scroll state has changed. - * @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE}, - * {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}. - */ - public void onScrollStateChanged(CarouselView carouselView, int newState){} - - /** - * Callback method to be invoked when the CarouselView has been scrolled. This will be - * called after the scroll has completed. - * - * @param carouselView The CarouselView which has been scrolled. - * @param dx The amount of horizontal scroll. - * @param dy The amount of vertical scroll. - */ - public void onScrolled(CarouselView carouselView, int dx, int dy){} - - /** - * Callback method to be invoked when the CarouselView has been scrolled. This will be - * called after the scroll has completed. - * @param carouselView The CarouselView which has been scrolled. - * @param position {@link #getCurrentPosition() Current position}. - * @param adapterPosition {@link #getCurrentAdapterPosition() Current adapter position}. - * @param offset The decimal part of the current position, in the range of [0, 1). - */ - public void onScrolled(CarouselView carouselView, int position, int adapterPosition, float offset){} - } - /** * Definition of a callback to be invoked when an item in CarouselView has been clicked. */ public interface OnItemClickListener { /** * Callback method to be invoked when an item in CarouselView has been clicked. - * @param adapter * @param view - * @param position {@link #getCurrentPosition() Current position}. - * @param adapterPosition {@link #getCurrentAdapterPosition() Current adapter position}. + * @param position Current position. + * @param adapterPosition Current adapter position. */ - void onItemClick(Adapter adapter, View view, int position, int adapterPosition); + void onItemClick(View view, int position, int adapterPosition); } /** @@ -806,21 +548,10 @@ public interface OnItemClickListener { public interface OnItemSelectedListener { /** * Callback method to be invoked when the item is selected or **reselected**. - * @param carouselView * @param position - * @param adapterPosition - * @param adapter */ - void onItemSelected(CarouselView carouselView, int position, int adapterPosition, Adapter adapter); + void onItemSelected(int position); - /** - * Callback method to be invoked when the item changes from selected state to a non-selected state. - * @param carouselView - * @param position - * @param adapterPosition - * @param adapter - */ - void onItemDeselected(CarouselView carouselView, int position, int adapterPosition, Adapter adapter); } /** @@ -861,13 +592,6 @@ public interface Scroller { */ int tweakScrollDx(int dx); - /** - * Tweak the value of scroll delta Y. - * @param dy - * @return new value of scroll delta Y - */ - int tweakScrollDy(int dy); - /** * Reverse the changes made to tweak the value of scroll delta X. * @param dx @@ -875,13 +599,6 @@ public interface Scroller { */ int inverseTweakScrollDx(int dx); - /** - * Reverse the changes made to tweak the value of scroll delta Y. - * @param dy - * @return new value of scroll delta Y - */ - int inverseTweakScrollDy(int dy); - /** * Tweak the value of scroll delta X. * @param dx @@ -889,11 +606,5 @@ public interface Scroller { */ float tweakScrollDx(float dx); - /** - * Tweak the value of scroll delta Y. - * @param dy - * @return new value of scroll delta Y - */ - float tweakScrollDy(float dy); } } diff --git a/carouselview/src/main/java/com/gtomato/android/util/MultiSparseArray.java b/carouselview/src/main/java/com/gtomato/android/util/MultiSparseArray.java index 1086cd4..4dfecfa 100644 --- a/carouselview/src/main/java/com/gtomato/android/util/MultiSparseArray.java +++ b/carouselview/src/main/java/com/gtomato/android/util/MultiSparseArray.java @@ -13,8 +13,7 @@ */ public class MultiSparseArray { - SparseArray> mArray; - int mSize = 0; + private final SparseArray> mArray; public MultiSparseArray() { mArray = new SparseArray<>(); @@ -28,38 +27,20 @@ public void put(int key, E value) { ArrayList values = mArray.get(key); if (values == null) values = new ArrayList<>(); values.add(value); - ++mSize; mArray.put(key, values); } - public E get(int key) { - ArrayList values = mArray.get(key); - if (values != null && values.size() > 0) return values.get(0); - return null; - } - public E pop(int key) { ArrayList values = mArray.get(key); if (values != null && values.size() > 0) { E value = values.get(0); values.remove(0); - --mSize; return value; } return null; } - public void remove(int key) { - ArrayList values = mArray.get(key); - if (values != null && values.size() > 0) { - values.remove(0); - --mSize; - // let the empty array to stay in memory - } - } - public int size() { -// return mSize; return mArray.size(); } diff --git a/carouselview/src/main/java/com/gtomato/android/util/PerformanceTimer.java b/carouselview/src/main/java/com/gtomato/android/util/PerformanceTimer.java deleted file mode 100644 index 288128f..0000000 --- a/carouselview/src/main/java/com/gtomato/android/util/PerformanceTimer.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gtomato.android.util; - -import android.util.Log; - -/** - * A utility to measure performance. - * - * @author sunny-chung - */ -public class PerformanceTimer { - private long lastTime = 0; - private String tag = getClass().getSimpleName(); - - public PerformanceTimer(String tagName) { - tag = tagName; - } - - /** - * Start a timer, or log the duration if it has been started, then restart the timer. - */ - public void time() { - long currentTime = System.currentTimeMillis(); - if (lastTime != 0) { - Log.d(tag, "Timer: took " + (currentTime - lastTime) + " ms"); - } - lastTime = currentTime; - } - - /** - * Log an operation that has just been finished, then restart the timer. - * - * @param operation Operation name - */ - public void time(String operation) { - long currentTime = System.currentTimeMillis(); - if (lastTime != 0) { - Log.d(tag, "TimerOperation " + operation + ": took " + (currentTime - lastTime) + " ms"); - } - lastTime = currentTime; - } - - /** - * Restart the timer. - */ - public void reset() { - lastTime = System.currentTimeMillis(); - } -} diff --git a/demo/build.gradle b/demo/build.gradle index f3fb435..d883b5d 100644 --- a/demo/build.gradle +++ b/demo/build.gradle @@ -1,15 +1,21 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 25 - buildToolsVersion '25.0.3' + compileSdkVersion 28 + buildToolsVersion '29.0.0 rc1' defaultConfig { applicationId "com.gt.android.demo.carouselviewdemo" - minSdkVersion 15 - targetSdkVersion 23 + minSdkVersion 22 + targetSdkVersion 28 versionCode 1 versionName "1.0" + + javaCompileOptions { + annotationProcessorOptions { + includeCompileClasspath = true + } + } } buildTypes { release { @@ -20,10 +26,9 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) - compile 'com.android.support:appcompat-v7:25.1.0' - compile 'com.jakewharton:butterknife:6.0.0' -// compile 'com.gt.android.library:carouselview:1.0.4' - compile project(':carouselview') - compile 'com.android.support:design:25.1.0' + implementation fileTree(include: ['*.jar'], dir: 'libs') + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.jakewharton:butterknife:6.0.0' + implementation project(':carouselview') + implementation 'com.android.support:design:28.0.0' } diff --git a/demo/src/androidTest/java/com/gtomato/android/demo/carouselviewdemo/ApplicationTest.java b/demo/src/androidTest/java/com/gtomato/android/demo/carouselviewdemo/ApplicationTest.java deleted file mode 100644 index 38fd201..0000000 --- a/demo/src/androidTest/java/com/gtomato/android/demo/carouselviewdemo/ApplicationTest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gtomato.android.demo.carouselviewdemo; - -import android.app.Application; -import android.test.ApplicationTestCase; - -/** - * Testing Fundamentals - */ -public class ApplicationTest extends ApplicationTestCase { - public ApplicationTest() { - super(Application.class); - } -} \ No newline at end of file diff --git a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/CarouselFragment.java b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/CarouselFragment.java index 4ae076e..94a8573 100755 --- a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/CarouselFragment.java +++ b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/CarouselFragment.java @@ -4,7 +4,6 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; -import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -22,14 +21,13 @@ * @author sunny-chung */ public class CarouselFragment extends Fragment { - CarouselView carousel; - TextView lblSelectedIndex; + private CarouselView carousel; + private TextView lblSelectedIndex; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_main, container, false); - return rootView; + return inflater.inflate(R.layout.fragment_main, container, false); } @Override @@ -38,8 +36,8 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { final Bundle args = getArguments(); - carousel = (CarouselView) getView().findViewById(R.id.carousel); - lblSelectedIndex = (TextView) getView().findViewById(R.id.lblSelectedIndex); + carousel = getView().findViewById(R.id.carousel); + lblSelectedIndex = getView().findViewById(R.id.lblSelectedIndex); ViewGroup.LayoutParams lp = carousel.getLayoutParams(); lp.width = args.getInt("layoutWidth"); @@ -64,14 +62,9 @@ public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { carousel.setOnItemSelectedListener(new CarouselView.OnItemSelectedListener() { @Override - public void onItemSelected(CarouselView carouselView, int position, int adapterPosition, RecyclerView.Adapter adapter) { + public void onItemSelected(int position) { lblSelectedIndex.setText("Selected Position " + position); } - - @Override - public void onItemDeselected(CarouselView carouselView, int position, int adapterPosition, RecyclerView.Adapter adapter) { - - } }); int transformerSelectedPos = args.getInt("transformerPos"); @@ -137,19 +130,21 @@ public void run() { }); } - public static class ViewHolder extends CarouselView.ViewHolder { + static class ViewHolder extends CarouselView.ViewHolder { @InjectView(R.id.carousel_child_container) TextView textView; - public ViewHolder(View itemView) { + ViewHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); } } - public static class RandomPageAdapter extends CarouselView.Adapter { - int size, width, height; + static class RandomPageAdapter extends CarouselView.Adapter { + final int size; + final int width; + final int height; - public RandomPageAdapter(int size, int width, int height) { + RandomPageAdapter(int size, int width, int height) { super(); this.size = size; this.width = width; @@ -160,8 +155,7 @@ public RandomPageAdapter(int size, int width, int height) { public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Context context = parent.getContext(); View view = RandomPageFragment.createView(context, width, height, "0"); - ViewHolder holder = new ViewHolder(view); - return holder; + return new ViewHolder(view); } @Override diff --git a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/CarouselParameters.java b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/CarouselParameters.java index b5c9be7..5335749 100644 --- a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/CarouselParameters.java +++ b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/CarouselParameters.java @@ -30,8 +30,8 @@ * @author sunny-chung */ -public class CarouselParameters { - public static final List> TRANSFORMER_CLASSES = Arrays.asList( +class CarouselParameters { + static final List> TRANSFORMER_CLASSES = Arrays.asList( LinearViewTransformer.class, WheelViewTransformer.class, CoverFlowViewTransformer.class, @@ -50,24 +50,24 @@ public class CarouselParameters { private static final Map PARAMETER_RANGES = new HashMap() {{ // only "from" and "to" fields of RangeInfo are used - put("yProjection", new RangeInfo<>(0.0, 90.0, 0, 0)); - put("numPies", new RangeInfo<>(1, Integer.MAX_VALUE, 0, 0)); - put("horizontalViewPort", new RangeInfo<>(0.0, 1.0, 0, 0)); - put("farAlpha", new RangeInfo<>(-1.0, 1.0, 0, 0)); + put("yProjection", new RangeInfo<>(0.0, 90.0, 0.0, 0)); + put("numPies", new RangeInfo<>(1.0, Double.MAX_VALUE, 0.0, 0)); + put("horizontalViewPort", new RangeInfo<>(0.0, 1.0, 0.0, 0)); + put("farAlpha", new RangeInfo<>(-1.0, 1.0, 0.0, 0)); }}; - public static final Map GRAVITY = Collections.unmodifiableMap(new LinkedHashMap() {{ - put("LEFT", Gravity.LEFT); - put("RIGHT", Gravity.RIGHT); + static final Map GRAVITY = Collections.unmodifiableMap(new LinkedHashMap() {{ + put("LEFT", Gravity.START); + put("RIGHT", Gravity.END); put("TOP", Gravity.TOP); put("BOTTOM", Gravity.BOTTOM); put("CENTER", Gravity.CENTER); put("CENTER_HORIZONTAL", Gravity.CENTER_HORIZONTAL); put("CENTER_VERTICAL", Gravity.CENTER_VERTICAL); - put("LEFT|BOTTOM", Gravity.LEFT | Gravity.BOTTOM); - put("LEFT|CENTER_VERTICAL", Gravity.LEFT | Gravity.CENTER_VERTICAL); - put("RIGHT|BOTTOM", Gravity.RIGHT | Gravity.BOTTOM); - put("RIGHT|CENTER_VERTICAL", Gravity.RIGHT | Gravity.CENTER_VERTICAL); + put("LEFT|BOTTOM", Gravity.START | Gravity.BOTTOM); + put("LEFT|CENTER_VERTICAL", Gravity.START | Gravity.CENTER_VERTICAL); + put("RIGHT|BOTTOM", Gravity.END | Gravity.BOTTOM); + put("RIGHT|CENTER_VERTICAL", Gravity.END | Gravity.CENTER_VERTICAL); }}); private static final double FLOAT_PARAMETER_DEFAULT_MAX_VALUE = 1.5f; @@ -76,7 +76,7 @@ public class CarouselParameters { private static final int INT_PARAMETER_DEFAULT_MAX_VALUE = 10; private static final int INT_PARAMETER_DEFAULT_MIN_VALUE = -10; - public static List getTransformerNames() { + static List getTransformerNames() { List names = new ArrayList<>(); for (Class clazz : TRANSFORMER_CLASSES) { names.add(clazz.getSimpleName()); @@ -84,7 +84,7 @@ public static List getTransformerNames() { return names; } - public static String getParameterName(String setterMethodName) { + static String getParameterName(String setterMethodName) { if (!setterMethodName.matches("set[A-Z].*")) { throw new IllegalArgumentException("not setter method"); } @@ -111,7 +111,7 @@ public static String getParameterName(String setterMethodName) { return parameterName; } - public static RangeInfo getParameterRangeInfoDouble(Method setterMethod) { + static RangeInfo getParameterRangeInfoDouble(Method setterMethod) { double upper = FLOAT_PARAMETER_DEFAULT_MAX_VALUE, lower = FLOAT_PARAMETER_DEFAULT_MIN_VALUE; @@ -161,7 +161,7 @@ public static RangeInfo getParameterRangeInfoDouble(Method setterMethod) return new RangeInfo<>(lower, upper, interval, numIntervals); } - public static RangeInfo getParameterRangeInfoInt(Method setterMethod) { + static RangeInfo getParameterRangeInfoInt(Method setterMethod) { int upper = INT_PARAMETER_DEFAULT_MAX_VALUE, lower = INT_PARAMETER_DEFAULT_MIN_VALUE; @@ -199,7 +199,7 @@ public static RangeInfo getParameterRangeInfoInt(Method setterMethod) { return new RangeInfo<>(lower, upper, interval, numIntervals); } - public static List getSetterMethods(Class clazz) { + static List getSetterMethods(Class clazz) { List result = new ArrayList<>(); Pattern setterMethodPattern = Pattern.compile("set[A-Z].*"); for (Method method : clazz.getMethods()) { @@ -210,7 +210,7 @@ public static List getSetterMethods(Class getSetterMethodMap(Class clazz) { + private static Map getSetterMethodMap(Class clazz) { Map result = new HashMap<>(); Pattern setterMethodPattern = Pattern.compile("set[A-Z].*"); for (Method method : clazz.getMethods()) { @@ -221,7 +221,7 @@ public static Map getSetterMethodMap(Class Map getDefaultTransformerParameters(Class clazz, List setterMethods) { + static Map getDefaultTransformerParameters(Class clazz, List setterMethods) { Map results = new HashMap<>(); T transformer; try { @@ -289,15 +289,13 @@ public static Map getDe throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); - } catch (ClassCastException e) { - throw e; } } return results; } - public static T createTransformer(Class clazz, Map parameters) { + static T createTransformer(Class clazz, Map parameters) { T transformer; try { transformer = clazz.getDeclaredConstructor().newInstance(); @@ -343,7 +341,7 @@ public static T createTransformer(Class return transformer; } - public static String getBeanName(String setterMethodName) { + static String getBeanName(String setterMethodName) { return setterMethodName.substring(3, 4).toLowerCase() + setterMethodName.substring(4); } @@ -362,10 +360,12 @@ private static A findAnnotation(Annotation[] annotations, } static class RangeInfo { - public T from, to, interval; - public int numIntervals; + final T from; + final T to; + final T interval; + final int numIntervals; - public RangeInfo(T from, T to, T interval, int numIntervals) { + RangeInfo(T from, T to, T interval, int numIntervals) { this.from = from; this.to = to; this.interval = interval; diff --git a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/ConfigFragment.java b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/ConfigFragment.java index b965867..dbd9c7d 100755 --- a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/ConfigFragment.java +++ b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/ConfigFragment.java @@ -51,14 +51,14 @@ public class ConfigFragment extends Fragment { @InjectView(R.id.spnLayoutHeight) Spinner spnLayoutHeight; @InjectView(R.id.rcvTransformerParameters) RecyclerView rcvTransformerParameters; @InjectView(R.id.tabPanel) TabLayout tabPanel; - ConfigRecyclerAdapter mConfigRecyclerAdapter; + private ConfigRecyclerAdapter mConfigRecyclerAdapter; @InjectViews({R.id.sekItems, R.id.sekExtraChilds, R.id.sekItemWidth, R.id.sekItemHeight}) List seekBars; @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.option, container, false); ButterKnife.inject(this, rootView); - setupView(rootView); + setupView(); return rootView; } @@ -68,7 +68,7 @@ private ArrayAdapter spinnerAdapterFromList(List list) { return adapter; } - protected void setupView(View view) { + private void setupView() { List transformerNames = new ArrayList<>(CarouselParameters.getTransformerNames()); transformerNames.add("Custom"); spnTransformer.setAdapter(spinnerAdapterFromList(transformerNames)); @@ -124,12 +124,6 @@ public void onTabReselected(TabLayout.Tab tab) { }); } - @Override - public void onResume() { - super.onResume(); -// updateDisplay(); - } - @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); @@ -162,7 +156,7 @@ void onSelectDisplayMode() { mConfigRecyclerAdapter.notifyDataSetChanged(); } - public void updateDisplay() { + private void updateDisplay() { // update data ((ConfigRowLayout) spnTransformer.getParent()).setText(spnTransformer.getSelectedItem().toString()); ((ConfigRowLayout) spnDrawOrder.getParent()).setText(spnDrawOrder.getSelectedItem().toString()); @@ -173,15 +167,10 @@ public void updateDisplay() { ((ConfigRowLayout) swhIsScrollingAlignToViews.getParent()).setText(swhIsScrollingAlignToViews.isChecked() ? "Yes" : "No"); ((ConfigRowLayout) swhIsClipChildren.getParent()).setText(swhIsClipChildren.isChecked() ? "Yes" : "No"); ((ConfigRowLayout) sekItems.getParent()).setText("" + (sekItems.getProgress() + 1)); -// ((ConfigRowLayout) sekAngle.getParent()).setText(sekAngle.getProgress() == 0 ? "OFF" : "" + sekAngle.getProgress()); -// ((ConfigRowLayout) sekOffsetX.getParent()).setText(sekOffsetX.getProgress() == 0 ? "OFF" : "" + (sekOffsetX.getProgress() - 11) / 10f); -// ((ConfigRowLayout) sekOffsetY.getParent()).setText(sekOffsetY.getProgress() == 0 ? "OFF" : "" + (sekOffsetY.getProgress() - 11) / 10f); ((ConfigRowLayout) sekExtraChilds.getParent()).setText("" + sekExtraChilds.getProgress()); ((ConfigRowLayout) sekItemWidth.getParent()).setText(sekItemWidth.getProgress() == sekItemWidth.getMax() ? "Fill Parent" : "" + (sekItemWidth.getProgress() * 10 + 40)); ((ConfigRowLayout) sekItemHeight.getParent()).setText(sekItemHeight.getProgress() == sekItemHeight.getMax() ? "Fill Parent" : "" + (sekItemHeight.getProgress() * 10 + 40)); -// mConfigRecyclerAdapter.notifyDataSetChanged(); - // update "tab" int nChilds = tabContentFrame.getChildCount(); for (int i = nChilds - 1; i >= 0; --i) { @@ -202,7 +191,7 @@ public void previewCarousel(View view) { args.putBoolean("isAlign", swhIsScrollingAlignToViews.isChecked()); args.putInt("drawOrder", spnDrawOrder.getSelectedItemPosition()); args.putInt("extraChilds", Integer.parseInt(((ConfigRowLayout) sekExtraChilds.getParent()).getText().toString())); - args.putInt("gravity", CarouselParameters.GRAVITY.get((String) spnGravity.getSelectedItem())); + args.putInt("gravity", CarouselParameters.GRAVITY.get(spnGravity.getSelectedItem())); args.putBoolean("isClipChildren", swhIsClipChildren.isChecked()); int layoutWidth; diff --git a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/ConfigRecyclerAdapter.java b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/ConfigRecyclerAdapter.java index a0d45fb..3517dbf 100644 --- a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/ConfigRecyclerAdapter.java +++ b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/ConfigRecyclerAdapter.java @@ -26,21 +26,19 @@ public class ConfigRecyclerAdapter extends RecyclerView.Adapter { - Class mClass; - List mSetterMethods = new ArrayList<>(); - final Object mLock = new Object(); + private List mSetterMethods = new ArrayList<>(); + private final Object mLock = new Object(); - Map mValues = new HashMap<>(); // key = beanName; value = actual value (boolean stores as Byte 1/0) + private Map mValues = new HashMap<>(); // key = beanName; value = actual value (boolean stores as Byte 1/0) - public ConfigRecyclerAdapter(Class aClass) { + ConfigRecyclerAdapter(Class aClass) { setClass(aClass); } public void setClass(Class aClass) { - mClass = aClass; synchronized (mLock) { - if (mClass != null) { + if (aClass != null) { mSetterMethods = CarouselParameters.getSetterMethods(aClass); mValues = CarouselParameters.getDefaultTransformerParameters(aClass, mSetterMethods); } else { @@ -50,7 +48,7 @@ public void setClass(Class aClass) { } } - public Map getSelectedValues() { + Map getSelectedValues() { return mValues; } @@ -68,9 +66,9 @@ public void onBindViewHolder(final ViewHolder vh, final int position) { final String beanName = CarouselParameters.getBeanName(method.getName()); - /** - * if cell changed, reconfigure the whole cell; - * otherwise, just update the result display text + /* + if cell changed, reconfigure the whole cell; + otherwise, just update the result display text */ boolean isCellChanged = vh.getOldPosition() != vh.getPosition(); @@ -224,13 +222,13 @@ public int getItemCount() { } } - public static class ViewHolder extends RecyclerView.ViewHolder { + static class ViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.lblTitle) TextView lblTitle; @InjectView(R.id.sekParameter) SeekBar sekParameter; @InjectView(R.id.swhParameter) Switch swhParameter; @InjectView(R.id.lblResult) TextView lblResult; - public ViewHolder(View itemView) { + ViewHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); } diff --git a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/RandomPageFragment.java b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/RandomPageFragment.java index 02f5dad..527c84d 100755 --- a/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/RandomPageFragment.java +++ b/demo/src/main/java/com/gtomato/android/demo/carouselviewdemo/RandomPageFragment.java @@ -22,7 +22,7 @@ * A simple {@link android.support.v4.app.Fragment} subclass. */ public class RandomPageFragment extends Fragment { - public final static String TEXT = "TEXT"; + private final static String TEXT = "TEXT"; private String text; diff --git a/demo/src/main/java/com/gtomato/android/ui/layout/ConfigRowLayout.java b/demo/src/main/java/com/gtomato/android/ui/layout/ConfigRowLayout.java index dc51ba5..48c34fd 100755 --- a/demo/src/main/java/com/gtomato/android/ui/layout/ConfigRowLayout.java +++ b/demo/src/main/java/com/gtomato/android/ui/layout/ConfigRowLayout.java @@ -1,8 +1,6 @@ package com.gtomato.android.ui.layout; -import android.annotation.TargetApi; import android.content.Context; -import android.os.Build; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; @@ -34,23 +32,8 @@ public ConfigRowLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } - @TargetApi(Build.VERSION_CODES.LOLLIPOP) - public ConfigRowLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { - super(context, attrs, defStyleAttr, defStyleRes); - } - - public TextView getTextView() { - return mTextView; - } - - public View getContentView() { - return mContentView; - } - @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { -// super.measure(widthMeasureSpec, heightMeasureSpec); - final int childCount = getChildCount(); if (childCount > 2) { @@ -63,13 +46,10 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int bottomOffset = getPaddingBottom(); int contentWidth = getMeasuredWidth() - leftOffset - rightOffset; - int contentHeight = getMeasuredHeight() - topOffset - bottomOffset; mMaxHeight = 0; for (int i = childCount - 1; i >= 0; --i) { View child = getChildAt(i); -// Size childSize = measureChildSize(child, contentWidth, MeasureSpec.UNSPECIFIED); -// mMaxHeight = Math.max(mMaxHeight, childSize.height); if (child.getVisibility() != View.GONE) { if (child.getClass().equals(TextView.class)) { @@ -80,8 +60,6 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { } } - //== - if (mContentView == null) { mContentView = mTextView; mTextView = null; @@ -90,17 +68,17 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { updatePendingText(); if (mTextView != null) { - if (mTextView.getGravity() != Gravity.RIGHT) { - mTextView.setGravity(Gravity.RIGHT); + if (mTextView.getGravity() != Gravity.END) { + mTextView.setGravity(Gravity.END); } - mTextViewSize = measureChildSize(mTextView, contentWidth, MeasureSpec.UNSPECIFIED); + mTextViewSize = measureChildSize(mTextView, contentWidth); mMaxHeight = Math.max(mMaxHeight, mTextViewSize.height); } mContentViewAvailableWidth = contentWidth - (mTextViewSize != null ? mTextViewSize.width /*+ (int) Metrics.convertDpToPixel(8, getContext())*/ : 0); if (mContentView != null) { - mContentViewSize = measureChildSize(mContentView, mContentViewAvailableWidth, MeasureSpec.UNSPECIFIED); + mContentViewSize = measureChildSize(mContentView, mContentViewAvailableWidth); mMaxHeight = Math.max(mMaxHeight, mContentViewSize.height); } @@ -109,13 +87,10 @@ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { - int topOffset = getPaddingTop(); int leftOffset = getPaddingLeft(); int rightOffset = getPaddingRight(); - int bottomOffset = getPaddingBottom(); int contentWidth = getMeasuredWidth() - leftOffset - rightOffset; - int contentHeight = getMeasuredHeight() - topOffset - bottomOffset; if (mTextView != null) { mTextView.layout(leftOffset, (mMaxHeight - mTextViewSize.height) / 2, leftOffset + contentWidth, (mMaxHeight + mTextViewSize.height) / 2); @@ -140,23 +115,30 @@ public CharSequence getText() { return mTextView.getText(); } - protected void updatePendingText() { + private void updatePendingText() { if (mTextView != null && mText != null) { mTextView.setText(mText); mText = null; } } - private Size measureChildSize(View child, int parentWidth, int parentHeight) { - child.measure(parentHeight == MeasureSpec.UNSPECIFIED ? MeasureSpec.UNSPECIFIED : MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.AT_MOST), - parentHeight == MeasureSpec.UNSPECIFIED ? MeasureSpec.UNSPECIFIED : MeasureSpec.makeMeasureSpec(parentHeight, MeasureSpec.AT_MOST)); + private Size measureChildSize(View child, int parentWidth) { + child.measure( + MeasureSpec.UNSPECIFIED == MeasureSpec.UNSPECIFIED + ? MeasureSpec.UNSPECIFIED + : MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.AT_MOST), + MeasureSpec.UNSPECIFIED == MeasureSpec.UNSPECIFIED + ? MeasureSpec.UNSPECIFIED + : MeasureSpec.makeMeasureSpec(MeasureSpec.UNSPECIFIED, MeasureSpec.AT_MOST) + ); return new Size(child.getMeasuredWidth(), child.getMeasuredHeight()); } private static class Size { - int width, height; + final int width; + final int height; - public Size(int width, int height) { + Size(int width, int height) { this.width = width; this.height = height; } diff --git a/demo/src/main/java/com/gtomato/android/util/Metrics.java b/demo/src/main/java/com/gtomato/android/util/Metrics.java index dd635c0..c4be99f 100755 --- a/demo/src/main/java/com/gtomato/android/util/Metrics.java +++ b/demo/src/main/java/com/gtomato/android/util/Metrics.java @@ -14,19 +14,7 @@ public class Metrics { * @return pixel */ public static float convertDpToPixel(float dp, Context context){ - float px = dp * getDensity(context); - return px; - } - - /** - * Covert px to dp - * @param px - * @param context - * @return dp - */ - public static float convertPixelToDp(float px, Context context){ - float dp = px / getDensity(context); - return dp; + return dp * getDensity(context); } /** @@ -37,7 +25,7 @@ public static float convertPixelToDp(float px, Context context){ * @param context * @return */ - public static float getDensity(Context context){ + private static float getDensity(Context context){ DisplayMetrics metrics = context.getResources().getDisplayMetrics(); return metrics.density; } diff --git a/demo/src/main/res/layout/fragment_main.xml b/demo/src/main/res/layout/fragment_main.xml index 261db35..a356010 100755 --- a/demo/src/main/res/layout/fragment_main.xml +++ b/demo/src/main/res/layout/fragment_main.xml @@ -30,7 +30,6 @@ tools:text="Selected Index" android:layout_alignParentStart="true" android:layout_alignParentBottom="true" - android:layout_alignParentLeft="true" android:textColor="@android:color/white"/> diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index bdb9209..5529c3d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Sep 10 21:01:14 HKT 2017 +#Tue Mar 26 11:43:14 CET 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip