Рисует линию между центральными точками кнопок, не может найти центры - PullRequest
0 голосов
/ 04 ноября 2018

В макете ограничений у меня есть столбец из 6 кнопок. они связаны друг с другом, и верхняя кнопка ограничена панелью действий, а нижняя кнопка ограничена направляющей чуть выше навигационной панели. Слева от колонки у меня есть еще одна кнопка. Я нарисовал линии между двумя наборами кнопок - см. Рис.

enter image description here

Строки получены из пользовательского представления и добавлены в мой xml. Вот часть кода внутри моего пользовательского представления, которое рисует линии.

public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int color = ContextCompat.getColor(getContext(), R.color.GradientStart);
    paint.setColor(color);
    paint.setAntiAlias(true);

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

Моя проблема в том, что я не могу получить начальную и конечную точки в центре каждой кнопки. Либо кнопки сместились вверх, либо линии сместились вниз.

Вот мой xml для кнопок. Я добавил только верхнюю и нижнюю часть и несколько средних кнопок. Все средние кнопки имеют одинаковый xml

<com.example.android.cop1803.LayoutCustom xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mylayoutcustom"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
tools:context="com.example.android.cop1803.MainActivity"
android:fitsSystemWindows="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:layout_editor_absoluteY="73dp">
<!---->
<com.example.android.cop1803.MyViewbutton
    android:id="@+id/MainCOPbtn"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginBottom="8dp"
    app:layout_constraintBottom_toBottomOf="@id/guideline2"
    app:layout_constraintDimensionRatio="1:1"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.14"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/guideline"
    app:layout_constraintWidth_default="wrap"
    app:layout_constraintWidth_max="@dimen/max"
    app:layout_constraintHeight_max="@dimen/max" 
<com.example.android.cop1803.MyViewbutton>

    android:id="@+id/x21"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@drawable/copbutton"
    app:layout_constraintBottom_toTopOf="@+id/x22"
    app:layout_constraintDimensionRatio="1:1"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.4"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/guideline"
    app:layout_constraintVertical_chainStyle="spread"
    app:layout_constraintWidth_default="wrap"
    app:layout_constraintWidth_max="@dimen/maxsmall"
    app:layout_constraintHeight_max="@dimen/maxsmall"/>

<com.example.android.cop1803.MyViewbutton
    android:id="@+id/x22"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@drawable/copbutton"
    app:layout_constraintBottom_toTopOf="@+id/x23"
    app:layout_constraintDimensionRatio="1:1"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.4"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/x21"
    app:layout_constraintWidth_default="wrap"
    app:layout_constraintWidth_max="@dimen/maxsmall"/>

<com.example.android.cop1803.MyViewbutton
    android:id="@+id/x23"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@drawable/copbutton"
    app:layout_constraintBottom_toTopOf="@id/x24"
    app:layout_constraintDimensionRatio="1:1"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.4"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/x22"
    app:layout_constraintWidth_default="wrap"
    app:layout_constraintWidth_max="@dimen/maxsmall"/>

<com.example.android.cop1803.MyViewbutton
    android:id="@+id/x27"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@drawable/copbutton"
    app:layout_constraintBottom_toBottomOf="@id/guideline2"
    android:layout_marginBottom="8dp"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.4"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/x26"
    app:layout_constraintDimensionRatio="1:1"
    app:layout_constraintWidth_default="wrap"
    app:layout_constraintWidth_max="@dimen/maxsmall"/>

Вот код, где я нахожу центральные точки

 public void drawLines(List<LineView> mlinesToDraw) {
            int[] viewALocationInWindow = new int[2];
            int[] viewBLocationInWindow = new int[2];

            vBtn1.getLocationInWindow(viewALocationInWindow);
            vBtn2.getLocationInWindow(viewBLocationInWindow);

            int[] viewALocationOnScreen = new int[2];
            int[] viewBLocationOnScreen = new int[2];

            vBtn1.getLocationOnScreen(viewALocationOnScreen);
            vBtn2.getLocationOnScreen(viewBLocationOnScreen);

            float Ax = vBtn1.getX();
            float Ay = vBtn1.getY();
            float Bx = vBtn2.getX();;
            float By = vBtn2.getY();

            final int lineStartX = ((ConstraintLayout.LayoutParams) vBtn1.getLayoutParams()).leftMargin + (vBtn1.getMeasuredWidth() / 2)+vBtn1.getLeft();
            final int lineStartY = ((ConstraintLayout.LayoutParams) vBtn1.getLayoutParams()).topMargin + (vBtn1.getMeasuredHeight() / 2)+vBtn1.getTop();
            final int lineEndX = ((ConstraintLayout.LayoutParams) vBtn2.getLayoutParams()).leftMargin + (vBtn2.getMeasuredWidth() / 2)+vBtn2.getLeft();
            final int lineEndY = ((ConstraintLayout.LayoutParams) vBtn2.getLayoutParams()).topMargin + (vBtn2.getMeasuredHeight() / 2)+vBtn2.getTop();

        pointA=new PointF(lineStartX,  lineStartY);
        pointB=new PointF(lineEndX,lineEndY);
        mLine.get(i).setPointA(pointA);
        mLine.get(i).setPointB(pointB);
    } }

Я прикрепил 'getViewTreeObserver (). AddOnGlobalLayoutListener' к своему основному макету, поэтому кнопки уже отрисованы до того, как я начну рисовать линии.

Любая помощь, которую вы можете предложить в поиске виновника, очень ценится.

1 Ответ

0 голосов
/ 04 ноября 2018

Непонятно, какой набор координат вы используете. Судя по всему, значения x верны, но значения y отключены. (Вы вычисляете координаты экрана и используете их для рисования? Это даст вам правильные x значения, но неправильные y значения.) Убедитесь, что ваши координаты drawLine() установлены правильно: вычисления для x идет к x координате и то же самое для y.

Также не ясно, что происходит в LayoutCustom, поэтому что-то может происходить там. Любые переводы координат могут сбить вас с толку.

Вот краткий пример, который может помочь вам в зависимости от вашего макета. Я использую View.setForeground() (API 23+) для записи на холст, но концепция остается прежней.

enter image description here

activity_main.xml

<android.support.constraint.ConstraintLayout 
    android:id="@+id/mylayoutcustom"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:fitsSystemWindows="true">

    <Button
        android:id="@+id/MainCOPbtn"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="@id/guideline2"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_max="@dimen/max"
        app:layout_constraintHorizontal_bias="0.14"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/guideline"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintWidth_max="@dimen/max" />

    <Button
        android:id="@+id/x21"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_blue_light"
        app:layout_constraintBottom_toTopOf="@+id/x22"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHeight_max="@dimen/maxsmall"
        app:layout_constraintHorizontal_bias="0.4"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/guideline"
        app:layout_constraintVertical_chainStyle="spread"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintWidth_max="@dimen/maxsmall" />

    <Button
        android:id="@+id/x22"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_blue_light"
        app:layout_constraintBottom_toTopOf="@+id/x23"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.4"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/x21"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintWidth_max="@dimen/maxsmall" />

    <Button
        android:id="@+id/x23"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/holo_blue_light"
        app:layout_constraintBottom_toTopOf="@id/x24"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.4"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/x22"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintWidth_max="@dimen/maxsmall" />

    <Button
        android:id="@+id/x24"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:background="@android:color/holo_blue_light"
        app:layout_constraintBottom_toBottomOf="@id/guideline2"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.4"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/x23"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintWidth_max="@dimen/maxsmall" />

    <android.support.constraint.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="16dp" />

    <android.support.constraint.Guideline
        android:id="@+id/guideline2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="382dp" />
</android.support.constraint.ConstraintLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity implements ViewTreeObserver.OnGlobalLayoutListener {
    private ConstraintLayout mLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mLayout = findViewById(R.id.mylayoutcustom);
        findViewById(R.id.mylayoutcustom).getViewTreeObserver()
            .addOnGlobalLayoutListener(this);
    }

    @Override
    public void onGlobalLayout() {
        Button btns[] = new Button[]{
            findViewById(R.id.MainCOPbtn),
            findViewById(R.id.x21),
            findViewById(R.id.x22),
            findViewById(R.id.x23),
            findViewById(R.id.x24)};
        Paint paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStrokeWidth(10);

        mLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);

        Bitmap bmp = Bitmap.createBitmap(mLayout.getWidth(), mLayout.getHeight(),
                                         Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bmp);
        drawCircle(canvas, btns[0], paint);
        for (int i = 1; i < btns.length; i++) {
            drawLine(canvas, btns[0], btns[i], paint);
        }
        BitmapDrawable d = new BitmapDrawable(getResources(), bmp);
        mLayout.setForeground(d);
    }

    private void drawLine(Canvas canvas, View fromView, View toView, Paint paint) {
        Point from = getCenter(fromView);
        Point to = getCenter(toView);
        canvas.drawCircle(to.x, to.y, 20, paint);
        canvas.drawLine(from.x, from.y, to.x, to.y, paint);
    }

    private void drawCircle(Canvas canvas, View view, Paint paint) {
        Point center = getCenter(view);
        canvas.drawCircle(center.x, center.y, 20, paint);
    }

    Point getCenter(View view) {
        Point pt = new Point();
        pt.x = (int) (view.getX() + view.getWidth() / 2);
        pt.y = (int) (view.getY() + view.getHeight() / 2);
        return pt;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...