Как динамически нарисовать линию в макете Android

Что я сделал:

Рисунок 1

Что я ищу:

фигура 2

Меня не волнует дизайн, но я не знаю, как подключить кнопки к кнопке Main с помощью линий, похожих на второе изображение. Примечание: я создаю кнопки динамически. Таким образом, я не использую XML-файл, так как не знаю, сколько у меня будет строк / кнопок.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second_layout);
    //
    RelativeLayout FirstLayout = (RelativeLayout)findViewById(R.id.second_layou);
    RelativeLayout.LayoutParams parms1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    Button yourButton = new Button(this);
    yourButton.setText("1");
    yourButton.setWidth(2);
    parms1.setMargins(w, h+250, 0, 0);
    FirstLayout.addView(yourButton, parms1);
    //
    RelativeLayout.LayoutParams parms2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    Button yourButton2 = new Button(this);
    yourButton2.setText("2");
    yourButton2.setWidth(2);
    parms2.setMargins(w-300, h+300, 0, 0);
    FirstLayout.addView(yourButton2, parms2);
    // and so on with other buttons

Редактировать:

Первое: когда я попробовал этот ответ, добавив этот код в конце onCreate():

drawView = new DrawView(this);
        drawView.setBackgroundColor(Color.WHITE);
        setContentView(drawView);

показан вид линии, но кнопки исчезли! и я хочу, чтобы линия была проведена от центра MAIN кнопка к центру других кнопок не из фиксированных точек.

Второе: когда я добавляю тот же код перед определением кнопок, я получаю ошибку во время выполнения, и это logcat:

01-29 15:25:25.956 26170-26170/com.example.user.raywenderlich E/AndroidRuntime: FATAL EXCEPTION: main                                                                         Process: com.example.user.raywenderlich, PID: 26170                                                                              java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.user.raywenderlich/com.example.user.raywenderlich.SecondActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.RelativeLayout.addView(android.view.View, android.view.ViewGroup$LayoutParams)' on a null object reference
                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2411)
                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474)
                                                                                    at android.app.ActivityThread.access$800(ActivityThread.java:144)
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                    at android.os.Looper.loop(Looper.java:155)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5696)
                                                                                    at java.lang.reflect.Method.invoke(Native Method)
                                                                                    at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)
                                                                                 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.RelativeLayout.addView(android.view.View, android.view.ViewGroup$LayoutParams)' on a null object reference
                                                                                    at com.example.user.raywenderlich.SecondActivity.onCreate(SecondActivity.java:46)
                                                                                    at android.app.Activity.performCreate(Activity.java:5958)
                                                                                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1129)
                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2474) 
                                                                                    at android.app.ActivityThread.access$800(ActivityThread.java:144) 
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1359) 
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                    at android.os.Looper.loop(Looper.java:155) 
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5696) 
                                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                                    at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1028) 
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:823)

0 ответов

Я действительно нуждался в чем-то подобном и был огорчен, что не было никакого ответа на это

После некоторого поиска и объединения информации я дошел до такого состояния:

Некоторые текстовые изображения связаны изогнутыми линиями


Что я сделал, так это взял FrameLayout, Итак TextViews можно сложить поверх рисунка View, Я сделал нестандартный рисунок View как предлагается в этом уроке: Основы рисования с видами.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/root_layout">

   <com.dev.example.CustomDrawingView
       android:id="@+id/custom_drawing_view"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>

</FrameLayout>

Затем я добавляю TextViews динамически с помощью кода на FrameLayout и использовать Path объекты для рисования линий в CustomDrawingViewот центра к центру каждого TextView:

Path path = new Path();

int x1 = (int) firstView.getX() + firstView.getWidth() / 2;
int y1 = (int) firstView.getY() + firstView.getHeight() / 2;

int x2 = (int) secondView.getX() + secondView.getWidth() / 2;
int y2 = (int) secondView.getY() + secondView.getHeight() / 2;

path.moveTo(x1, y1);
path.lineTo(x2, y2);

Теперь кривая сделана с ответом на этот вопрос: Как нарисовать кривую линию между двумя точками на холсте?

Просто настройте curveRadius в этом ответе иметь разные кривые.

Надеюсь, это поможет кому-то в будущем.


РЕДАКТИРОВАТЬ: Да, и что действительно важно, это только назвать onDraw метод CustomDrawingView после того, как все макеты и виды были отображены. Потому что еще TextView"s getX() & getY() методы по-прежнему возвращают 0, и вы не увидите никаких строк.
Предлагаемая позиция для начала их рисования была в onWindowFocusChanged метод деятельности.

Другие вопросы по тегам