Kore/app/src/main/java/org/xbmc/kore/ui/views/RatingBar.java

145 lines
5.2 KiB
Java

/*
* Copyright 2019 Martijn Brekhof. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.xbmc.kore.ui.views;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.drawable.ClipDrawable;
import androidx.annotation.DrawableRes;
import androidx.appcompat.widget.AppCompatImageView;
import androidx.appcompat.widget.LinearLayoutCompat;
import androidx.core.content.ContextCompat;
import androidx.core.widget.ImageViewCompat;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.widget.FrameLayout;
import org.xbmc.kore.R;
import java.util.ArrayList;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
public class RatingBar extends LinearLayoutCompat {
private @DrawableRes int iconResourceId;
private int iconCount;
private double maxRating = 5;
private ArrayList<ClipDrawable> clipDrawables = new ArrayList<>(iconCount);
private int backgroundColor;
private int foregroundColor;
private int maxTotalClipLevel;
private final int maxClipLevel = 10000;
private double ratingScaleFactor;
public RatingBar(Context context) {
this(context, null);
}
public RatingBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RatingBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initializeView(context, attrs, defStyle);
}
private void initializeView(Context context, AttributeSet attrs, int defStyle) {
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.RatingBar,
0, 0);
try {
backgroundColor = a.getColor(R.styleable.RatingBar_backgroundColor, 0x43000000);
foregroundColor = a.getColor(R.styleable.RatingBar_foregroundColor, 0xffffffff);
iconCount = a.getInteger(R.styleable.RatingBar_iconCount, 5);
iconResourceId = a.getResourceId(R.styleable.RatingBar_icon, -1);
} finally {
a.recycle();
}
maxTotalClipLevel = iconCount * maxClipLevel;
ratingScaleFactor = maxTotalClipLevel / maxRating;
for(int i = 0; i < iconCount; i++) {
View star = createStar(context, attrs, defStyle);
addView(star);
}
}
public void setRating(double rating) {
if (rating > this.maxRating)
rating = this.maxRating;
int scaledRating = (int) (rating * ratingScaleFactor);
int fullyFilledIconsCount = scaledRating / maxClipLevel;
for(int i = 0; i < fullyFilledIconsCount; i++) {
clipDrawables.get(i).setLevel(maxClipLevel);
}
if (fullyFilledIconsCount < clipDrawables.size()) {
clipDrawables.get(fullyFilledIconsCount).setLevel(scaledRating - (fullyFilledIconsCount * maxClipLevel));
for (int i = fullyFilledIconsCount + 1 ; i < clipDrawables.size(); i++) {
clipDrawables.get(i).setLevel(0);
}
}
invalidate();
}
public void setMaxRating(double maxRating) {
this.maxRating = maxRating;
ratingScaleFactor = maxTotalClipLevel / maxRating;
}
private FrameLayout createStar(Context context, AttributeSet attrs, int defStyle) {
FrameLayout frameLayout = new FrameLayout(getContext());
frameLayout.setLayoutParams(new LayoutParams(WRAP_CONTENT, MATCH_PARENT));
AppCompatImageView ivStarBackground = new AppCompatImageView(context, attrs, defStyle);
ivStarBackground.setLayoutParams(new LayoutParams(WRAP_CONTENT, MATCH_PARENT));
ivStarBackground.setImageResource(iconResourceId);
ivStarBackground.setAdjustViewBounds(true);
ImageViewCompat.setImageTintList(ivStarBackground, ColorStateList.valueOf(backgroundColor));
frameLayout.addView(ivStarBackground);
ClipDrawable clipDrawable = new ClipDrawable(
ContextCompat.getDrawable(context, iconResourceId),
Gravity.START,
ClipDrawable.HORIZONTAL);
AppCompatImageView ivStarForeground = new AppCompatImageView(context, attrs, defStyle);
ivStarForeground.setLayoutParams(new LayoutParams(WRAP_CONTENT, MATCH_PARENT));
ivStarForeground.setImageDrawable(clipDrawable);
ivStarForeground.setAdjustViewBounds(true);
ImageViewCompat.setImageTintList(ivStarForeground, ColorStateList.valueOf(foregroundColor));
frameLayout.addView(ivStarForeground);
clipDrawables.add((ClipDrawable) ivStarForeground.getDrawable());
return frameLayout;
}
}