0

Entschuldigung für die Formatierung und solche, lange Zeit lurker ersten Mal Poster.Programmatisch verteilt gezeichnete Marker um einen gezeichneten Bogen in Android Java

Ich habe eine harte Zeit mit diesem Problem zu tun, die meisten der "Hilfe" Ich habe Angebote mit Trigonometrie gefunden, die etwas ist, mit dem ich keine Erfahrung habe. Ich muss eine Ansicht wie folgt erstellen: Proposed Graphics. Ich habe den Bogen und und das Hintergrundbild der Hauptanzeige, aber ich muss die Zeitmarken hinzufügen, die Sie sehen, sowohl die ovalähnlichen Formen und die Zeiten. Sie müssen programmatisch hinzugefügt werden, da die Anzahl der Markierungen zwischen 1 und 28 liegen kann, obwohl wahrscheinlich nicht mehr als 10.

Ich habe versucht, den Pfeilwinkel zu verwenden, um die X/Y-Position des Endpunkts des Bogens zu erhalten (Verwenden Sie Division, um einen zunehmenden Pfeilwinkel zu definieren, um den Bogen zu inkrementieren) und es funktionierte für den ersten, aber ich konnte es für keinen anderen mit einem anderen Pfeilwinkel replizieren. Ich verwende auch eine Matrix, um das Markerbild zu drehen, das mehr oder weniger funktioniert, ich habe verschiedene trigonometrische Funktionen versucht, um das x und y zu erhalten. Nachfolgend finden Sie einige Code: Basic-Code:

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

Marker spezifischen Code Versuch: Dies zieht die erste Markierung ziemlich nah an, wo ich es will, aber der Rest erstellt und nach links Zunehmend sind nur noch 2 sichtbar. Ich weiß, die Antwort liegt irgendwo mit dem Winkel und möglicherweise einer Matrix, aber trig> me.

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

Antwort

0

Zuerst Math.cos und sin in Radiant Verwendung Argument, während Sie in Grad gelten Argument (ab Wert 54 scheint). Machen Sie einfach markerAngle * Math.Pi/180 oder verwenden Sie die Funktion wie toRadians, wenn es in JavaScript existiert.

Zweitens - für Y-Koordinate Sie sin verwenden, anstatt cos

Verwandte Themen