0

Excuses pour le formatage et tel, poster de longue date de lurker. J'ai du mal à faire face à ce problème, la plupart de l'aide que j'ai trouvé des offres avec la trigonométrie, ce qui est quelque chose que je n'ai pas d'expérience. Je dois créer une vue comme celle-ci: Proposed Graphics. J'ai l'arc et l'image d'arrière-plan de la jauge principale mais j'ai besoin d'ajouter les marqueurs de temps que vous voyez, à la fois les formes ovales et les temps. Ils doivent être ajoutés par programme car le nombre de marqueurs peut être de 1 à 28, mais probablement pas plus de 10.Diffuser par programme des marqueurs dessinés autour d'un arc dessiné dans Java Android

J'ai essayé d'utiliser l'angle de balayage pour obtenir la position X/Y de l'extrémité de l'arc (utiliser la division pour définir un angle de balayage croissant pour incrémenter l'arc) et cela a fonctionné pour le premier mais je ne pouvais pas le reproduire pour un autre avec un angle de balayage différent. J'utilise aussi une matrice pour faire tourner l'image du marqueur qui fonctionne plus ou moins, j'ai essayé différentes fonctions de trig pour obtenir le x et le y. Ci-dessous un code: Code de base:

public class Custom_clock extends View 
 
{ 
 
    private Paint mPaint; 
 
    private RectF rectF; 
 
    private int mStrokeWidth; 
 
    private int width; 
 
    private int height; 
 
    private Typeface custom_font; 
 
    private final int MAX = 263; 
 
    private final int START = 138; 
 
    private Bitmap bitmap; 
 
    private Bitmap marker; 
 
    private int scaledSizeNumbers; 
 
    private int scaledSizeLabels; 
 
    private int scaledSizeDose; 
 
    private Matrix matrix = new Matrix(); 
 
    private String hoursMinsLabel = "Minutes"; 
 
    private String hoursMinsNumber = "3"; 
 
    private ArrayList<String>DoseTimes = new ArrayList<>(); 
 

 

 
    public Custom_clock(Context context) 
 
    { 
 
     super(context); 
 
    } 
 

 
    public Custom_clock(Context context, AttributeSet attrs) { 
 
     super(context, attrs); 
 
    } 
 

 
    public Custom_clock(Context context, AttributeSet attrs, int defStyle) { 
 
     super(context, attrs, defStyle); 
 
    } 
 

 
    private void initClock(){ 
 

 
     width = getWidth(); 
 
     height = getHeight(); 
 
     mStrokeWidth = ((width+height)/33); 
 
     custom_font = Typeface.createFromAsset(getResources().getAssets(), "fonts/text_font.ttf"); 
 
     bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.base_arc3); 
 
     marker = BitmapFactory.decodeResource(getResources(), R.drawable.single_marker); 
 
     scaledSizeNumbers = getResources().getDimensionPixelSize(R.dimen.NumberFontSize); 
 
     scaledSizeLabels = getResources().getDimensionPixelSize(R.dimen.LabelFontSize); 
 
     scaledSizeDose = getResources().getDimensionPixelSize(R.dimen.DoseFontSize); 
 
     int scaledMarginWidth = getResources().getDimensionPixelSize(R.dimen.WidthMargin); 
 
     int scaledMarginTop = getResources().getDimensionPixelSize(R.dimen.TopMargin); 
 
     mPaint = new Paint(); 
 
     rectF = new RectF(scaledMarginWidth,scaledMarginTop,getWidth()- scaledMarginWidth,getHeight()); 
 
     DoseTimes.clear(); 
 
     DoseTimes.add("1:00pm"); 
 
     DoseTimes.add("2:00pm"); 
 
     DoseTimes.add("3:00pm"); 
 
     DoseTimes.add("4:00pm"); 
 
     DoseTimes.add("5:00pm"); 
 
    } 
 

 
    private void DrawMainArc(Canvas canvas){ 
 
     Paint paint =new Paint(); 
 
     initClock(); 
 
     canvas.drawBitmap(bitmap,null,rectF,paint); 
 
     mPaint.setColor(getResources().getColor(R.color.light_grey)); 
 
     mPaint.setStyle(Paint.Style.STROKE); 
 
     mPaint.setStrokeWidth(mStrokeWidth+2); 
 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
 
     canvas.drawArc(rectF,START,GetStops(5,MAX)*2,false, mPaint); 
 
    } 
 

 
    private int GetStops(int stops, int max){ 
 
     return max/stops; 
 
    } 
 

 
    @Override 
 
    protected void onDraw(Canvas canvas) 
 
    { 
 
     if(bitmap != null){ 
 
      super.onDraw(canvas); 
 
      DrawMainArc(canvas); 
 
      DrawOutlineArc(canvas); 
 
      DrawHours(canvas); 
 
      DrawHoursLabel(canvas); 
 
      DrawDoseLabel(canvas); 
 
      AddStops(canvas); 
 
     } 
 
    }

marqueur code spécifique tentative: Dessine le premier marqueur assez proche de l'endroit où je veux, mais le reste sont établis et à gauche de plus en plus, seulement 2 sont même visibles. Je sais que la réponse se situe quelque part avec l'angle et peut-être une matrice mais trig> moi.

private void AddStops(Canvas canvas){ 
 
     int stopsNum = DoseTimes.size();//currently 5 
 
     int rotatinalIncrement = MAX/(stopsNum);//currently 54 
 
     int markerAngle = 0; 
 
     double x; 
 
     double y; 
 
     for(int i =0; i <stopsNum; i++){ 
 
      x = (canvas.getWidth()/4) * Math.cos(markerAngle); 
 
      y = (canvas.getWidth()/4) * Math.cos(markerAngle); 
 
      markerAngle = markerAngle +rotatinalIncrement; 
 
      DrawMarker(canvas,markerAngle,(int)x ,(int)y); 
 
     } 
 

 
    } 
 
    private void DrawMarker(Canvas canvas, int Angle, int x, int y){ 
 
     int scaledSize = getResources().getDimensionPixelSize(R.dimen.MarkerSize); 
 
     Bitmap scaled = Bitmap.createScaledBitmap(marker,scaledSize,scaledSize,false); 
 
     matrix.reset(); 
 
     matrix.postTranslate(-canvas.getWidth()/2, -canvas.getHeight()/2); // Centers image 
 
     matrix.postRotate(angle); 
 
     matrix.setRotate(Angle); 
 
     matrix.postTranslate(x, y); 
 
     canvas.drawBitmap(scaled, matrix, null); 
 
    }

Répondre

0

Dans un premier temps, Math.cos et sin argument utilisé dans radians, alors que vous (comme cela semble de la valeur 54) appliquer argument en degrés. Faites simplement markerAngle * Math.Pi/180 ou utilisez la fonction toRadians si elle existe en JavaScript.

Deuxième - pour y coordonner vous devez utiliser sin plutôt que cos