Android Open Source - LimeLight Color Square View






From Project

Back to project page LimeLight.

License

The source code is released under:

GNU General Public License

If you think the Android project LimeLight listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 This Source Code Form is subject to the terms of the Mozilla Public
 License, v. 2.0, as well as to the Additional Term regarding proper
 attribution. The latter is located in Term 11 of the License.
 If a copy of the MPL with the Additional Term was not distributed
 with this file, You can obtain one at http://static.fuzzhq.com/licenses/MPL
 *//*  w w  w  .ja va  2 s .  c  o  m*/

package com.fuzz.android.limelight.recorder.widget.color;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.view.MotionEvent;
import android.view.View;

/**
 * @author James Davis (Fuzz)
 */
public class ColorSquareView extends View {
    private static final float HUE_BAR_HEIGHT = 10;
    ColorHueSlider slider;
    private Paint mPaint;
    private float mCurrentHue = 0;
    private int mCurrentX = 0, mCurrentY = 0;
    private int mCurrentColor, mDefaultColor;
    private int[] mMainColors = new int[65536];
    private Shader[] mShaders = new Shader[256];
    private OnColorChangedListener mListener;
    private int mHeight = 0;

    public ColorSquareView(Context c, OnColorChangedListener l, ColorHueSlider slider, int color, int defaultColor) {
        super(c);
        mListener = l;
        mDefaultColor = defaultColor;

        this.slider = slider;
        slider.setOnColorChangedListener(new OnColorChangedListener() {
            @Override
            public void colorChanged(String key, int color) {
                float[] hsv = new float[3];
                Color.colorToHSV(color, hsv);
                mCurrentHue = hsv[0];
                updateMainColors();
                placeCircleAtPosition(mCurrentX, mCurrentY);
                invalidate();
            }
        });

        // Get the current hue from the current color and update the main color field
        float[] hsv = new float[3];
        Color.colorToHSV(color, hsv);
        mCurrentHue = hsv[0];
        updateMainColors();

        mCurrentColor = color;

        // Initializes the Paint that will draw the View
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setTextAlign(Paint.Align.CENTER);
        mPaint.setTextSize(12);
    }

    // Update the main field colors depending on the current selected hue
    private void updateMainColors() {
        int mainColor = slider.getCurrentColor();
        int index = 0;
        int[] topColors = new int[256];
        for (int y = 0; y < 256; y++) {
            for (int x = 0; x < 256; x++) {
                if (y == 0) {
                    mMainColors[index] = Color.rgb(255 - (255 - Color.red(mainColor)) * x / 255, 255 - (255 - Color.green(mainColor)) * x / 255, 255 - (255 - Color.blue(mainColor)) * x / 255);
                    topColors[x] = mMainColors[index];
                } else
                    mMainColors[index] = Color.rgb((255 - y) * Color.red(topColors[x]) / 255, (255 - y) * Color.green(topColors[x]) / 255, (255 - y) * Color.blue(topColors[x]) / 255);
                index++;
            }
        }

        updateShaders();
    }

    private void placeCircleAtPosition(int x, int y) {
        float scale_w = 256f / getWidth();
        float scale_h = 256f / getHeight();

        // If the touch event is located in the main field
        if (x > 0 && x < getWidth() && y > 0 && y < getHeight()) {
            mCurrentX = x;
            mCurrentY = y;
            int transX = (int) (mCurrentX * scale_w);
            int transY = (int) (mCurrentY * scale_h);
            int index = 256 * (transY - 1) + transX;
            if (index > 0 && index < mMainColors.length) {
                // Update the current color
                mCurrentColor = mMainColors[index];
                // Force the redraw of the dialog
                invalidate();
            }

            mListener.colorChanged("", mCurrentColor);
        }
    }

    private void updateShaders() {
        if (mHeight > 0) {
            for (int i = 0; i < 256; i++) {
                int[] colors = new int[2];
                colors[0] = mMainColors[i];
                colors[1] = Color.BLACK;
                mShaders[i] = new LinearGradient(0, 0, 0, mHeight, colors, null, Shader.TileMode.MIRROR);
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getActionMasked();
        switch (action) {
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_DOWN:
                float x = event.getX();
                float y = event.getY();

                placeCircleAtPosition((int) x, (int) y);

                return true;
        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        float width = canvas.getWidth() / 256f;

        if (mHeight <= 0) {
            mHeight = canvas.getHeight();
            updateShaders();
        }

        // Display the main field colors using LinearGradient
        for (int x = 0; x < 256; x++) {
            mPaint.setShader(mShaders[x]);
            mPaint.setStrokeWidth(width + 1);
            canvas.drawLine(x * width, 0, (x * width) + width, canvas.getHeight(), mPaint);
        }

        mPaint.setShader(null);

        // Display the circle around the currently selected color in the main field
        if (mCurrentX >= 0 && mCurrentY >= 0) {
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setColor(Color.BLACK);
            mPaint.setStrokeWidth(3);
            canvas.drawCircle(mCurrentX, mCurrentY, 10, mPaint);
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    public void setCurrentColor(int color) {
        mCurrentColor = color;

    }
}




Java Source Code List

com.fuzz.android.limelight.LimeLight.java
com.fuzz.android.limelight.animation.AnimationHolder.java
com.fuzz.android.limelight.animation.LeftRightAnimation.java
com.fuzz.android.limelight.animation.UpDownAnimation.java
com.fuzz.android.limelight.automate.DrawerAutomator.java
com.fuzz.android.limelight.automate.ViewAutomator.java
com.fuzz.android.limelight.model.ActToViewHelper.java
com.fuzz.android.limelight.model.Act.java
com.fuzz.android.limelight.model.BaseChapter.java
com.fuzz.android.limelight.model.Book.java
com.fuzz.android.limelight.model.ChapterTransition.java
com.fuzz.android.limelight.model.Chapter.java
com.fuzz.android.limelight.model.ModelHelper.java
com.fuzz.android.limelight.model.Text.java
com.fuzz.android.limelight.model.Transition.java
com.fuzz.android.limelight.recorder.FontListAdapter.java
com.fuzz.android.limelight.recorder.RecorderClickListener.java
com.fuzz.android.limelight.recorder.RecorderWindow.java
com.fuzz.android.limelight.recorder.Recorder.java
com.fuzz.android.limelight.recorder.widget.color.ColorHueSlider.java
com.fuzz.android.limelight.recorder.widget.color.ColorPickDialog.java
com.fuzz.android.limelight.recorder.widget.color.ColorSquareView.java
com.fuzz.android.limelight.recorder.widget.color.OnColorChangedListener.java
com.fuzz.android.limelight.recorder.widget.drag.DragAndEditView.java
com.fuzz.android.limelight.recorder.widget.drag.EditorFrameLayout.java
com.fuzz.android.limelight.recorder.widget.drag.OffSetChangeListener.java
com.fuzz.android.limelight.recorder.widget.editor.ActEditor.java
com.fuzz.android.limelight.recorder.widget.editor.ActIconAdapter.java
com.fuzz.android.limelight.recorder.widget.editor.operations.BaseOperation.java
com.fuzz.android.limelight.recorder.widget.editor.operations.ChangeAnimationOperation.java
com.fuzz.android.limelight.recorder.widget.editor.operations.ChangeBackgroundColorOperation.java
com.fuzz.android.limelight.recorder.widget.editor.operations.ChangeIconOperation.java
com.fuzz.android.limelight.recorder.widget.editor.operations.SetTextColorOperation.java
com.fuzz.android.limelight.recorder.widget.filedialog.FileDirectoryDialog.java
com.fuzz.android.limelight.recorder.widget.filedialog.OnDirectorySelectListener.java
com.fuzz.android.limelight.recorder.widget.snap.SnapHelper.java
com.fuzz.android.limelight.recorder.widget.snap.SnapInfo.java
com.fuzz.android.limelight.text.PrimeTextWatcher.java
com.fuzz.android.limelight.util.FontUtils.java
com.fuzz.android.limelight.util.IOUtils.java
com.fuzz.android.limelight.util.JSONTool.java
com.fuzz.android.limelight.util.LimeLightLog.java
com.fuzz.android.limelight.util.ViewUtils.java
com.fuzz.android.limelight.view.PrimeClickListener.java
com.fuzz.android.limelight.widget.ManualPositionFrameLayout.java