0

我正在尝试在 TextView 下画一条线(创建一个橡胶桥记分表,其中有问题的线反映了此处的虚线)。我不知道如何获取最底部 TextView 的位置并使用这些数字在正确的位置创建一条线。该行目前远低于 TextView ,它应该在下面,即:

40
——— <---- 我想要这个(接近数字)

40

——— <---- 我明白了(远离数字)

该线确实会根据最底部 TextView 的垂直位置改变位置,所以我认为我成功地检索了它的位置,但不知何故我没有正确使用它来绘制线。

这是获取 TextView 的位置并将其发送到画线方法的代码:

    findViewById(R.id.main).getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    //remove listener
                    if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN )
                        findViewById(R.id.main).getViewTreeObserver()
                                .removeOnGlobalLayoutListener(this);
                    else
                        findViewById(R.id.main).getViewTreeObserver()
                                .removeGlobalOnLayoutListener(this);

                    TextView bottomTextView = (TextView) weGameLayout
                            .getChildAt(weGameLayout.getChildCount() - 1);
                    int[] pos = new int [2];
                    bottomTextView.getLocationOnScreen(pos);
                    int gameLinePosition = pos[1];
                    int height = bottomTextView.getHeight();
                    ((BackgroundLines)findViewById(R.id.background_lines))
                            .addGameLine(gameLinePosition + height - topdiff);
                }
            }
    );

这是画线方法:

public void addGameLine(int position) {
    ShapeDrawable line = new ShapeDrawable(new RectShape());
    gameLines.add(line);
    gameLinePositions.add(position);
    invalidate();
}
@Override
public void onDraw(Canvas canvas) {
    int width = this.getWidth();
    for( int i=0; i < gameLines.size(); ++i ){
        ShapeDrawable gameLine = gameLines.get(i);
        int position = gameLinePositions.get(i);
        gameLine.setBounds(0, position-2, width, position+2);
        gameLine.draw(canvas);
    }
}

让我知道是否有更多信息有用!这似乎是一个微妙的问题,有点难以描述,但我认为我对 android 的布局或绘图管理的无知主要是错误的。

编辑这里的主要布局。它很长,但我认为几乎所有相关的东西都在顶部

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:elevation="4dp"
        android:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        android:background="@drawable/parchment_scroll_background"
        tools:context="com.pianomansb.betterbridgescoresheet.MainActivity">

        <com.pianomansb.betterbridgescoresheet.BackgroundLines
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/background_lines" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="horizontal">

            <LinearLayout
                android:id="@+id/we_column"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <LinearLayout
                    android:id="@+id/we_upper"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/we_text"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_horizontal"
                        android:text="@string/we_text"
                        style="@style/WeTheyFont"/>

                    <LinearLayout
                        android:id="@+id/we_bonus"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:orientation="vertical"
                        android:gravity="bottom">

                    </LinearLayout>

                </LinearLayout>

                <LinearLayout
                    android:id="@+id/we_game"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:orientation="vertical">

                </LinearLayout>

            </LinearLayout>

            <LinearLayout
                android:id="@+id/they_column"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="match_parent"
                android:orientation="vertical">

                <LinearLayout
                    android:id="@+id/they_upper"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:orientation="vertical">

                    <TextView
                        android:id="@+id/they_text"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_horizontal"
                        android:text="@string/they_text"
                        style="@style/WeTheyFont"/>

                    <LinearLayout
                        android:id="@+id/they_bonus"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:orientation="vertical"
                        android:gravity="bottom">

                    </LinearLayout>

                </LinearLayout>

                <LinearLayout
                    android:id="@+id/they_game"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_weight="1"
                    android:orientation="vertical">

                </LinearLayout>

            </LinearLayout>
        </LinearLayout>
    </FrameLayout>
</LinearLayout>
4

1 回答 1

1

听起来您正在尝试比通常的视图布局工具更复杂的东西。我不会告诉你停止尝试这种方式,但我会推荐一种完全不同的方法,它可能对你来说更容易。

我会让整个东西成为一个自定义视图(除非它可能非常高,那么它可能是完全不同的问题。确保你的 View 子类正确地宣传它的首选高度和宽度。

在 onDraw 中,像往常一样在 Canvas 上绘制线条。请注意,您也可以在不需要 TextView 的情况下在 Canvas 上绘制文本。只需使用Canvas.drawText()以您想要的方式定位文本,并使用该方法的Paint参数来调整文本的大小和颜色。

我希望这对你来说是一个更好的策略。

于 2016-02-08T03:25:50.543 回答