星星评分控件

喜欢ヅ旅行 2023-10-03 18:16 77阅读 0赞
  1. import android.content.Context;
  2. import android.util.Log;
  3. import com.baidu.mapapi.CoordType;
  4. import com.baidu.mapapi.SDKInitializer;
  5. import com.blankj.utilcode.util.CrashUtils;
  6. import com.blankj.utilcode.util.LogUtils;
  7. import com.isseiaoki.simplecropview.FreeCropImageView;
  8. import com.lzy.imagepicker.ImagePicker;
  9. import com.lzy.imagepicker.view.CropImageView;
  10. import com.lzy.okgo.OkGo;
  11. import com.lzy.okgo.interceptor.HttpLoggingInterceptor;
  12. import com.lzy.okgo.model.HttpHeaders;
  13. import com.lzy.okgo.model.HttpParams;
  14. import com.qumaiyou.pad.utils.Constants;
  15. import com.qumaiyou.pad.widget.PickImageLoader;
  16. import com.scwang.smartrefresh.layout.SmartRefreshLayout;
  17. import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
  18. import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
  19. import com.scwang.smartrefresh.layout.api.RefreshFooter;
  20. import com.scwang.smartrefresh.layout.api.RefreshHeader;
  21. import com.scwang.smartrefresh.layout.api.RefreshLayout;
  22. import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
  23. import com.scwang.smartrefresh.layout.header.ClassicsHeader;
  24. import com.tencent.smtt.sdk.QbSdk;
  25. import java.util.concurrent.TimeUnit;
  26. import java.util.logging.Level;
  27. import androidx.multidex.MultiDexApplication;
  28. import okhttp3.OkHttpClient;
  29. import android.content.Context;
  30. import android.content.res.TypedArray;
  31. import android.graphics.drawable.Drawable;
  32. import android.util.AttributeSet;
  33. import android.view.View;
  34. import android.widget.ImageView;
  35. import android.widget.LinearLayout;
  36. import com.sitanyun.merchant.guide.R;
  37. import java.math.BigDecimal;
  38. /**
  39. * <declare-styleable name="RatingBar">
  40. * <!--尺寸值-->
  41. * <attr name="starImageSize" format="dimension" />
  42. * <!--星星间距-->
  43. * <attr name="starPadding" format="dimension" />
  44. * <!--星星总数-->
  45. * <attr name="starCount" format="integer" />
  46. * <!--空白的星星资源文件值-->
  47. * <attr name="starEmpty" format="reference" />
  48. * <!--满星资源文件值-->
  49. * <attr name="starFill" format="reference" />
  50. * <!--半星资源文件值-->
  51. * <attr name="starHalf" format="reference" />
  52. * <!--是否可点击boolean值-->
  53. * <attr name="clickable" format="boolean" />
  54. * <!--当前进度float值-->
  55. * <attr name="starStep" format="float" />
  56. * <!--每次进度方式的值,整星还是半星-->
  57. * <attr name="stepSize">
  58. * <enum name="Half" value="0" />
  59. * <enum name="Full" value="1" />
  60. * </attr>
  61. * </declare-styleable>
  62. *
  63. * <com.xxx.xxxx.xxx.weiht.RatingBar
  64. * android:layout_marginBottom="@dimen/dp_17"
  65. * android:id="@+id/rb"
  66. * android:layout_marginTop="@dimen/dp_8"
  67. * android:layout_width="wrap_content"
  68. * android:layout_height="match_parent"
  69. * app:starCount="3"
  70. * app:starEmpty="@mipmap/xwei"
  71. * app:starFill="@mipmap/xxuan"
  72. * app:starImageSize="10dp"
  73. * app:starPadding="5dp"
  74. * app:starStep="0"
  75. * app:stepSize="Full">
  76. * </com.sitanyun.merchant.guide.weiht.RatingBar>
  77. *
  78. */
  79. public class RatingBar extends LinearLayout {
  80. /**
  81. * 是否可点击
  82. */
  83. private boolean mClickable;
  84. /**
  85. * 星星总数
  86. */
  87. private int starCount;
  88. /**
  89. * 星星的点击事件
  90. */
  91. private OnRatingChangeListener onRatingChangeListener;
  92. /**
  93. * 每个星星的大小
  94. */
  95. private float starImageSize;
  96. /**
  97. * 每个星星的间距
  98. */
  99. private float starPadding;
  100. /**
  101. * 星星的显示数量,支持小数点
  102. */
  103. private float starStep;
  104. /**
  105. * 空白的默认星星图片
  106. */
  107. private Drawable starEmptyDrawable;
  108. /**
  109. * 选中后的星星填充图片
  110. */
  111. private Drawable starFillDrawable;
  112. /**
  113. * 半颗星的图片
  114. */
  115. private Drawable starHalfDrawable;
  116. /**
  117. * 每次点击星星所增加的量是整个还是半个
  118. */
  119. private StepSize stepSize;
  120. /**
  121. * 设置半星的图片资源文件
  122. *
  123. * @param starHalfDrawable
  124. */
  125. public void setStarHalfDrawable(Drawable starHalfDrawable) {
  126. this.starHalfDrawable = starHalfDrawable;
  127. }
  128. /**
  129. * 设置满星的图片资源文件
  130. *
  131. * @param starFillDrawable
  132. */
  133. public void setStarFillDrawable(Drawable starFillDrawable) {
  134. this.starFillDrawable = starFillDrawable;
  135. }
  136. /**
  137. * 设置空白和默认的图片资源文件
  138. *
  139. * @param starEmptyDrawable
  140. */
  141. public void setStarEmptyDrawable(Drawable starEmptyDrawable) {
  142. this.starEmptyDrawable = starEmptyDrawable;
  143. }
  144. /**
  145. * 设置星星是否可以点击操作
  146. *
  147. * @param clickable
  148. */
  149. public void setClickable(boolean clickable) {
  150. this.mClickable = clickable;
  151. }
  152. /**
  153. * 设置星星点击事件
  154. *
  155. * @param onRatingChangeListener
  156. */
  157. public void setOnRatingChangeListener(OnRatingChangeListener onRatingChangeListener) {
  158. this.onRatingChangeListener = onRatingChangeListener;
  159. }
  160. /**
  161. * 设置星星的大小
  162. *
  163. * @param starImageSize
  164. */
  165. public void setStarImageSize(float starImageSize) {
  166. this.starImageSize = starImageSize;
  167. }
  168. public void setStepSize(StepSize stepSize) {
  169. this.stepSize = stepSize;
  170. }
  171. /**
  172. * 构造函数
  173. * 获取xml中设置的资源文件
  174. *
  175. * @param context
  176. * @param attrs
  177. */
  178. public RatingBar(Context context, AttributeSet attrs) {
  179. super(context, attrs);
  180. setOrientation(LinearLayout.HORIZONTAL);
  181. TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBar);
  182. starImageSize = mTypedArray.getDimension(R.styleable.RatingBar_starImageSize, 20);
  183. starPadding = mTypedArray.getDimension(R.styleable.RatingBar_starPadding, 10);
  184. starStep = mTypedArray.getFloat(R.styleable.RatingBar_starStep, 1.0f);
  185. stepSize = StepSize.fromStep(mTypedArray.getInt(R.styleable.RatingBar_stepSize, 1));
  186. starCount = mTypedArray.getInteger(R.styleable.RatingBar_starCount, 5);
  187. starEmptyDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starEmpty);
  188. starFillDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starFill);
  189. starHalfDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starHalf);
  190. mClickable = mTypedArray.getBoolean(R.styleable.RatingBar_clickable, true);
  191. mTypedArray.recycle();
  192. for (int i = 0; i < starCount; ++i) {
  193. final ImageView imageView = getStarImageView();
  194. imageView.setImageDrawable(starEmptyDrawable);
  195. imageView.setOnClickListener(
  196. new OnClickListener() {
  197. @Override
  198. public void onClick(View v) {
  199. if (mClickable) {
  200. //浮点数的整数部分
  201. int fint = (int) starStep;
  202. BigDecimal b1 = new BigDecimal(Float.toString(starStep));
  203. BigDecimal b2 = new BigDecimal(Integer.toString(fint));
  204. //浮点数的小数部分
  205. float fPoint = b1.subtract(b2).floatValue();
  206. if (fPoint == 0) {
  207. fint -= 1;
  208. }
  209. if (indexOfChild(v) > fint) {
  210. setStar(indexOfChild(v) + 1);
  211. } else if (indexOfChild(v) == fint) {
  212. if (stepSize == StepSize.Full) {//如果是满星 就不考虑半颗星了
  213. return;
  214. }
  215. //点击之后默认每次先增加一颗星,再次点击变为半颗星
  216. if (imageView.getDrawable().getCurrent().getConstantState().equals(starHalfDrawable.getConstantState())) {
  217. setStar(indexOfChild(v) + 1);
  218. } else {
  219. setStar(indexOfChild(v) + 0.5f);
  220. }
  221. } else {
  222. setStar(indexOfChild(v) + 1f);
  223. }
  224. }
  225. }
  226. }
  227. );
  228. addView(imageView);
  229. }
  230. setStar(starStep);
  231. }
  232. /**
  233. * 获取星星数量
  234. *
  235. * @return 星星数量
  236. */
  237. public int getStarCount() {
  238. return getChildCount();
  239. }
  240. /**
  241. * 设置每颗星星的参数
  242. *
  243. * @return
  244. */
  245. private ImageView getStarImageView() {
  246. ImageView imageView = new ImageView(getContext());
  247. LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(
  248. Math.round(starImageSize), Math.round(starImageSize));//设置每颗星星在线性布局的大小
  249. layout.setMargins(0, 0, Math.round(starPadding), 0);//设置每颗星星在线性布局的间距
  250. imageView.setLayoutParams(layout);
  251. imageView.setAdjustViewBounds(true);
  252. imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
  253. imageView.setImageDrawable(starEmptyDrawable);
  254. imageView.setMinimumWidth(10);
  255. imageView.setMaxHeight(10);
  256. return imageView;
  257. }
  258. /**
  259. * 设置星星的个数
  260. *
  261. * @param rating
  262. */
  263. public void setStar(float rating) {
  264. if (onRatingChangeListener != null) {
  265. onRatingChangeListener.onRatingChange(rating);
  266. }
  267. this.starStep = rating;
  268. //浮点数的整数部分
  269. int fint = (int) rating;
  270. BigDecimal b1 = new BigDecimal(Float.toString(rating));
  271. BigDecimal b2 = new BigDecimal(Integer.toString(fint));
  272. //浮点数的小数部分
  273. float fPoint = b1.subtract(b2).floatValue();
  274. //设置选中的星星
  275. for (int i = 0; i < fint; ++i) {
  276. ((ImageView) getChildAt(i)).setImageDrawable(starFillDrawable);
  277. }
  278. //设置没有选中的星星
  279. for (int i = fint; i < starCount; i++) {
  280. ((ImageView) getChildAt(i)).setImageDrawable(starEmptyDrawable);
  281. }
  282. //小数点默认增加半颗星
  283. if (fPoint > 0) {
  284. ((ImageView) getChildAt(fint)).setImageDrawable(starHalfDrawable);
  285. }
  286. }
  287. /**
  288. * 操作星星的点击事件
  289. */
  290. public interface OnRatingChangeListener {
  291. /**
  292. * 选中的星星的个数
  293. *
  294. * @param
  295. */
  296. void onRatingChange(float ratingCount);
  297. }
  298. /**
  299. * 星星每次增加的方式整星还是半星,枚举类型
  300. * 类似于View.GONE
  301. */
  302. public enum StepSize {
  303. Half(0), Full(1);
  304. int step;
  305. StepSize(int step) {
  306. this.step = step;
  307. }
  308. public static StepSize fromStep(int step) {
  309. for (StepSize f : values()) {
  310. if (f.step == step) {
  311. return f;
  312. }
  313. }
  314. throw new IllegalArgumentException();
  315. }
  316. }
  317. }

发表评论

表情:
评论列表 (有 0 条评论,77人围观)

还没有评论,来说两句吧...

相关阅读

    相关 微信小程序实现星星评分效果

    思路很简单,小星星都是一张张独立的图片,点击的时候改变图片的路径就可以了。 我是用背景图片做的,先给盒子设置背景图片为灰色的小星星,盒子是根据js文件中的stars数组循环