16a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang/* 26a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * Copyright (C) 2010 The Android Open Source Project 36a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * 46a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * Licensed under the Apache License, Version 2.0 (the "License"); 56a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * you may not use this file except in compliance with the License. 66a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * You may obtain a copy of the License at 76a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * 86a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * http://www.apache.org/licenses/LICENSE-2.0 96a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * 106a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * Unless required by applicable law or agreed to in writing, software 116a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * distributed under the License is distributed on an "AS IS" BASIS, 126a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * See the License for the specific language governing permissions and 146a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * limitations under the License. 156a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang */ 166a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 176a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangpackage com.android.gallery3d.photoeditor.actions; 186a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 196a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport android.content.Context; 206a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport android.content.res.TypedArray; 216a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport android.graphics.Bitmap; 226a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport android.graphics.Canvas; 236a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport android.graphics.Paint; 246a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport android.graphics.Region.Op; 256a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport android.graphics.drawable.BitmapDrawable; 266a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport android.util.AttributeSet; 276a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport android.widget.SeekBar; 286a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 296a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangimport com.android.gallery3d.R; 306a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 316a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang/** 326a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * Seek-bar that has a draggable thumb to set and get the color from predefined color set. 336a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang */ 346a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huangclass ColorSeekBar extends AbstractSeekBar { 356a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 366a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang /** 376a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang * Listens to color changes. 386a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang */ 396a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang public interface OnColorChangeListener { 406a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 416a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang void onColorChanged(int color, boolean fromUser); 426a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 436a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 446a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang private final int[] colors; 456a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang private Bitmap background; 466a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 476a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang public ColorSeekBar(Context context, AttributeSet attrs) { 486a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang super(context, attrs); 496a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 506a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang // Set up the predefined colors that could be indexed in the seek-bar. 516a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang TypedArray a = getResources().obtainTypedArray(R.array.color_picker_colors); 526a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang colors = new int[a.length()]; 536a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang for (int i = 0; i < a.length(); i++) { 546a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang colors[i] = a.getColor(i, 0x000000); 556a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 566a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang a.recycle(); 576a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang setMax(colors.length - 1); 586a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 596a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 606a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang @Override 616a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang protected void onSizeChanged(int w, int h, int oldw, int oldh) { 626a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang super.onSizeChanged(w, h, oldw, oldh); 636a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 646a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang if (background != null) { 656a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang background.recycle(); 666a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 676a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang background = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 686a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang Canvas canvas = new Canvas(background); 696a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 706a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 716a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang paint.setStyle(Paint.Style.FILL); 726a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 736a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang // Draw two half circles in the first and last colors at seek-bar left/right ends. 746a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang int radius = getThumbOffset(); 756a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang float left = radius; 766a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang float right = w - radius; 776a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang float cy = h / 2; 786a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 796a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang canvas.save(); 806a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang canvas.clipRect(left, 0, right, h, Op.DIFFERENCE); 816a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang paint.setColor(colors[0]); 826a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang canvas.drawCircle(left, cy, radius, paint); 836a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang paint.setColor(colors[colors.length - 1]); 846a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang canvas.drawCircle(right, cy, radius, paint); 856a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang canvas.restore(); 866a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 876a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang // Draw color strips that make the thumb stop at every strip's center during seeking. 886a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang float strip = (right - left) / (colors.length - 1); 896a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang right = left + strip / 2; 906a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang paint.setColor(colors[0]); 916a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang canvas.drawRect(left, 0, right, h, paint); 926a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang left = right; 936a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang for (int i = 1; i < colors.length - 1; i++) { 946a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang right = left + strip; 956a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang paint.setColor(colors[i]); 966a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang canvas.drawRect(left, 0, right, h, paint); 976a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang left = right; 986a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 996a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang right = left + strip / 2; 1006a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang paint.setColor(colors[colors.length - 1]); 1016a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang canvas.drawRect(left, 0, right, h, paint); 1026a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 1036a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang setBackgroundDrawable(new BitmapDrawable(getResources(), background)); 1046a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 1056a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 1066a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang public void setOnColorChangeListener(final OnColorChangeListener listener) { 1076a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang setOnSeekBarChangeListener((listener == null) ? null : new OnSeekBarChangeListener() { 1086a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 1096a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang @Override 1106a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 1116a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang listener.onColorChanged(colors[progress], fromUser); 1126a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 1136a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 1146a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang @Override 1156a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang public void onStartTrackingTouch(SeekBar seekBar) { 1166a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 1176a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 1186a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang @Override 1196a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang public void onStopTrackingTouch(SeekBar seekBar) { 1206a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 1216a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang }); 1226a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 1236a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 1246a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang public void setColorIndex(int colorIndex) { 1256a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang setProgress(colorIndex); 1266a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 1276a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang 1286a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang public int getColor() { 1296a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang return colors[getProgress()]; 1306a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang } 1316a12ad70df5da5052a8381e2cdda79e6a314cee9Yuli Huang} 132