package co.touchlab.droidconandroid.ui;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import co.touchlab.droidconandroid.R;
/**
* Created by toidiu on 11/18/15.
*/
public class CustomRatingBar extends View
{
private final static int MAX_RATING = 5;
private float w24;
private float w16;
private float w40;
private Paint fillPaint;
private Paint emptyPaint;
//~=~=~=~=~=~=~=~=~=~=~=~=Fields
private int rating = 0;
private RatingChangeListener mChangeListener = null;
public CustomRatingBar(Context context)
{
super(context);
}
public CustomRatingBar(Context context, AttributeSet attrs)
{
super(context, attrs);
Resources res = getResources();
fillPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
fillPaint.setStyle(Paint.Style.FILL);
fillPaint.setColor(res.getColor(R.color.vote_rating_blue));
emptyPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
emptyPaint.setStyle(Paint.Style.FILL);
emptyPaint.setColor(res.getColor(R.color.vote_title_gray));
w24 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, res.getDisplayMetrics());
w16 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, res.getDisplayMetrics());
w40 = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 40, res.getDisplayMetrics());
}
public CustomRatingBar(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
//get width and divide by 5
int height = canvas.getHeight();
for(int x = 0; x < 5; x++)
{
Paint paint = (rating <= x)
? emptyPaint
: fillPaint;
canvas.drawCircle(x * w40 + w24 / 2, height / 2, w24 / 2, paint);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int h = (int) Math.ceil(w24);
int w = (int) Math.ceil((w40 * 5) - w16);
setMeasuredDimension(w, h);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
int division = getWidth() / MAX_RATING;
float x = event.getX();
float v = x / division;
setRating(v);
if(mChangeListener != null)
{
mChangeListener.onChange(rating);
}
return true;
}
public void setRating(float v)
{
int ceil = (int) Math.ceil(v);
setRating(ceil);
}
public int getRating()
{
return rating;
}
public void setRating(int rate)
{
if(rate < 0)
{
rating = 0;
}
else if(rate > MAX_RATING)
{
rating = MAX_RATING;
}
else
{
rating = rate;
}
invalidate();
}
public void setChangeListener(RatingChangeListener changeListener)
{
mChangeListener = changeListener;
}
//~=~=~=~=~=~=~=~=~=~=~=~=Interface
public interface RatingChangeListener
{
void onChange(int rate);
}
}