1*90c8c64dSAndroid Build Coastguard Worker /* 2*90c8c64dSAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project 3*90c8c64dSAndroid Build Coastguard Worker * 4*90c8c64dSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*90c8c64dSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*90c8c64dSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*90c8c64dSAndroid Build Coastguard Worker * 8*90c8c64dSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*90c8c64dSAndroid Build Coastguard Worker * 10*90c8c64dSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*90c8c64dSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*90c8c64dSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*90c8c64dSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*90c8c64dSAndroid Build Coastguard Worker * limitations under the License. 15*90c8c64dSAndroid Build Coastguard Worker */ 16*90c8c64dSAndroid Build Coastguard Worker 17*90c8c64dSAndroid Build Coastguard Worker package com.example.android.wearable.flashlight; 18*90c8c64dSAndroid Build Coastguard Worker 19*90c8c64dSAndroid Build Coastguard Worker import android.animation.ArgbEvaluator; 20*90c8c64dSAndroid Build Coastguard Worker import android.content.Context; 21*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Canvas; 22*90c8c64dSAndroid Build Coastguard Worker import android.graphics.Color; 23*90c8c64dSAndroid Build Coastguard Worker import android.os.Handler; 24*90c8c64dSAndroid Build Coastguard Worker import android.os.Message; 25*90c8c64dSAndroid Build Coastguard Worker import android.util.AttributeSet; 26*90c8c64dSAndroid Build Coastguard Worker import android.view.View; 27*90c8c64dSAndroid Build Coastguard Worker 28*90c8c64dSAndroid Build Coastguard Worker /** 29*90c8c64dSAndroid Build Coastguard Worker * Flashing party lights! 30*90c8c64dSAndroid Build Coastguard Worker */ 31*90c8c64dSAndroid Build Coastguard Worker public class PartyLightView extends View { 32*90c8c64dSAndroid Build Coastguard Worker 33*90c8c64dSAndroid Build Coastguard Worker private int[] mColors = new int[] { 34*90c8c64dSAndroid Build Coastguard Worker Color.RED, 35*90c8c64dSAndroid Build Coastguard Worker Color.GREEN, 36*90c8c64dSAndroid Build Coastguard Worker Color.BLUE, 37*90c8c64dSAndroid Build Coastguard Worker Color.CYAN, 38*90c8c64dSAndroid Build Coastguard Worker Color.MAGENTA 39*90c8c64dSAndroid Build Coastguard Worker }; 40*90c8c64dSAndroid Build Coastguard Worker 41*90c8c64dSAndroid Build Coastguard Worker private int mFromColorIndex; 42*90c8c64dSAndroid Build Coastguard Worker private int mToColorIndex; 43*90c8c64dSAndroid Build Coastguard Worker 44*90c8c64dSAndroid Build Coastguard Worker /** 45*90c8c64dSAndroid Build Coastguard Worker * Value b/t 0 and 1. 46*90c8c64dSAndroid Build Coastguard Worker */ 47*90c8c64dSAndroid Build Coastguard Worker private float mProgress; 48*90c8c64dSAndroid Build Coastguard Worker 49*90c8c64dSAndroid Build Coastguard Worker private ArgbEvaluator mEvaluator; 50*90c8c64dSAndroid Build Coastguard Worker 51*90c8c64dSAndroid Build Coastguard Worker private int mCurrentColor; 52*90c8c64dSAndroid Build Coastguard Worker 53*90c8c64dSAndroid Build Coastguard Worker private Handler mHandler; 54*90c8c64dSAndroid Build Coastguard Worker PartyLightView(Context context)55*90c8c64dSAndroid Build Coastguard Worker public PartyLightView(Context context) { 56*90c8c64dSAndroid Build Coastguard Worker super(context); 57*90c8c64dSAndroid Build Coastguard Worker init(); 58*90c8c64dSAndroid Build Coastguard Worker } 59*90c8c64dSAndroid Build Coastguard Worker PartyLightView(Context context, AttributeSet attrs)60*90c8c64dSAndroid Build Coastguard Worker public PartyLightView(Context context, AttributeSet attrs) { 61*90c8c64dSAndroid Build Coastguard Worker super(context, attrs); 62*90c8c64dSAndroid Build Coastguard Worker init(); 63*90c8c64dSAndroid Build Coastguard Worker } 64*90c8c64dSAndroid Build Coastguard Worker 65*90c8c64dSAndroid Build Coastguard Worker @Override onDraw(Canvas canvas)66*90c8c64dSAndroid Build Coastguard Worker protected void onDraw(Canvas canvas) { 67*90c8c64dSAndroid Build Coastguard Worker canvas.drawColor(mCurrentColor); 68*90c8c64dSAndroid Build Coastguard Worker super.onDraw(canvas); 69*90c8c64dSAndroid Build Coastguard Worker } 70*90c8c64dSAndroid Build Coastguard Worker startCycling()71*90c8c64dSAndroid Build Coastguard Worker public void startCycling() { 72*90c8c64dSAndroid Build Coastguard Worker mHandler.sendEmptyMessage(0); 73*90c8c64dSAndroid Build Coastguard Worker } 74*90c8c64dSAndroid Build Coastguard Worker stopCycling()75*90c8c64dSAndroid Build Coastguard Worker public void stopCycling() { 76*90c8c64dSAndroid Build Coastguard Worker mHandler.removeMessages(0); 77*90c8c64dSAndroid Build Coastguard Worker } 78*90c8c64dSAndroid Build Coastguard Worker init()79*90c8c64dSAndroid Build Coastguard Worker private void init() { 80*90c8c64dSAndroid Build Coastguard Worker mEvaluator = new ArgbEvaluator(); 81*90c8c64dSAndroid Build Coastguard Worker mHandler = new Handler() { 82*90c8c64dSAndroid Build Coastguard Worker 83*90c8c64dSAndroid Build Coastguard Worker @Override 84*90c8c64dSAndroid Build Coastguard Worker public void handleMessage(Message msg) { 85*90c8c64dSAndroid Build Coastguard Worker mCurrentColor = getColor(mProgress, mColors[mFromColorIndex], 86*90c8c64dSAndroid Build Coastguard Worker mColors[mToColorIndex]); 87*90c8c64dSAndroid Build Coastguard Worker postInvalidate(); 88*90c8c64dSAndroid Build Coastguard Worker mProgress += 0.1; 89*90c8c64dSAndroid Build Coastguard Worker if (mProgress > 1.0) { 90*90c8c64dSAndroid Build Coastguard Worker mFromColorIndex = mToColorIndex; 91*90c8c64dSAndroid Build Coastguard Worker // Find a new color. 92*90c8c64dSAndroid Build Coastguard Worker mToColorIndex++; 93*90c8c64dSAndroid Build Coastguard Worker if (mToColorIndex >= mColors.length) { 94*90c8c64dSAndroid Build Coastguard Worker mToColorIndex = 0; 95*90c8c64dSAndroid Build Coastguard Worker } 96*90c8c64dSAndroid Build Coastguard Worker } 97*90c8c64dSAndroid Build Coastguard Worker mHandler.sendEmptyMessageDelayed(0, 100); 98*90c8c64dSAndroid Build Coastguard Worker } 99*90c8c64dSAndroid Build Coastguard Worker }; 100*90c8c64dSAndroid Build Coastguard Worker } 101*90c8c64dSAndroid Build Coastguard Worker getColor(float fraction, int colorStart, int colorEnd)102*90c8c64dSAndroid Build Coastguard Worker private int getColor(float fraction, int colorStart, int colorEnd) { 103*90c8c64dSAndroid Build Coastguard Worker int startInt = colorStart; 104*90c8c64dSAndroid Build Coastguard Worker int startA = (startInt >> 24) & 0xff; 105*90c8c64dSAndroid Build Coastguard Worker int startR = (startInt >> 16) & 0xff; 106*90c8c64dSAndroid Build Coastguard Worker int startG = (startInt >> 8) & 0xff; 107*90c8c64dSAndroid Build Coastguard Worker int startB = startInt & 0xff; 108*90c8c64dSAndroid Build Coastguard Worker 109*90c8c64dSAndroid Build Coastguard Worker int endInt = colorEnd; 110*90c8c64dSAndroid Build Coastguard Worker int endA = (endInt >> 24) & 0xff; 111*90c8c64dSAndroid Build Coastguard Worker int endR = (endInt >> 16) & 0xff; 112*90c8c64dSAndroid Build Coastguard Worker int endG = (endInt >> 8) & 0xff; 113*90c8c64dSAndroid Build Coastguard Worker int endB = endInt & 0xff; 114*90c8c64dSAndroid Build Coastguard Worker 115*90c8c64dSAndroid Build Coastguard Worker return (startA + (int)(fraction * (endA - startA))) << 24 | 116*90c8c64dSAndroid Build Coastguard Worker (startR + (int)(fraction * (endR - startR))) << 16 | 117*90c8c64dSAndroid Build Coastguard Worker (startG + (int)(fraction * (endG - startG))) << 8 | 118*90c8c64dSAndroid Build Coastguard Worker ((startB + (int)(fraction * (endB - startB)))); 119*90c8c64dSAndroid Build Coastguard Worker } 120*90c8c64dSAndroid Build Coastguard Worker } 121