├── app ├── .gitignore ├── src │ ├── main │ │ ├── res │ │ │ ├── drawable │ │ │ │ ├── tile.png │ │ │ │ ├── ic_launcher.png │ │ │ │ └── background.xml │ │ │ ├── drawable-hdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_github_circle_black_24dp.png │ │ │ ├── drawable-mdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_github_circle_black_24dp.png │ │ │ ├── drawable-xhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_github_circle_black_24dp.png │ │ │ ├── drawable-xxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_github_circle_black_24dp.png │ │ │ ├── drawable-xxxhdpi │ │ │ │ ├── ic_launcher.png │ │ │ │ └── ic_github_circle_black_24dp.png │ │ │ ├── values │ │ │ │ ├── dimens.xml │ │ │ │ ├── strings.xml │ │ │ │ └── styles.xml │ │ │ ├── values-w820dp │ │ │ │ └── dimens.xml │ │ │ ├── menu │ │ │ │ └── menu_sample_activity3.xml │ │ │ ├── layout │ │ │ │ ├── activity_sample2.xml │ │ │ │ ├── fragment_adapted_dialog.xml │ │ │ │ ├── activity_sample3.xml │ │ │ │ ├── fragment_sample_activity3.xml │ │ │ │ └── activity_sample.xml │ │ │ ├── xml │ │ │ │ └── prefs.xml │ │ │ └── layout-land │ │ │ │ └── fragment_adapted_dialog.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── flask │ │ │ │ └── colorpicker │ │ │ │ └── sample │ │ │ │ ├── PrefsActivity.java │ │ │ │ ├── SampleActivity2.java │ │ │ │ ├── SampleActivity3.java │ │ │ │ └── SampleActivity.java │ │ └── AndroidManifest.xml │ └── androidTest │ │ └── java │ │ └── com │ │ └── flask │ │ └── colorpicker │ │ └── sample │ │ └── ApplicationTest.java ├── proguard-rules.pro └── build.gradle ├── library ├── .gitignore ├── src │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── flask │ │ │ │ └── colorpicker │ │ │ │ ├── OnColorChangedListener.java │ │ │ │ ├── OnColorSelectedListener.java │ │ │ │ ├── slider │ │ │ │ ├── OnValueChangedListener.java │ │ │ │ ├── LightnessSlider.java │ │ │ │ ├── AlphaSlider.java │ │ │ │ └── AbsCustomSlider.java │ │ │ │ ├── renderer │ │ │ │ ├── ColorWheelRenderOption.java │ │ │ │ ├── ColorWheelRenderer.java │ │ │ │ ├── AbsColorWheelRenderer.java │ │ │ │ ├── SimpleColorWheelRenderer.java │ │ │ │ └── FlowerColorWheelRenderer.java │ │ │ │ ├── builder │ │ │ │ ├── ColorPickerClickListener.java │ │ │ │ ├── ColorWheelRendererBuilder.java │ │ │ │ ├── PaintBuilder.java │ │ │ │ └── ColorPickerDialogBuilder.java │ │ │ │ ├── Utils.java │ │ │ │ ├── ColorCircle.java │ │ │ │ ├── ColorCircleDrawable.java │ │ │ │ ├── ColorPickerPreference.java │ │ │ │ └── ColorPickerView.java │ │ └── res │ │ │ ├── layout │ │ │ ├── color_edit.xml │ │ │ ├── color_widget.xml │ │ │ ├── color_preview.xml │ │ │ └── color_selector.xml │ │ │ └── values │ │ │ ├── styles.xml │ │ │ ├── dimens.xml │ │ │ └── attrs.xml │ └── androidTest │ │ └── java │ │ └── com │ │ └── flask │ │ └── colorpicker │ │ └── ApplicationTest.java ├── build.gradle └── proguard-rules.pro ├── settings.gradle ├── screenshot ├── screenshot.png ├── screenshot2.png ├── screenshot3.png └── screenshot4.png ├── gradle ├── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties └── local.properties ├── CHANGELOG.md ├── .gitignore ├── .travis.yml ├── gradlew.bat ├── README.md └── gradlew /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /library/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app', ':library' 2 | -------------------------------------------------------------------------------- /screenshot/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/screenshot/screenshot.png -------------------------------------------------------------------------------- /screenshot/screenshot2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/screenshot/screenshot2.png -------------------------------------------------------------------------------- /screenshot/screenshot3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/screenshot/screenshot3.png -------------------------------------------------------------------------------- /screenshot/screenshot4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/screenshot/screenshot4.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /app/src/main/res/drawable/tile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable/tile.png -------------------------------------------------------------------------------- /library/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | CHANGELOG 2 | ------------ 3 | 4 | - some performance improvement 5 | - add ColorPickerPerference for Preference xml 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/ 5 | .DS_Store 6 | /build 7 | /captures 8 | gradle.properties 9 | .externalNativeBuild 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-hdpi/ic_github_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-hdpi/ic_github_circle_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-mdpi/ic_github_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-mdpi/ic_github_circle_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_github_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-xhdpi/ic_github_circle_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/ic_github_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-xxhdpi/ic_github_circle_black_24dp.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxxhdpi/ic_github_circle_black_24dp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/QuadFlask/colorpicker/HEAD/app/src/main/res/drawable-xxxhdpi/ic_github_circle_black_24dp.png -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/OnColorChangedListener.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker; 2 | 3 | public interface OnColorChangedListener { 4 | void onColorChanged(int selectedColor); 5 | } 6 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/OnColorSelectedListener.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker; 2 | 3 | public interface OnColorSelectedListener { 4 | void onColorSelected(int selectedColor); 5 | } 6 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/slider/OnValueChangedListener.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.slider; 2 | 3 | public interface OnValueChangedListener { 4 | void onValueChanged(float value); 5 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable/background.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /library/src/main/res/layout/color_edit.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Thu Nov 07 22:59:21 KST 2019 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: android 2 | 3 | sudo: false 4 | 5 | android: 6 | components: 7 | - build-tools-26.0.2 8 | - android-26 9 | - extra-google-m2repository 10 | - extra-android-m2repository 11 | 12 | licenses: 13 | - android-sdk-license-.+ 14 | 15 | script: ./gradlew clean build --info 16 | -------------------------------------------------------------------------------- /app/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 16dp 6 | 8dp 7 | 8 | -------------------------------------------------------------------------------- /library/src/main/res/layout/color_widget.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/renderer/ColorWheelRenderOption.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.renderer; 2 | 3 | import android.graphics.Canvas; 4 | 5 | public class ColorWheelRenderOption { 6 | public int density; 7 | public float maxRadius; 8 | public float cSize, strokeWidth, alpha, lightness; 9 | public Canvas targetCanvas; 10 | } -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ColorPicker 3 | Choose color 4 | SampleActivity3 5 | Settings 6 | Hello World from section: %1$d 7 | 8 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/builder/ColorPickerClickListener.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.builder; 2 | 3 | import android.content.DialogInterface; 4 | 5 | /** 6 | * Created by Charles Anderson on 4/17/15. 7 | */ 8 | public interface ColorPickerClickListener { 9 | void onClick(DialogInterface d, int lastSelectedColor, Integer[] allColors); 10 | } 11 | -------------------------------------------------------------------------------- /library/src/main/res/layout/color_preview.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /app/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/menu/menu_sample_activity3.xml: -------------------------------------------------------------------------------- 1 | 5 | 9 | 10 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/renderer/ColorWheelRenderer.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.renderer; 2 | 3 | import com.flask.colorpicker.ColorCircle; 4 | 5 | import java.util.List; 6 | 7 | public interface ColorWheelRenderer { 8 | float GAP_PERCENTAGE = 0.025f; 9 | 10 | void draw(); 11 | 12 | ColorWheelRenderOption getRenderOption(); 13 | 14 | void initWith(ColorWheelRenderOption colorWheelRenderOption); 15 | 16 | List getColorCircleList(); 17 | } 18 | -------------------------------------------------------------------------------- /library/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 36dp 3 | 24dp 4 | 4dp 5 | 10dp 6 | 24dp 7 | 40dp 8 | 36dp 9 | 20dp 10 | 11 | -------------------------------------------------------------------------------- /gradle/local.properties: -------------------------------------------------------------------------------- 1 | ## This file is automatically generated by Android Studio. 2 | # Do not modify this file -- YOUR CHANGES WILL BE ERASED! 3 | # 4 | # This file must *NOT* be checked into Version Control Systems, 5 | # as it contains information specific to your local configuration. 6 | # 7 | # Location of the SDK. This is only used by Gradle. 8 | # For customization when using a Version Control System, please read the 9 | # header note. 10 | #Tue Mar 24 18:54:39 KST 2015 11 | sdk.dir=/Users/flask/Library/Android/sdk 12 | -------------------------------------------------------------------------------- /library/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.0" 6 | 7 | defaultConfig { 8 | minSdkVersion 14 9 | targetSdkVersion 29 10 | versionCode 17 11 | versionName "0.0.15" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(dir: 'libs', include: ['*.jar']) 23 | implementation 'androidx.appcompat:appcompat:1.1.0' 24 | } 25 | -------------------------------------------------------------------------------- /library/src/main/res/layout/color_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 12 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/flask/Documents/android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /library/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/flask/Documents/android-sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/builder/ColorWheelRendererBuilder.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.builder; 2 | 3 | import com.flask.colorpicker.ColorPickerView; 4 | import com.flask.colorpicker.renderer.ColorWheelRenderer; 5 | import com.flask.colorpicker.renderer.FlowerColorWheelRenderer; 6 | import com.flask.colorpicker.renderer.SimpleColorWheelRenderer; 7 | 8 | public class ColorWheelRendererBuilder { 9 | public static ColorWheelRenderer getRenderer(ColorPickerView.WHEEL_TYPE wheelType) { 10 | switch (wheelType) { 11 | case CIRCLE: 12 | return new SimpleColorWheelRenderer(); 13 | case FLOWER: 14 | return new FlowerColorWheelRenderer(); 15 | } 16 | throw new IllegalArgumentException("wrong WHEEL_TYPE"); 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 10 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /library/src/main/res/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_sample2.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 20 | 21 | 26 | 27 | 32 | 33 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.0" 6 | 7 | defaultConfig { 8 | applicationId "com.flask.colorpicker.sample" 9 | minSdkVersion 14 10 | targetSdkVersion 29 11 | versionCode 10 12 | versionName "1.0.10" 13 | 14 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 15 | } 16 | // signingConfigs { 17 | // release { 18 | // storeFile file(RELEASE_STORE_FILE) 19 | // storePassword RELEASE_STORE_PASSWORD 20 | // keyAlias RELEASE_KEY_ALIAS 21 | // keyPassword RELEASE_KEY_PASSWORD 22 | // } 23 | // } 24 | // buildTypes { 25 | // release { 26 | // minifyEnabled false 27 | // proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 28 | // signingConfig signingConfigs.release 29 | // } 30 | // } 31 | } 32 | 33 | dependencies { 34 | implementation fileTree(dir: 'libs', include: ['*.jar']) 35 | implementation project(":library") 36 | implementation 'androidx.appcompat:appcompat:1.1.0' 37 | implementation 'androidx.constraintlayout:constraintlayout:2.0.0-beta3' 38 | implementation 'com.google.android.material:material:1.0.0' 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/res/xml/prefs.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 14 | 22 | 30 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/Utils.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker; 2 | 3 | import android.graphics.Color; 4 | 5 | /** 6 | * Created by Charles Andersons on 4/17/15. 7 | */ 8 | public class Utils { 9 | public static float getAlphaPercent(int argb) { 10 | return Color.alpha(argb) / 255f; 11 | } 12 | 13 | public static int alphaValueAsInt(float alpha) { 14 | return Math.round(alpha * 255); 15 | } 16 | 17 | public static int adjustAlpha(float alpha, int color) { 18 | return alphaValueAsInt(alpha) << 24 | (0x00ffffff & color); 19 | } 20 | 21 | public static int colorAtLightness(int color, float lightness) { 22 | float[] hsv = new float[3]; 23 | Color.colorToHSV(color, hsv); 24 | hsv[2] = lightness; 25 | return Color.HSVToColor(hsv); 26 | } 27 | 28 | public static float lightnessOfColor(int color) { 29 | float[] hsv = new float[3]; 30 | Color.colorToHSV(color, hsv); 31 | return hsv[2]; 32 | } 33 | 34 | public static String getHexString(int color, boolean showAlpha) { 35 | int base = showAlpha ? 0xFFFFFFFF : 0xFFFFFF; 36 | String format = showAlpha ? "#%08X" : "#%06X"; 37 | return String.format(format, (base & color)).toUpperCase(); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/renderer/AbsColorWheelRenderer.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.renderer; 2 | 3 | import com.flask.colorpicker.ColorCircle; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | public abstract class AbsColorWheelRenderer implements ColorWheelRenderer { 9 | protected ColorWheelRenderOption colorWheelRenderOption; 10 | protected List colorCircleList = new ArrayList<>(); 11 | 12 | public void initWith(ColorWheelRenderOption colorWheelRenderOption) { 13 | this.colorWheelRenderOption = colorWheelRenderOption; 14 | this.colorCircleList.clear(); 15 | } 16 | 17 | @Override 18 | public ColorWheelRenderOption getRenderOption() { 19 | if (colorWheelRenderOption == null) colorWheelRenderOption = new ColorWheelRenderOption(); 20 | return colorWheelRenderOption; 21 | } 22 | 23 | public List getColorCircleList() { 24 | return colorCircleList; 25 | } 26 | 27 | protected int getAlphaValueAsInt() { 28 | return Math.round(colorWheelRenderOption.alpha * 255); 29 | } 30 | 31 | protected int calcTotalCount(float radius, float size) { 32 | return Math.max(1, (int) ((1f - GAP_PERCENTAGE) * Math.PI / (Math.asin(size / radius)) + 0.5f)); 33 | } 34 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_adapted_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 23 | 24 | 28 | 29 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/ColorCircle.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker; 2 | 3 | import android.graphics.Color; 4 | 5 | public class ColorCircle { 6 | private float x, y; 7 | private float[] hsv = new float[3]; 8 | private float[] hsvClone; 9 | private int color; 10 | 11 | public ColorCircle(float x, float y, float[] hsv) { 12 | set(x, y, hsv); 13 | } 14 | 15 | public double sqDist(float x, float y) { 16 | double dx = this.x - x; 17 | double dy = this.y - y; 18 | return dx * dx + dy * dy; 19 | } 20 | 21 | public float getX() { 22 | return x; 23 | } 24 | 25 | public float getY() { 26 | return y; 27 | } 28 | 29 | public float[] getHsv() { 30 | return hsv; 31 | } 32 | 33 | public float[] getHsvWithLightness(float lightness) { 34 | if (hsvClone == null) 35 | hsvClone = hsv.clone(); 36 | hsvClone[0] = hsv[0]; 37 | hsvClone[1] = hsv[1]; 38 | hsvClone[2] = lightness; 39 | return hsvClone; 40 | } 41 | 42 | public void set(float x, float y, float[] hsv) { 43 | this.x = x; 44 | this.y = y; 45 | this.hsv[0] = hsv[0]; 46 | this.hsv[1] = hsv[1]; 47 | this.hsv[2] = hsv[2]; 48 | this.color = Color.HSVToColor(this.hsv); 49 | } 50 | 51 | public int getColor() { 52 | return color; 53 | } 54 | } -------------------------------------------------------------------------------- /app/src/main/res/layout-land/fragment_adapted_dialog.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 18 | 19 | 24 | 25 | 30 | 31 | -------------------------------------------------------------------------------- /app/src/main/java/com/flask/colorpicker/sample/SampleActivity2.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.sample; 2 | 3 | import android.os.Bundle; 4 | import androidx.appcompat.app.AppCompatActivity; 5 | import android.util.Log; 6 | import android.widget.Toast; 7 | 8 | import com.flask.colorpicker.ColorPickerView; 9 | import com.flask.colorpicker.OnColorChangedListener; 10 | import com.flask.colorpicker.OnColorSelectedListener; 11 | 12 | public class SampleActivity2 extends AppCompatActivity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_sample2); 18 | 19 | ColorPickerView colorPickerView = findViewById(R.id.color_picker_view); 20 | colorPickerView.addOnColorChangedListener(new OnColorChangedListener() { 21 | @Override public void onColorChanged(int selectedColor) { 22 | // Handle on color change 23 | Log.d("ColorPicker", "onColorChanged: 0x" + Integer.toHexString(selectedColor)); 24 | } 25 | }); 26 | colorPickerView.addOnColorSelectedListener(new OnColorSelectedListener() { 27 | @Override 28 | public void onColorSelected(int selectedColor) { 29 | Toast.makeText( 30 | SampleActivity2.this, 31 | "selectedColor: " + Integer.toHexString(selectedColor).toUpperCase(), 32 | Toast.LENGTH_SHORT).show(); 33 | } 34 | }); 35 | } 36 | } -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/ColorCircleDrawable.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker; 2 | 3 | import android.graphics.Canvas; 4 | import android.graphics.Paint; 5 | import android.graphics.drawable.ColorDrawable; 6 | 7 | import com.flask.colorpicker.builder.PaintBuilder; 8 | 9 | public class ColorCircleDrawable extends ColorDrawable { 10 | private float strokeWidth; 11 | private Paint strokePaint = PaintBuilder.newPaint().style(Paint.Style.STROKE).stroke(strokeWidth).color(0xff9e9e9e).build(); 12 | private Paint fillPaint = PaintBuilder.newPaint().style(Paint.Style.FILL).color(0).build(); 13 | private Paint fillBackPaint = PaintBuilder.newPaint().shader(PaintBuilder.createAlphaPatternShader(26)).build(); 14 | 15 | public ColorCircleDrawable(int color) { 16 | super(color); 17 | } 18 | 19 | @Override 20 | public void draw(Canvas canvas) { 21 | canvas.drawColor(0); 22 | 23 | int width = canvas.getWidth(); 24 | float radius = width / 2f; 25 | strokeWidth = radius / 8f; 26 | 27 | this.strokePaint.setStrokeWidth(strokeWidth); 28 | this.fillPaint.setColor(getColor()); 29 | canvas.drawCircle(radius, radius, radius - strokeWidth, fillBackPaint); 30 | canvas.drawCircle(radius, radius, radius - strokeWidth, fillPaint); 31 | canvas.drawCircle(radius, radius, radius - strokeWidth, strokePaint); 32 | } 33 | 34 | @Override 35 | public void setColor(int color) { 36 | super.setColor(color); 37 | invalidateSelf(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_sample3.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 18 | 19 | 26 | 27 | 28 | 29 | 30 | 31 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/res/layout/fragment_sample_activity3.xml: -------------------------------------------------------------------------------- 1 | 13 | 14 | 18 | 19 | 30 | 31 | 36 | 37 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /library/src/main/java/com/flask/colorpicker/renderer/SimpleColorWheelRenderer.java: -------------------------------------------------------------------------------- 1 | package com.flask.colorpicker.renderer; 2 | 3 | import android.graphics.Color; 4 | import android.graphics.Paint; 5 | 6 | import com.flask.colorpicker.ColorCircle; 7 | import com.flask.colorpicker.builder.PaintBuilder; 8 | 9 | public class SimpleColorWheelRenderer extends AbsColorWheelRenderer { 10 | private Paint selectorFill = PaintBuilder.newPaint().build(); 11 | private float[] hsv = new float[3]; 12 | 13 | @Override 14 | public void draw() { 15 | final int setSize = colorCircleList.size(); 16 | int currentCount = 0; 17 | float half = colorWheelRenderOption.targetCanvas.getWidth() / 2f; 18 | int density = colorWheelRenderOption.density; 19 | float maxRadius = colorWheelRenderOption.maxRadius; 20 | 21 | for (int i = 0; i < density; i++) { 22 | float p = (float) i / (density - 1); // 0~1 23 | float radius = maxRadius * p; 24 | float size = colorWheelRenderOption.cSize; 25 | int total = calcTotalCount(radius, size); 26 | 27 | for (int j = 0; j < total; j++) { 28 | double angle = Math.PI * 2 * j / total + (Math.PI / total) * ((i + 1) % 2); 29 | float x = half + (float) (radius * Math.cos(angle)); 30 | float y = half + (float) (radius * Math.sin(angle)); 31 | hsv[0] = (float) (angle * 180 / Math.PI); 32 | hsv[1] = radius / maxRadius; 33 | hsv[2] = colorWheelRenderOption.lightness; 34 | selectorFill.setColor(Color.HSVToColor(hsv)); 35 | selectorFill.setAlpha(getAlphaValueAsInt()); 36 | 37 | colorWheelRenderOption.targetCanvas.drawCircle(x, y, size - colorWheelRenderOption.strokeWidth, selectorFill); 38 | 39 | if (currentCount >= setSize) 40 | colorCircleList.add(new ColorCircle(x, y, hsv)); 41 | else colorCircleList.get(currentCount).set(x, y, hsv); 42 | currentCount++; 43 | } 44 | } 45 | } 46 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_sample.xml: -------------------------------------------------------------------------------- 1 | 8 | 9 | 14 | 15 | 23 | 24 | 31 |