Рисование линии между одной точкой и другой - PullRequest
0 голосов
/ 27 августа 2018

У меня есть собственный вид линии между центральной кнопкой и 12 внешними кнопками, см. Рис.Кодовый блок 1 - это то, что я использую, чтобы получить центральные точки каждой комбинации кнопок.Блок кода 2 - это мой «пользовательский чертеж», который рисует линию между каждым набором центральных точек, всего 12 линий.
Все 12 пользовательских строк находятся внутри XML-файла.Кнопки и линии передаются в открытый класс Drawline, как в двух отдельных массивах.

Я также создал класс, который использует Path для рисования треугольника.это находится в верхнем левом углу моего рисунка.

Что я хочу.

Линия между центрами кнопок, которая останавливается ближе ко второй конечной точке.Я хочу, чтобы линия между точками заканчивалась, как вы видите между кнопками «хрустящий хрустящий» и «баланс».Мне нужна помощь, чтобы найти, как «получить» х, у этой точки.Я также, что поставить стрелки на конце линии.

enter image description here

public class Drawline {
    public void drawLines(List<LineView> mlinesToDraw,ArrayList<Button> buttonsbalance, Context
            context,Button btnbase) {
        float centerXOnImage1;
        double centerYOnImage1;
        float centerXOfImageOnScreen1;
        double centerYOfImageOnScreen1;
        float centerXOnImage2;
        float centerYOnImage2;
        float centerXOfImageOnScreen2;
        float centerYOfImageOnScreen2;
        List<LineView> mLine = mlinesToDraw;
        ArrayList<Button> btns = buttonsbalance;
        PointF pointA;
        PointF pointB;

        for (int i = 0; i < mLine.size(); i++) {
            Button button1 = btns.get(i + 1);  //skip btnx0/btnbase
            centerXOnImage1 = button1.getWidth() / 2;
            centerYOnImage1 = (button1.getHeight()) / 2;//-actionBarHeight)/2;
            centerXOfImageOnScreen1 = button1.getLeft()+ centerXOnImage1;
            centerYOfImageOnScreen1 = button1.getTop() + (centerYOnImage1);

            Button button2 = btnbase;
            centerXOnImage2 = button2.getWidth() / 2;
            centerYOnImage2 = (button2.getHeight()) / 2;//-actionBarHeight)/2;
            centerXOfImageOnScreen2 = button2.getLeft() + centerXOnImage2;
            centerYOfImageOnScreen2 = button2.getTop() + (centerYOnImage2);

            pointA = new PointF(centerXOfImageOnScreen1, (float) centerYOfImageOnScreen1);
            pointB = new PointF(centerXOfImageOnScreen2, (float) centerYOfImageOnScreen2);

            mLine.get(i).setPointA(pointA);
            mLine.get(i).setPointB(pointB);
            mLine.get(i).draw();
        }
    }

Пользовательский класс рисования.

public class LineView extends View {
   private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
   private PointF pointA,pointB;

//    private void init() {
//        paint.setColor(Color.BLACK);
//    }

    public LineView(Context context) {
        super(context);
     //   init();
    }

    public LineView(Context context, AttributeSet attrs) {
        super(context, attrs);
     //   init();
    }

    public LineView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
       // init();
    }
    @SuppressLint("ResourceAsColor")
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int color = R.color.GradientStart;
        paint.setColor(color);
        paint.setAntiAlias(true);
         paint.setStrokeWidth(6);
         canvas.drawLine(pointA.x, pointA.y, pointB.x, pointB.y, paint);
    }
    public void setPointA(PointF point){
            pointA=point;}
    public void setPointB(PointF point){
        pointB=point;}

    public void draw(){
        invalidate();
        requestLayout();
    }}

Я чувствую, что должен быть более легкий способ сделать это, но я еще не нашел это.Я ценю любую помощь.спасибо, Джим

1 Ответ

0 голосов
/ 28 августа 2018

Поскольку я теперь определяю угол каждой внешней кнопки и радиус до точки, я смог получить местоположение с помощью полярных координат.Затем я использовал следующее преобразование, чтобы получить соответствующие координаты x и y.

val x = radius * Math.cos (angle);val y = radius * Math.sin (angle);

Это дало мне альтернативную конечную точку, необходимую для рисования линии.

...