gpt4 book ai didi

android - 如何在Android布局中动态画一条线

转载 作者:太空狗 更新时间:2023-10-29 14:01:53 31 4
gpt4 key购买 nike

我做了什么:

Figure 1

我在找什么:

Figure 2

我不关心设计,但我不知道如何使用类似于第二张图片的线条将按钮连接到主按钮。注意:我正在动态创建按钮。因此,我不使用 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

编辑:

首先:当我尝试 this 时通过在 onCreate() 的末尾添加此代码来回答:

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

显示了线 View ,但按钮不见了!我希望这条线从 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)

最佳答案

我实际上需要类似的东西,但因为没有答案而感到沮丧。

经过一些信息的搜索和组合,我得到了这个状态:

Some textviews connected by curved lines.


我所做的是采用 FrameLayout,因此 TextViews 可以堆叠在绘图 View 之上。我按照本教程中的建议制作了自定义绘图 View:Basic Painting with Views .

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

现在曲线是由这个问题的答案组成的:How to draw a curved line between 2 points on canvas?

只需调整该答案中的 curveRadius 即可获得不同的曲线。

希望这对以后的人有帮助。


编辑:哦,真正重要的是只调用 CustomDrawingViewonDraw 方法 毕竟布局和 View 已显示。因为 TextViewgetX() & getY() 方法仍然返回 0,您将看不到任何行。
建议开始绘制它们的位置是在 Activity 的 onWindowFocusChanged 方法中。

关于android - 如何在Android布局中动态画一条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35072106/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com