17f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung/* 27f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * Copyright (C) 2013 The Android Open Source Project 37f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * 47f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * Licensed under the Apache License, Version 2.0 (the "License"); 57f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * you may not use this file except in compliance with the License. 67f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * You may obtain a copy of the License at 77f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * 87f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * http://www.apache.org/licenses/LICENSE-2.0 97f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * 107f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * Unless required by applicable law or agreed to in writing, software 117f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * distributed under the License is distributed on an "AS IS" BASIS, 127f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * See the License for the specific language governing permissions and 147f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * limitations under the License. 157f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung */ 167f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 177f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungpackage com.android.colorpicker; 187f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 197f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungimport android.graphics.Color; 207f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungimport android.graphics.PorterDuff; 217f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungimport android.graphics.drawable.Drawable; 227f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungimport android.graphics.drawable.LayerDrawable; 237f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 247f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung/** 257f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * A drawable which sets its color filter to a color specified by the user, and changes to a 267f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * slightly darker color when pressed or focused. 277f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung */ 287f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kungpublic class ColorStateDrawable extends LayerDrawable { 297f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 307f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung private static final float PRESSED_STATE_MULTIPLIER = 0.70f; 317f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 327f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung private int mColor; 337f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 347f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung public ColorStateDrawable(Drawable[] layers, int color) { 357f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung super(layers); 367f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung mColor = color; 377f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung } 387f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 397f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung @Override 407f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung protected boolean onStateChange(int[] states) { 417f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung boolean pressedOrFocused = false; 427f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung for (int state : states) { 437f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung if (state == android.R.attr.state_pressed || state == android.R.attr.state_focused) { 447f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung pressedOrFocused = true; 457f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung break; 467f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung } 477f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung } 487f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 497f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung if (pressedOrFocused) { 507f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung super.setColorFilter(getPressedColor(mColor), PorterDuff.Mode.SRC_ATOP); 517f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung } else { 527f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung super.setColorFilter(mColor, PorterDuff.Mode.SRC_ATOP); 537f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung } 547f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 557f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung return super.onStateChange(states); 567f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung } 577f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 587f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung /** 597f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung * Given a particular color, adjusts its value by a multiplier. 607f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung */ 6152f6c4fb384a3937b54c72fcddcc0ed77344f90cScott Kennedy private static int getPressedColor(int color) { 627f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung float[] hsv = new float[3]; 637f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung Color.colorToHSV(color, hsv); 647f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung hsv[2] = hsv[2] * PRESSED_STATE_MULTIPLIER; 657f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung return Color.HSVToColor(hsv); 667f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung } 677f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung 687f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung @Override 697f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung public boolean isStateful() { 707f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung return true; 717f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung } 727f1c44e9cb4f5503fae17d35d39370f9ef8395a3James Kung} 73