| /* |
| * 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)))); |
| } |
| } |