Partage
  • Partager sur Facebook
  • Partager sur Twitter

ColorPickerView dans une Dialog box

Suite au tuto Openclasserooms

    25 mars 2020 à 17:41:43

    Hello,

    Je suis débutant en programmation Android, je me lance car j'ai un bon niveau en système embarqué et je voulais un lien plus haut niveau avec le monde réel ! Bref, j'ai besoin de vous.

    J'ai suivis le tuto https://openclassrooms.com/fr/courses/2023346-creez-des-applications-pour-android/2027006-tp-un-explorateur-de-fichiers

    Le but est de naviguer dans un système de fichier. Mais mon soucis n'est pas là.

    Dans le tuto on utilise les préférences et tout le contexte associé pour définir la couleur de la police des dossiers affiché.

    Dans mon projet j'utilise une version trop récente de l'API qui ne supporte pas les préférences (android.preference.DialogPreference)

    Sachant que j'ai réussis à afficher une Dialog box en utilisant la class

    DialogFragment

     en réimplémentant :

    public Dialog onCreateDialog

    je me suis dit que j'arriverais à afficher (au moins afficher pour commencer) la vue ColorPickerView.

    Mais ça ne fonctionne pas.

    Je ne sais pas si :

    • ColorPickerView n'est pas compatible avec cette dialog box ? Pourtant les méthodes sont les mêmes.
    • Dois je définir dans le layout qqch en particulier ? Pourtant une diag box se débrouille pour l'affichage
    • Ou bien encore un XML quelconque ?

    Je vous joins les différents fichiers.

    Je suis preneur d'une solution qui affiche simplement la vue ColorPickerView dans une dialog box !

    En vous remerciant infiniment :D

    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
        ColorPickerPreferenceDialog colorPikerView_main = new ColorPickerPreferenceDialog();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            colorPikerView_main.show(getSupportFragmentManager(), "colorPikerView_main");
        }
    }
    
    import android.app.AlertDialog.Builder;
    import android.app.Dialog;
    import android.content.Context;
    import android.graphics.Color;
    import android.os.Bundle;
    
    import androidx.fragment.app.DialogFragment;
    
    public class ColorPickerPreferenceDialog extends DialogFragment implements ColorPickerView.OnColorChangedListener {
        private int mColor = Color.BLACK;
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            Context c = getActivity();
    
            // Use the Builder class for convenient dialog construction
            Builder builder = new Builder(c);
    
            // On insère la vue dans la boîte de dialogue
            builder.setView(new ColorPickerView(c,this, mColor));
    
            // Create the AlertDialog object and return it
            return builder.create();
        }
    
        /**
         * Déclenché à chaque fois que l'utilisateur choisit une couleur
         */
        public void colorChanged(int color) {
            mColor = color;
        }
    }
    



    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.ColorMatrix;
    import android.graphics.Paint;
    import android.graphics.RectF;
    import android.graphics.Shader;
    import android.graphics.SweepGradient;
    import android.view.MotionEvent;
    import android.view.View;
    
    public class ColorPickerView extends View {
        public interface OnColorChangedListener {
            void colorChanged(int color);
        }
    
        private Paint mPaint;
        private Paint mCenterPaint;
        private final int[] mColors;
        private OnColorChangedListener mListener;
    
        ColorPickerView(Context c, OnColorChangedListener l, int color) {
            super(c);
            mListener = l;
            mColors = new int[] {0xFFFF0000, 0xFFFF00FF, 0xFF0000FF, 0xFF00FFFF, 0xFF00FF00, 0xFFFFFF00, 0xFFFF0000};
            Shader s = new SweepGradient(0, 0, mColors, null);
    
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setShader(s);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(32);
    
            mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mCenterPaint.setColor(color);
            mCenterPaint.setStrokeWidth(5);
        }
    
        private boolean mTrackingCenter;
        private boolean mHighlightCenter;
    
        @Override
        protected void onDraw(Canvas canvas) {
            int centerX = getRootView().getWidth()/2 - (int)(mPaint.getStrokeWidth()/2);
            float r = CENTER_X - mPaint.getStrokeWidth()*0.5f;
    
            canvas.translate(centerX, CENTER_Y);
    
            canvas.drawOval(new RectF(-r, -r, r, r), mPaint);
            canvas.drawCircle(0, 0, CENTER_RADIUS, mCenterPaint);
    
            if (mTrackingCenter) {
                int c = mCenterPaint.getColor();
                mCenterPaint.setStyle(Paint.Style.STROKE);
    
                if (mHighlightCenter) {
                    mCenterPaint.setAlpha(0xFF);
                } else {
                    mCenterPaint.setAlpha(0x80);
                }
                canvas.drawCircle(0, 0, CENTER_RADIUS + mCenterPaint.getStrokeWidth(), mCenterPaint);
    
                mCenterPaint.setStyle(Paint.Style.FILL);
                mCenterPaint.setColor(c);
            }
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            setMeasuredDimension(getRootView().getWidth(), CENTER_Y*2);
        }
    
        private static final int CENTER_X = 100;
        private static final int CENTER_Y = 100;
        private static final int CENTER_RADIUS = 32;
    
        private int floatToByte(float x) {
            int n = java.lang.Math.round(x);
            return n;
        }
        private int pinToByte(int n) {
            if (n < 0) {
                n = 0;
            } else if (n > 255) {
                n = 255;
            }
            return n;
        }
    
        private int ave(int s, int d, float p) {
            return s + java.lang.Math.round(p * (d - s));
        }
    
        private int interpColor(int colors[], float unit) {
            if (unit <= 0) {
                return colors[0];
            }
            if (unit >= 1) {
                return colors[colors.length - 1];
            }
    
            float p = unit * (colors.length - 1);
            int i = (int)p;
            p -= i;
    
            int c0 = colors[i];
            int c1 = colors[i+1];
            int a = ave(Color.alpha(c0), Color.alpha(c1), p);
            int r = ave(Color.red(c0), Color.red(c1), p);
            int g = ave(Color.green(c0), Color.green(c1), p);
            int b = ave(Color.blue(c0), Color.blue(c1), p);
    
            return Color.argb(a, r, g, b);
        }
    
        private int rotateColor(int color, float rad) {
            float deg = rad * 180 / 3.1415927f;
            int r = Color.red(color);
            int g = Color.green(color);
            int b = Color.blue(color);
    
            ColorMatrix cm = new ColorMatrix();
            ColorMatrix tmp = new ColorMatrix();
    
            cm.setRGB2YUV();
            tmp.setRotate(0, deg);
            cm.postConcat(tmp);
            tmp.setYUV2RGB();
            cm.postConcat(tmp);
    
            final float[] a = cm.getArray();
    
            int ir = floatToByte(a[0] * r +  a[1] * g +  a[2] * b);
            int ig = floatToByte(a[5] * r +  a[6] * g +  a[7] * b);
            int ib = floatToByte(a[10] * r + a[11] * g + a[12] * b);
    
            return Color.argb(Color.alpha(color), pinToByte(ir), pinToByte(ig), pinToByte(ib));
        }
    
        private static final float PI = 3.1415926f;
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            float x = event.getX() - CENTER_X;
            float y = event.getY() - CENTER_Y;
            boolean inCenter = java.lang.Math.sqrt(x*x + y*y) <= CENTER_RADIUS;
    
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    mTrackingCenter = inCenter;
                    if (inCenter) {
                        mHighlightCenter = true;
                        invalidate();
                        break;
                    }
                case MotionEvent.ACTION_MOVE:
                    if (mTrackingCenter) {
                        if (mHighlightCenter != inCenter) {
                            mHighlightCenter = inCenter;
                            invalidate();
                        }
                    } else {
                        float angle = (float)java.lang.Math.atan2(y, x);
    
                        float unit = angle/(2*PI);
                        if (unit < 0) {
                            unit += 1;
                        }
                        mCenterPaint.setColor(interpColor(mColors, unit));
                        invalidate();
                    }
                    break;
                case MotionEvent.ACTION_UP:
                    mListener.colorChanged(mCenterPaint.getColor());
                    if (mTrackingCenter) {
                        mTrackingCenter = false;
                        invalidate();
                    }
                    break;
            }
            return true;
        }
    }
    



    • Partager sur Facebook
    • Partager sur Twitter

    ColorPickerView dans une Dialog box

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown