/*
* 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 com.example.android.wearable.flashlight;
import android.animation.ArgbEvaluator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
/**
* Flashing party lights!
*/
public class PartyLightView extends View {
private int[] mColors = new int[] {
Color.RED,
Color.GREEN,
Color.BLUE,
Color.CYAN,
Color.MAGENTA
};
private int mFromColorIndex;
private int mToColorIndex;
/**
* Value b/t 0 and 1.
*/
private float mProgress;
private ArgbEvaluator mEvaluator;
private int mCurrentColor;
private Handler mHandler;
public PartyLightView(Context context) {
super(context);
init();
}
public PartyLightView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(mCurrentColor);
super.onDraw(canvas);
}
public void startCycling() {
mHandler.sendEmptyMessage(0);
}
public void stopCycling() {
mHandler.removeMessages(0);
}
private void init() {
mEvaluator = new ArgbEvaluator();
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
mCurrentColor = getColor(mProgress, mColors[mFromColorIndex],
mColors[mToColorIndex]);
postInvalidate();
mProgress += 0.1;
if (mProgress > 1.0) {
mFromColorIndex = mToColorIndex;
// Find a new color.
mToColorIndex++;
if (mToColorIndex >= mColors.length) {
mToColorIndex = 0;
}
}
mHandler.sendEmptyMessageDelayed(0, 100);
}
};
}
private int getColor(float fraction, int colorStart, int colorEnd) {
int startInt = colorStart;
int startA = (startInt >> 24) & 0xff;
int startR = (startInt >> 16) & 0xff;
int startG = (startInt >> 8) & 0xff;
int startB = startInt & 0xff;
int endInt = colorEnd;
int endA = (endInt >> 24) & 0xff;
int endR = (endInt >> 16) & 0xff;
int endG = (endInt >> 8) & 0xff;
int endB = endInt & 0xff;
return (startA + (int)(fraction * (endA - startA))) << 24 |
(startR + (int)(fraction * (endR - startR))) << 16 |
(startG + (int)(fraction * (endG - startG))) << 8 |
((startB + (int)(fraction * (endB - startB))));
}
}