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.
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
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;
}
}
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.