From d303fe348c146335070bb769bed02543ecf8c590 Mon Sep 17 00:00:00 2001 From: WillyYu Date: Wed, 29 Nov 2017 11:19:33 +0800 Subject: [PATCH 1/5] Fix handler null pointer exception in AnimationRatingBar (#40) The exception is because the constructor's @setRating is before create handler instance. --- .../java/com/willy/example/EntryActivity.java | 2 +- example/src/main/res/layout/fragment_demo.xml | 3 ++- .../java/com/willy/ratingbar/BaseRatingBar.java | 16 +++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/example/src/main/java/com/willy/example/EntryActivity.java b/example/src/main/java/com/willy/example/EntryActivity.java index e2343b4..c307960 100644 --- a/example/src/main/java/com/willy/example/EntryActivity.java +++ b/example/src/main/java/com/willy/example/EntryActivity.java @@ -56,7 +56,7 @@ private SamplePagerAdapter(FragmentManager fm) { super(fm); fragments = new ArrayList<>(); fragments.add(new DemoFragment()); - fragments.add(new ListFragment()); +// fragments.add(new ListFragment()); } @Override diff --git a/example/src/main/res/layout/fragment_demo.xml b/example/src/main/res/layout/fragment_demo.xml index e827739..f2e1610 100644 --- a/example/src/main/res/layout/fragment_demo.xml +++ b/example/src/main/res/layout/fragment_demo.xml @@ -61,6 +61,7 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/textview_main_scaleratingbar_title" rb:starPadding="10dp" + rb:rating="4" rb:stepSize="0.5" /> + app:layout_constraintTop_toBottomOf="@+id/rotationratingbar_main" />z diff --git a/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java b/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java index 0893b05..da1e854 100644 --- a/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java +++ b/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java @@ -77,7 +77,7 @@ public BaseRatingBar(Context context, @Nullable AttributeSet attrs, int defStyle super(context, attrs, defStyleAttr); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBarAttributes); - float rating = typedArray.getFloat(R.styleable.RatingBarAttributes_rating, mRating); + final float rating = typedArray.getFloat(R.styleable.RatingBarAttributes_rating, 0); mNumStars = typedArray.getInt(R.styleable.RatingBarAttributes_numStars, mNumStars); mPadding = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starPadding, mPadding); mStarWidth = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starWidth, 0); @@ -96,9 +96,19 @@ public BaseRatingBar(Context context, @Nullable AttributeSet attrs, int defStyle mDecimalFormat = new DecimalFormat("#.##", symbols); verifyParamsValue(); - initRatingView(); - setRating(rating); + + addOnAttachStateChangeListener(new OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + setRating(rating); + } + + @Override + public void onViewDetachedFromWindow(View v) { + + } + }); } private void verifyParamsValue() { From 8f437ec34eb7aaf8d7d1d839f258bdf83ff993b3 Mon Sep 17 00:00:00 2001 From: WillyYu Date: Wed, 29 Nov 2017 11:46:58 +0800 Subject: [PATCH 2/5] Refactoring BaseRatingBar --- .../com/willy/ratingbar/BaseRatingBar.java | 49 ++++++++++++------- 1 file changed, 30 insertions(+), 19 deletions(-) diff --git a/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java b/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java index da1e854..fb90f04 100644 --- a/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java +++ b/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java @@ -34,7 +34,7 @@ public interface OnRatingChangeListener { private static final int MAX_CLICK_DISTANCE = 5; private static final int MAX_CLICK_DURATION = 200; - private final DecimalFormat mDecimalFormat; + private DecimalFormat mDecimalFormat; private int mNumStars; private int mPadding = 0; @@ -78,23 +78,8 @@ public BaseRatingBar(Context context, @Nullable AttributeSet attrs, int defStyle TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBarAttributes); final float rating = typedArray.getFloat(R.styleable.RatingBarAttributes_rating, 0); - mNumStars = typedArray.getInt(R.styleable.RatingBarAttributes_numStars, mNumStars); - mPadding = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starPadding, mPadding); - mStarWidth = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starWidth, 0); - mStarHeight = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starHeight, 0); - mStepSize = typedArray.getFloat(R.styleable.RatingBarAttributes_stepSize, mStepSize); - mEmptyDrawable = typedArray.hasValue(R.styleable.RatingBarAttributes_drawableEmpty) ? ContextCompat.getDrawable(context, typedArray.getResourceId(R.styleable.RatingBarAttributes_drawableEmpty, View.NO_ID)) : null; - mFilledDrawable = typedArray.hasValue(R.styleable.RatingBarAttributes_drawableFilled) ? ContextCompat.getDrawable(context, typedArray.getResourceId(R.styleable.RatingBarAttributes_drawableFilled, View.NO_ID)) : null; - mIsIndicator = typedArray.getBoolean(R.styleable.RatingBarAttributes_isIndicator, mIsIndicator); - mIsScrollable = typedArray.getBoolean(R.styleable.RatingBarAttributes_scrollable, mIsScrollable); - mIsClickable = typedArray.getBoolean(R.styleable.RatingBarAttributes_clickable, mIsClickable); - mClearRatingEnabled = typedArray.getBoolean(R.styleable.RatingBarAttributes_clearRatingEnabled, mClearRatingEnabled); - typedArray.recycle(); - - DecimalFormatSymbols symbols = new DecimalFormatSymbols(); - symbols.setDecimalSeparator('.'); - mDecimalFormat = new DecimalFormat("#.##", symbols); + initParamsValue(typedArray, context); verifyParamsValue(); initRatingView(); @@ -109,6 +94,22 @@ public void onViewDetachedFromWindow(View v) { } }); + + } + + private void initParamsValue(TypedArray typedArray, Context context) { + mNumStars = typedArray.getInt(R.styleable.RatingBarAttributes_numStars, mNumStars); + mPadding = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starPadding, mPadding); + mStarWidth = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starWidth, 0); + mStarHeight = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starHeight, 0); + mStepSize = typedArray.getFloat(R.styleable.RatingBarAttributes_stepSize, mStepSize); + mEmptyDrawable = typedArray.hasValue(R.styleable.RatingBarAttributes_drawableEmpty) ? ContextCompat.getDrawable(context, typedArray.getResourceId(R.styleable.RatingBarAttributes_drawableEmpty, View.NO_ID)) : null; + mFilledDrawable = typedArray.hasValue(R.styleable.RatingBarAttributes_drawableFilled) ? ContextCompat.getDrawable(context, typedArray.getResourceId(R.styleable.RatingBarAttributes_drawableFilled, View.NO_ID)) : null; + mIsIndicator = typedArray.getBoolean(R.styleable.RatingBarAttributes_isIndicator, mIsIndicator); + mIsScrollable = typedArray.getBoolean(R.styleable.RatingBarAttributes_scrollable, mIsScrollable); + mIsClickable = typedArray.getBoolean(R.styleable.RatingBarAttributes_clickable, mIsClickable); + mClearRatingEnabled = typedArray.getBoolean(R.styleable.RatingBarAttributes_clearRatingEnabled, mClearRatingEnabled); + typedArray.recycle(); } private void verifyParamsValue() { @@ -339,9 +340,10 @@ private void handleMoveEvent(float eventX) { } private float calculateRating(float eventX, PartialView partialView) { - float ratioOfView = Float.parseFloat(mDecimalFormat.format((eventX - partialView.getLeft()) / partialView.getWidth())); + DecimalFormat decimalFormat = getDecimalFormat(); + float ratioOfView = Float.parseFloat(decimalFormat.format((eventX - partialView.getLeft()) / partialView.getWidth())); float steps = Math.round(ratioOfView / mStepSize) * mStepSize; - return Float.parseFloat(mDecimalFormat.format((int) partialView.getTag() - (1 - steps))); + return Float.parseFloat(decimalFormat.format((int) partialView.getTag() - (1 - steps))); } private void handleClickEvent(float eventX) { @@ -420,6 +422,15 @@ public void setStepSize(@FloatRange(from = 0.1, to = 1.0) float stepSize) { this.mStepSize = stepSize; } + public DecimalFormat getDecimalFormat() { + if (mDecimalFormat == null) { + DecimalFormatSymbols symbols = new DecimalFormatSymbols(); + symbols.setDecimalSeparator('.'); + mDecimalFormat = new DecimalFormat("#.##", symbols); + } + return mDecimalFormat; + } + @Override protected Parcelable onSaveInstanceState() { Parcelable superState = super.onSaveInstanceState(); From e837f0e763c312017efe66c327ff38513a3bc418 Mon Sep 17 00:00:00 2001 From: WillyYu Date: Wed, 29 Nov 2017 14:56:25 +0800 Subject: [PATCH 3/5] Adjust attrs name --- example/src/main/res/layout/fragment_demo.xml | 19 ++++----- .../com/willy/ratingbar/BaseRatingBar.java | 41 +++++++------------ library/src/main/res/values/attrs.xml | 26 ++++++------ 3 files changed, 35 insertions(+), 51 deletions(-) diff --git a/example/src/main/res/layout/fragment_demo.xml b/example/src/main/res/layout/fragment_demo.xml index f2e1610..e80669d 100644 --- a/example/src/main/res/layout/fragment_demo.xml +++ b/example/src/main/res/layout/fragment_demo.xml @@ -1,12 +1,9 @@ + android:layout_height="match_parent"> + app:srb_numStars="7" + app:srb_rating="2.5" + app:srb_starPadding="5dp" /> + app:srb_starPadding="10dp" + app:srb_rating="4" + app:srb_stepSize="0.5" /> z + app:layout_constraintTop_toBottomOf="@+id/rotationratingbar_main" /> diff --git a/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java b/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java index fb90f04..fbf377d 100644 --- a/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java +++ b/library/src/main/java/com/willy/ratingbar/BaseRatingBar.java @@ -76,39 +76,27 @@ public BaseRatingBar(Context context, @Nullable AttributeSet attrs) { public BaseRatingBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBarAttributes); - final float rating = typedArray.getFloat(R.styleable.RatingBarAttributes_rating, 0); + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BaseRatingBar); + final float rating = typedArray.getFloat(R.styleable.BaseRatingBar_srb_rating, 0); initParamsValue(typedArray, context); verifyParamsValue(); initRatingView(); - - addOnAttachStateChangeListener(new OnAttachStateChangeListener() { - @Override - public void onViewAttachedToWindow(View v) { - setRating(rating); - } - - @Override - public void onViewDetachedFromWindow(View v) { - - } - }); - + setRating(rating); } private void initParamsValue(TypedArray typedArray, Context context) { - mNumStars = typedArray.getInt(R.styleable.RatingBarAttributes_numStars, mNumStars); - mPadding = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starPadding, mPadding); - mStarWidth = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starWidth, 0); - mStarHeight = typedArray.getDimensionPixelSize(R.styleable.RatingBarAttributes_starHeight, 0); - mStepSize = typedArray.getFloat(R.styleable.RatingBarAttributes_stepSize, mStepSize); - mEmptyDrawable = typedArray.hasValue(R.styleable.RatingBarAttributes_drawableEmpty) ? ContextCompat.getDrawable(context, typedArray.getResourceId(R.styleable.RatingBarAttributes_drawableEmpty, View.NO_ID)) : null; - mFilledDrawable = typedArray.hasValue(R.styleable.RatingBarAttributes_drawableFilled) ? ContextCompat.getDrawable(context, typedArray.getResourceId(R.styleable.RatingBarAttributes_drawableFilled, View.NO_ID)) : null; - mIsIndicator = typedArray.getBoolean(R.styleable.RatingBarAttributes_isIndicator, mIsIndicator); - mIsScrollable = typedArray.getBoolean(R.styleable.RatingBarAttributes_scrollable, mIsScrollable); - mIsClickable = typedArray.getBoolean(R.styleable.RatingBarAttributes_clickable, mIsClickable); - mClearRatingEnabled = typedArray.getBoolean(R.styleable.RatingBarAttributes_clearRatingEnabled, mClearRatingEnabled); + mNumStars = typedArray.getInt(R.styleable.BaseRatingBar_srb_numStars, mNumStars); + mPadding = typedArray.getDimensionPixelSize(R.styleable.BaseRatingBar_srb_starPadding, mPadding); + mStarWidth = typedArray.getDimensionPixelSize(R.styleable.BaseRatingBar_srb_starWidth, 0); + mStarHeight = typedArray.getDimensionPixelSize(R.styleable.BaseRatingBar_srb_starHeight, 0); + mStepSize = typedArray.getFloat(R.styleable.BaseRatingBar_srb_stepSize, mStepSize); + mEmptyDrawable = typedArray.hasValue(R.styleable.BaseRatingBar_srb_drawableEmpty) ? ContextCompat.getDrawable(context, typedArray.getResourceId(R.styleable.BaseRatingBar_srb_drawableEmpty, View.NO_ID)) : null; + mFilledDrawable = typedArray.hasValue(R.styleable.BaseRatingBar_srb_drawableFilled) ? ContextCompat.getDrawable(context, typedArray.getResourceId(R.styleable.BaseRatingBar_srb_drawableFilled, View.NO_ID)) : null; + mIsIndicator = typedArray.getBoolean(R.styleable.BaseRatingBar_srb_isIndicator, mIsIndicator); + mIsScrollable = typedArray.getBoolean(R.styleable.BaseRatingBar_srb_scrollable, mIsScrollable); + mIsClickable = typedArray.getBoolean(R.styleable.BaseRatingBar_srb_clickable, mIsClickable); + mClearRatingEnabled = typedArray.getBoolean(R.styleable.BaseRatingBar_srb_clearRatingEnabled, mClearRatingEnabled); typedArray.recycle(); } @@ -153,7 +141,6 @@ private void initRatingView() { private PartialView getPartialView(final int ratingViewId, Drawable filledDrawable, Drawable emptyDrawable) { PartialView partialView = new PartialView(getContext()); -// partialView.setId(ratingViewId); partialView.setTag(ratingViewId); partialView.setPadding(mPadding, mPadding, mPadding, mPadding); partialView.setFilledDrawable(filledDrawable); diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml index 70b2d0b..d723454 100644 --- a/library/src/main/res/values/attrs.xml +++ b/library/src/main/res/values/attrs.xml @@ -1,18 +1,18 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file From d2f71e5a40eba8ae988970e1f9e52357ea329a8a Mon Sep 17 00:00:00 2001 From: WillyYu Date: Wed, 29 Nov 2017 14:56:31 +0800 Subject: [PATCH 4/5] Fix handler bug in recyclerview --- .../main/java/com/willy/example/EntryActivity.java | 2 +- .../com/willy/ratingbar/AnimationRatingBar.java | 14 +++++++++++++- .../com/willy/ratingbar/RotationRatingBar.java | 5 +---- .../java/com/willy/ratingbar/ScaleRatingBar.java | 5 +---- 4 files changed, 16 insertions(+), 10 deletions(-) diff --git a/example/src/main/java/com/willy/example/EntryActivity.java b/example/src/main/java/com/willy/example/EntryActivity.java index c307960..e2343b4 100644 --- a/example/src/main/java/com/willy/example/EntryActivity.java +++ b/example/src/main/java/com/willy/example/EntryActivity.java @@ -56,7 +56,7 @@ private SamplePagerAdapter(FragmentManager fm) { super(fm); fragments = new ArrayList<>(); fragments.add(new DemoFragment()); -// fragments.add(new ListFragment()); + fragments.add(new ListFragment()); } @Override diff --git a/library/src/main/java/com/willy/ratingbar/AnimationRatingBar.java b/library/src/main/java/com/willy/ratingbar/AnimationRatingBar.java index 2d6dd55..d3acb0d 100644 --- a/library/src/main/java/com/willy/ratingbar/AnimationRatingBar.java +++ b/library/src/main/java/com/willy/ratingbar/AnimationRatingBar.java @@ -2,9 +2,12 @@ import android.content.Context; import android.os.Handler; +import android.os.SystemClock; import android.support.annotation.Nullable; import android.util.AttributeSet; +import java.util.UUID; + /** * Created by willy on 2017/5/5. */ @@ -13,7 +16,7 @@ public class AnimationRatingBar extends BaseRatingBar { protected Handler mHandler; protected Runnable mRunnable; - protected String mRunnableToken = "AnimationRatingBar"; + protected String mRunnableToken = UUID.randomUUID().toString(); protected AnimationRatingBar(Context context) { super(context); @@ -34,5 +37,14 @@ private void init() { mHandler = new Handler(); } + protected void postRunnable(Runnable runnable, long ANIMATION_DELAY) { + if (mHandler == null) { + mHandler = new Handler(); + } + + long timeMillis = SystemClock.uptimeMillis() + ANIMATION_DELAY; + mHandler.postAtTime(runnable, mRunnableToken, timeMillis); + } + } diff --git a/library/src/main/java/com/willy/ratingbar/RotationRatingBar.java b/library/src/main/java/com/willy/ratingbar/RotationRatingBar.java index 8b26fdf..5ba4a7b 100644 --- a/library/src/main/java/com/willy/ratingbar/RotationRatingBar.java +++ b/library/src/main/java/com/willy/ratingbar/RotationRatingBar.java @@ -1,7 +1,6 @@ package com.willy.ratingbar; import android.content.Context; -import android.os.SystemClock; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; @@ -64,9 +63,7 @@ protected void fillRatingBar(final float rating) { } mRunnable = getAnimationRunnable(rating, partialView, ratingViewId, maxIntOfRating); - - long timeMillis = SystemClock.uptimeMillis() + ANIMATION_DELAY; - mHandler.postAtTime(mRunnable, mRunnableToken, timeMillis); + postRunnable(mRunnable, ANIMATION_DELAY); } } diff --git a/library/src/main/java/com/willy/ratingbar/ScaleRatingBar.java b/library/src/main/java/com/willy/ratingbar/ScaleRatingBar.java index 2f11a41..f8faafd 100644 --- a/library/src/main/java/com/willy/ratingbar/ScaleRatingBar.java +++ b/library/src/main/java/com/willy/ratingbar/ScaleRatingBar.java @@ -1,7 +1,6 @@ package com.willy.ratingbar; import android.content.Context; -import android.os.SystemClock; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; @@ -64,9 +63,7 @@ protected void fillRatingBar(final float rating) { } mRunnable = getAnimationRunnable(rating, partialView, ratingViewId, maxIntOfRating); - - long timeMillis = SystemClock.uptimeMillis() + ANIMATION_DELAY; - mHandler.postAtTime(mRunnable, mRunnableToken, timeMillis); + postRunnable(mRunnable, ANIMATION_DELAY); } } From 6cffb3d9041661a8d2103c51af75b5e9ae13ffa2 Mon Sep 17 00:00:00 2001 From: WillyYu Date: Wed, 29 Nov 2017 15:05:53 +0800 Subject: [PATCH 5/5] Update README.md --- README.md | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index d2be8ea..aab022e 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,12 @@ Current we already have three RatingBars : ![](images/screenshot.png) Icon made by [Freepik](http://www.freepik.com/) from www.flaticon.com -## What's New (v1.3.4) -- Fix AnimationRatingBar out of sync bug. +## What's New (v1.3.5) +- Rename the attributes for more easily know all this library's attributes. +    (`app:rating="2"` change to `app:srb_rating="2"`) - Implement IsIndicator, Scrollable and Clickable settings. +- Fix Handler null pointer bug. +- Fix AnimationRatingBar out of sync bug. ## Feature - Allow half star through click event. (contributed by [ANPez](https://github.com/ANPez)) @@ -48,7 +51,7 @@ allprojects { } dependencies { - compile 'com.github.ome450901:SimpleRatingBar:1.3.4' + compile 'com.github.ome450901:SimpleRatingBar:1.3.5' } ``` @@ -56,22 +59,22 @@ dependencies { ### In Xml ```xml + app:srb_numStars="3" + app:srb_rating="2" + app:srb_starWidth="30dp" + app:srb_starHeight="30dp" + app:srb_starPadding="15dp" + app:srb_stepSize="0.5" + app:srb_isIndicator="false" + app:srb_clickable="true" + app:srb_scrollable="true" + app:srb_clearRatingEnabled="true" + app:srb_drawableEmpty="@drawable/start_empty" + app:srb_drawableFilled="@drawable/star_filled"> ```