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