blob: a7b207374ff026506e39b796065d75ba1843583c [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* 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 androidx.leanback.graphics;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.view.View;
import androidx.leanback.R;
/**
* Helper class for applying a dim level to a View. The ColorFilterDimmer
* uses a ColorFilter in a Paint object to dim the view according to the
* currently active level.
*/
public final class ColorFilterDimmer {
private final ColorFilterCache mColorDimmer;
private final float mActiveLevel;
private final float mDimmedLevel;
private final Paint mPaint;
private ColorFilter mFilter;
/**
* Creates a default ColorFilterDimmer. Uses the default color and level for
* the dimmer.
*
* @param context A Context used to retrieve Resources.
* @return A ColorFilterDimmer with the default dim color and levels.
*/
public static ColorFilterDimmer createDefault(Context context) {
TypedArray a = context.obtainStyledAttributes(R.styleable.LeanbackTheme);
int dimColor = a.getColor(R.styleable.LeanbackTheme_overlayDimMaskColor,
context.getResources().getColor(R.color.lb_view_dim_mask_color));
float activeLevel = a.getFraction(R.styleable.LeanbackTheme_overlayDimActiveLevel, 1, 1,
context.getResources().getFraction(R.fraction.lb_view_active_level, 1, 0));
float dimmedLevel = a.getFraction(R.styleable.LeanbackTheme_overlayDimDimmedLevel, 1, 1,
context.getResources().getFraction(R.fraction.lb_view_dimmed_level, 1, 1));
a.recycle();
return new ColorFilterDimmer(ColorFilterCache.getColorFilterCache(
dimColor), activeLevel, dimmedLevel);
}
/**
* Creates a ColorFilterDimmer for the given color and levels..
*
* @param dimmer The ColorFilterCache for dim color.
* @param activeLevel The level of dimming when the View is in its active
* state. Must be a float value between 0.0 and 1.0.
* @param dimmedLevel The level of dimming when the View is in its dimmed
* state. Must be a float value between 0.0 and 1.0.
*/
public static ColorFilterDimmer create(ColorFilterCache dimmer,
float activeLevel, float dimmedLevel) {
return new ColorFilterDimmer(dimmer, activeLevel, dimmedLevel);
}
private ColorFilterDimmer(ColorFilterCache dimmer, float activeLevel, float dimmedLevel) {
mColorDimmer = dimmer;
if (activeLevel > 1.0f) activeLevel = 1.0f;
if (activeLevel < 0.0f) activeLevel = 0.0f;
if (dimmedLevel > 1.0f) dimmedLevel = 1.0f;
if (dimmedLevel < 0.0f) dimmedLevel = 0.0f;
mActiveLevel = activeLevel;
mDimmedLevel = dimmedLevel;
mPaint = new Paint();
}
/**
* Apply current the ColorFilter to a View. This method will set the
* hardware layer of the view when applying a filter, and remove it when not
* applying a filter.
*
* @param view The View to apply the ColorFilter to.
*/
public void applyFilterToView(View view) {
if (mFilter != null) {
view.setLayerType(View.LAYER_TYPE_HARDWARE, mPaint);
} else {
view.setLayerType(View.LAYER_TYPE_NONE, null);
}
// FIXME: Current framework has bug that not triggering invalidate when change layer
// paint. Will add conditional sdk version check once bug is fixed in released
// framework.
view.invalidate();
}
/**
* Sets the active level of the dimmer. Updates the ColorFilter based on the
* level.
*
* @param level A float between 0 (fully dim) and 1 (fully active).
*/
public void setActiveLevel(float level) {
if (level < 0.0f) level = 0.0f;
if (level > 1.0f) level = 1.0f;
mFilter = mColorDimmer.getFilterForLevel(
mDimmedLevel + level * (mActiveLevel - mDimmedLevel));
mPaint.setColorFilter(mFilter);
}
/**
* Gets the ColorFilter set to the current dim level.
*
* @return The current ColorFilter.
*/
public ColorFilter getColorFilter() {
return mFilter;
}
/**
* Gets the Paint object set to the current dim level.
*
* @return The current Paint object.
*/
public Paint getPaint() {
return mPaint;
}
}