Android Open Source - holoaccent Accent Rating Bar






From Project

Back to project page holoaccent.

License

The source code is released under:

Apache License

If you think the Android project holoaccent listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*******************************************************************************
 * Copyright 2013 NEGU Soft//from  w ww.java 2  s  .c  o  m
 *
 * 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 com.negusoft.holoaccent.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.widget.RatingBar;

import com.negusoft.holoaccent.AccentHelper;
import com.negusoft.holoaccent.AccentPalette;
import com.negusoft.holoaccent.R;

/** Extends RatingBar to apply the correct accent color. */
public class AccentRatingBar extends RatingBar {

    private static final int GLOW_PRESSED_ALPHA = 0xAA;
    private static final int GLOW_FOCUSED_ALPHA = 0x55;

    private static final float BORDER_RATION = 50f;
    private static final float PRESSED_GLOW_RATION = 5f;
    private static final float FOCUSED_GLOW_RATION = 5f;
    private static final float STAR_INNER_RATION = 6f;
    private static final float STAR_OUTER_RATION = 2.5f;

    private AccentPalette mPalette;

    private Paint mFillPaint;
    private int mBorderColor;
    private int mBorderFilledColor;
    private int mEmptyColor;

    public AccentRatingBar(Context context) {
        super(context);
        init(context, null, R.attr.accentRatingBarStyle);
    }

    public AccentRatingBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, R.attr.accentRatingBarStyle);
    }

    public AccentRatingBar(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        mPalette = AccentHelper.getPalette(context);

        TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.AccentRatingBar, defStyle, 0);
        mEmptyColor = a.getColor(R.styleable.AccentRatingBar_android_colorBackground, Color.GRAY);
        mBorderColor = a.getColor(R.styleable.AccentRatingBar_android_colorForeground, Color.BLACK);
        mBorderFilledColor = a.getColor(R.styleable.AccentRatingBar_android_colorForegroundInverse, Color.GRAY);
        a.recycle();

        mFillPaint = initFillPaint();
    }

    private Paint initGlowPaint(float strokeWidth, int alpha) {
        Paint result = new Paint();
        result.setColor(mPalette.getAccentColor());
        result.setStyle(Paint.Style.STROKE);
        result.setStrokeWidth(strokeWidth);
        result.setStrokeJoin(Paint.Join.ROUND);
        result.setColor(mPalette.getAccentColor(alpha));
        result.setAntiAlias(true);
        return result;
    }

    private Paint initFillPaint() {
        Paint result = new Paint();
        result.setStyle(Paint.Style.FILL);
        result.setAntiAlias(false);
        return result;
    }

    private Paint initBorderPaint(float starWidth) {
        Paint result = new Paint();
        result.setStyle(Paint.Style.STROKE);
        result.setStrokeWidth(starWidth / BORDER_RATION);
        result.setStrokeJoin(Paint.Join.ROUND);
        result.setAntiAlias(true);
        return result;
    }

    protected synchronized void onDraw(Canvas canvas) {
        if (mPalette == null) {
            super.onDraw(canvas);
            return;
        }

        float width = getWidth();
        float starWidth = width / getNumStars();
        float centerX = starWidth / 2f;
        float centerY = (getHeight() - getPaddingTop() - getPaddingBottom()) / 2f;
        centerY += getPaddingTop();
        Path starPath = getStarPath(centerX, centerY, starWidth / STAR_INNER_RATION, starWidth / STAR_OUTER_RATION);

        float progress = (float)getProgress() / getMax();
        int nonEmptyStars = Math.round(getNumStars() * progress);

        int[] drawableState = getDrawableState();
        boolean pressed = hasValue(drawableState, android.R.attr.state_pressed);
        boolean focused = hasValue(drawableState, android.R.attr.state_focused);

        drawGlow(canvas, starPath, starWidth, focused, pressed);
        drawBackground(canvas, starPath, starWidth, progress);
        drawBorder(canvas, starPath, starWidth, nonEmptyStars);
    }

    private void drawGlow(Canvas canvas, Path starPath, float starWidth, boolean focused, boolean pressed) {
        if (!focused && !pressed)
            return;

        float strokeWidthRatio = pressed ?  PRESSED_GLOW_RATION : FOCUSED_GLOW_RATION;
        int alpha = pressed ?  GLOW_PRESSED_ALPHA : GLOW_FOCUSED_ALPHA;

        Path path = new Path(starPath);
        Paint glowPaint = initGlowPaint(starWidth / strokeWidthRatio, alpha);

        canvas.save();
        for (int i=0; i<getNumStars(); i++) {
            canvas.drawPath(starPath, glowPaint);
            canvas.translate(starWidth, 0f);
        }
        canvas.restore();
    }

    private void drawBackground(Canvas canvas, Path starPath, float starWidth, float progress) {
        Path path = new Path(starPath);
        mFillPaint.setColor(mEmptyColor);

        canvas.save();
        for (int i=0; i<getNumStars(); i++) {
            canvas.drawPath(starPath, mFillPaint);
            canvas.translate(starWidth, 0f);
        }
        canvas.restore();

        mFillPaint.setColor(mPalette.getAccentColor());
        canvas.save();
        canvas.clipRect(0f, 0f, getWidth() * progress, getHeight());
        for (int i=0; i<getNumStars(); i++) {
            canvas.drawPath(starPath, mFillPaint);
            canvas.translate(starWidth, 0f);
        }
        canvas.restore();
    }

    private void drawBorder(Canvas canvas, Path starPath, float starWidth, int nonEmptyStars) {
        Path path = new Path(starPath);
        Paint borderPaint = initBorderPaint(starWidth);
        borderPaint.setColor(mBorderFilledColor);

        canvas.save();
        for (int i=0; i<nonEmptyStars; i++) {
            canvas.drawPath(starPath, borderPaint);
            canvas.translate(starWidth, 0f);
        }

        borderPaint.setColor(mBorderColor);
        for (int i=nonEmptyStars; i<getNumStars(); i++) {
            canvas.drawPath(starPath, borderPaint);
            canvas.translate(starWidth, 0f);
        }
        canvas.restore();
    }

    private boolean hasValue(int[] allValues, int value) {
        for (int i : allValues) {
            if (i == value)
                return true;
        }
        return false;
    }


    private Path getStarPath(float centerX, float centerY, float innerRadius, float outerRadius) {

        double angle = 2.0*Math.PI/10.0;
        float innerTopX = innerRadius*(float)Math.sin(angle);
        float innerTopY = innerRadius*(float)Math.cos(angle);
        float outerTopX = outerRadius*(float)Math.sin(2f*angle);
        float outerTopY = outerRadius*(float)Math.cos(2f*angle);
        float innerBottomX = innerRadius*(float)Math.sin(3f*angle);
        float innerBottomY = innerRadius*(float)Math.cos(3f*angle);
        float outerBottomX = outerRadius*(float)Math.sin(4f*angle);
        float outerBottomY = outerRadius*(float)Math.cos(4f*angle);

        Path result = new Path();
        result.moveTo(centerX, centerY - outerRadius);

        result.lineTo(centerX + innerTopX, centerY - innerTopY);
        result.lineTo(centerX + outerTopX, centerY - outerTopY);
        result.lineTo(centerX + innerBottomX, centerY - innerBottomY);
        result.lineTo(centerX + outerBottomX, centerY - outerBottomY);

        result.lineTo(centerX, centerY + innerRadius);

        result.lineTo(centerX - outerBottomX, centerY - outerBottomY);
        result.lineTo(centerX - innerBottomX, centerY - innerBottomY);
        result.lineTo(centerX - outerTopX, centerY - outerTopY);
        result.lineTo(centerX - innerTopX, centerY - innerTopY);

        result.close();
        return result;
    }
}




Java Source Code List

com.negusoft.holoaccent.AccentHelper.java
com.negusoft.holoaccent.AccentPalette.java
com.negusoft.holoaccent.AccentResources.java
com.negusoft.holoaccent.activity.AccentActivity.java
com.negusoft.holoaccent.dialog.AccentAlertDialog.java
com.negusoft.holoaccent.dialog.AccentDatePickerDialog.java
com.negusoft.holoaccent.dialog.AccentDialogFragment.java
com.negusoft.holoaccent.dialog.AccentTimePickerDialog.java
com.negusoft.holoaccent.dialog.DividerPainter.java
com.negusoft.holoaccent.dialog.NumberPickerPainter.java
com.negusoft.holoaccent.drawable.ActionBarBackgroundDrawable.java
com.negusoft.holoaccent.drawable.CircleDrawable.java
com.negusoft.holoaccent.drawable.ContactBadgeDrawable.java
com.negusoft.holoaccent.drawable.FastScrollDrawable.java
com.negusoft.holoaccent.drawable.IndeterminedProgressDrawable.java
com.negusoft.holoaccent.drawable.IndeterminedProgressLegacyDrawable.java
com.negusoft.holoaccent.drawable.RectDrawable.java
com.negusoft.holoaccent.drawable.RoundRectDrawable.java
com.negusoft.holoaccent.drawable.ScrubberControlSelectorDrawable.java
com.negusoft.holoaccent.drawable.ScrubberProgressDrawable.java
com.negusoft.holoaccent.drawable.SearchViewDrawable.java
com.negusoft.holoaccent.drawable.SpinnerDrawable.java
com.negusoft.holoaccent.drawable.ToggleForegroundDrawable.java
com.negusoft.holoaccent.drawable.UnderlineDrawable.java
com.negusoft.holoaccent.example.activity.AccentFragmentActivity.java
com.negusoft.holoaccent.example.activity.DialogActivity.java
com.negusoft.holoaccent.example.activity.MainActivity.java
com.negusoft.holoaccent.example.activity.PreferencesActivity.java
com.negusoft.holoaccent.example.activity.SpinnerActivity.java
com.negusoft.holoaccent.example.activity.TabbedActivity.java
com.negusoft.holoaccent.example.activity.TabbedStripActivity.java
com.negusoft.holoaccent.example.activity.themed.DialogActivityLight.java
com.negusoft.holoaccent.example.activity.themed.PreferencesActivityColoredABInverse.java
com.negusoft.holoaccent.example.activity.themed.PreferencesActivityColoredAB.java
com.negusoft.holoaccent.example.activity.themed.PreferencesActivityLightColoredABInverse.java
com.negusoft.holoaccent.example.activity.themed.PreferencesActivityLightColoredAB.java
com.negusoft.holoaccent.example.activity.themed.PreferencesActivityLightDarkAB.java
com.negusoft.holoaccent.example.activity.themed.PreferencesActivityLight.java
com.negusoft.holoaccent.example.activity.themed.SpinnerActivityColoredABInverse.java
com.negusoft.holoaccent.example.activity.themed.SpinnerActivityColoredAB.java
com.negusoft.holoaccent.example.activity.themed.SpinnerActivityLightColoredABInverse.java
com.negusoft.holoaccent.example.activity.themed.SpinnerActivityLightColoredAB.java
com.negusoft.holoaccent.example.activity.themed.SpinnerActivityLightDarkAB.java
com.negusoft.holoaccent.example.activity.themed.SpinnerActivityLight.java
com.negusoft.holoaccent.example.activity.themed.TabbedActivityColoredABInverse.java
com.negusoft.holoaccent.example.activity.themed.TabbedActivityColoredAB.java
com.negusoft.holoaccent.example.activity.themed.TabbedActivityLightColoredABInverse.java
com.negusoft.holoaccent.example.activity.themed.TabbedActivityLightColoredAB.java
com.negusoft.holoaccent.example.activity.themed.TabbedActivityLightDarkAB.java
com.negusoft.holoaccent.example.activity.themed.TabbedActivityLight.java
com.negusoft.holoaccent.example.activity.themed.TabbedStripActivityColoredABInverse.java
com.negusoft.holoaccent.example.activity.themed.TabbedStripActivityColoredAB.java
com.negusoft.holoaccent.example.activity.themed.TabbedStripActivityLightColoredABInverse.java
com.negusoft.holoaccent.example.activity.themed.TabbedStripActivityLightColoredAB.java
com.negusoft.holoaccent.example.activity.themed.TabbedStripActivityLightDarkAB.java
com.negusoft.holoaccent.example.activity.themed.TabbedStripActivityLight.java
com.negusoft.holoaccent.example.fragment.AccentSupportDialogFragment.java
com.negusoft.holoaccent.example.fragment.ButtonFragment.java
com.negusoft.holoaccent.example.fragment.ChoicesFragment.java
com.negusoft.holoaccent.example.fragment.ListFragment.java
com.negusoft.holoaccent.example.fragment.PickersFragment.java
com.negusoft.holoaccent.example.fragment.ProgressFragment.java
com.negusoft.holoaccent.example.fragment.SimpleDialogFragment.java
com.negusoft.holoaccent.example.fragment.TextviewFragment.java
com.negusoft.holoaccent.example.model.ColorOverrideConfig.java
com.negusoft.holoaccent.example.preference.CustomDialogPreference.java
com.negusoft.holoaccent.example.view.CheckableTextView.java
com.negusoft.holoaccent.interceptor.AccentColorInterceptor.java
com.negusoft.holoaccent.interceptor.ActionBarBackgroundInterceptor.java
com.negusoft.holoaccent.interceptor.CircleInterceptor.java
com.negusoft.holoaccent.interceptor.ContactBadgeInterceptor.java
com.negusoft.holoaccent.interceptor.FastScrollInterceptor.java
com.negusoft.holoaccent.interceptor.IndeterminateInterceptor.java
com.negusoft.holoaccent.interceptor.NativeInterceptor.java
com.negusoft.holoaccent.interceptor.PagerTabStripInterceptor.java
com.negusoft.holoaccent.interceptor.RectInterceptor.java
com.negusoft.holoaccent.interceptor.RoundRectInterceptor.java
com.negusoft.holoaccent.interceptor.ScrubberInterceptor.java
com.negusoft.holoaccent.interceptor.SearchViewTextFieldInterceptor.java
com.negusoft.holoaccent.interceptor.SolidColorInterceptor.java
com.negusoft.holoaccent.interceptor.SpinnerInterceptor.java
com.negusoft.holoaccent.interceptor.ToggleInterceptor.java
com.negusoft.holoaccent.interceptor.UnderlineInterceptor.java
com.negusoft.holoaccent.preference.DialogPreference.java
com.negusoft.holoaccent.preference.EditTextPreference.java
com.negusoft.holoaccent.preference.ListPreference.java
com.negusoft.holoaccent.preference.MultiSelectListPreference.java
com.negusoft.holoaccent.preference.SwitchPreference.java
com.negusoft.holoaccent.util.BitmapUtils.java
com.negusoft.holoaccent.util.NativeResources.java
com.negusoft.holoaccent.widget.AccentDatePicker.java
com.negusoft.holoaccent.widget.AccentNumberPicker.java
com.negusoft.holoaccent.widget.AccentQuickContactBadge.java
com.negusoft.holoaccent.widget.AccentRatingBar.java
com.negusoft.holoaccent.widget.AccentSearchView.java
com.negusoft.holoaccent.widget.AccentSwitch.java
com.negusoft.holoaccent.widget.AccentTimePicker.java