Добавление ScrollView нарушает мой CanvasView

У меня есть CanvasView в моем макете фрагмента, который позволяет мне рисовать на экране. Однако при добавлении ScrollingView к макету фрагменты могут прокручиваться, но я больше не могу рисовать. Кто-нибудь знает почему это? Холст находится внутри рамки, внутри прокрутки. Если неясно, что я имею в виду, по сути, я не могу рисовать на холсте, если в том же месте есть и вид прокрутки.

Это мой макет:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.brettrosen.atls.fragments.PrimarySurvey">

<ScrollView
    android:id="@+id/scroll_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.brettrosen.atls.canvas.CanvasView
        android:id="@+id/canvas"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <CheckBox
            android:id="@+id/prearrival_1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_1"
            android:textSize="17sp"
            android:textColor="#FF0000"
            android:layout_marginBottom="30dp"
            />

        <CheckBox
            android:id="@+id/prearrival_2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_2"
            android:textColor="#FF0000"
            android:textSize="17sp"
            android:layout_marginBottom="25dp"
            />


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

            <CheckBox
                android:id="@+id/prearrival_3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/prearrival_3"
                android:textSize="17sp"
                android:textColor="#FF0000"
                />

            <EditText
                android:layout_width="60dp"
                android:layout_height="wrap_content"
                android:inputType="number"
                android:layout_marginBottom="30dp"
                android:hint="kg"
                />

        </LinearLayout>

        <CheckBox
            android:id="@+id/prearrival_4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_4"
            android:textColor="#FF0000"
            android:textSize="17sp"
            />

        <CheckBox
            android:id="@+id/prearrival_5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_5"
            android:textColor="#FF0000"
            android:textSize="17sp"
            />

        <CheckBox
            android:id="@+id/prearrival_6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_6"
            android:textColor="#FF0000"
            android:textSize="17sp"
            />

        <CheckBox
            android:id="@+id/prearrival_7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_7"
            android:textColor="#FF0000"
            />

        <CheckBox
            android:id="@+id/prearrival_8"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_8"
            android:textColor="#FF0000"
            android:textSize="17sp"
            android:layout_marginBottom="30dp"
            />

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

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginLeft="8dp"
                android:text="For Attending level activations:"
                android:textSize="17sp"
                />

            <CheckBox
                android:id="@+id/prearrival_9"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/prearrival_9"
                android:textSize="17sp"
                />

        </LinearLayout>


        <CheckBox
            android:id="@+id/prearrival_10"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_10"
            android:textColor="#FF0000"
            android:textSize="17sp"
            />

        <CheckBox
            android:id="@+id/prearrival_11"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_11"
            android:textColor="#FF0000"
            android:textSize="17sp"
            />

        <CheckBox
            android:id="@+id/prearrival_12"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prearrival_12"
            android:textColor="#FF0000"
            android:textSize="17sp"
            />

    </LinearLayout>

</FrameLayout>

</ScrollView>

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/grey_bar"
        android:layout_alignParentBottom="true"/>

    <ToggleButton
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:background="@drawable/toggle_selector"
        android:textOff=""
        android:textOn=""
        android:id="@+id/drawToggle"
        android:layout_alignTop="@+id/toolbar"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:onClick="onDrawClicked"/>

</RelativeLayout>

РЕДАКТИРОВАТЬ: я пытался переместить мой ScrollView внутри моего FrameLayout (под холстом), но он все еще не работает.

CanvasView.java onDraw ()

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    // Before "drawPath"
    canvas.drawColor(this.baseColor);

    if (this.bitmap != null) {
        canvas.drawBitmap(this.bitmap, 0F, 0F, new Paint());
    }

    for (int i = 0; i < this.historyPointer; i++) {
        Path path   = this.pathLists.get(i);
        Paint paint = this.paintLists.get(i);

        canvas.drawPath(path, paint);
    }

    this.drawText(canvas);

    this.canvas = canvas;
}

2 ответа

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

Вместо этого используйте функции canvas: canvas.translate(offsetx,offsety) {для прокрутки} и canvas.scale(scalexFactor,scaleyFactor) {для масштабирования с увеличением)

в начале вашего холста функция Draw()

Они позволяют вам эмулировать масштабируемый вид прокрутки и работают намного быстрее.

Очевидно, что ваши (x,y) входные значения в переводе и масштабе будут определяться вами с помощью 1) ваших функций событий касания (touch down, touch drag, touch up) {для прокрутки} 2) слушателя пинчгестера {для масштабирования / трансфокации}

С вашим макетом сначала чекбокс перекрывают холст. Попробуйте изменить макет. Я вижу Canvas и могу прокручивать.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.brettrosen.atls.fragments.PrimarySurvey">

<ScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content">


<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <com.example.zzztest2.CanvasView
    android:id="@+id/canvas"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal" />

    <CheckBox
        android:id="@+id/prearrival_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="cc1"
        android:textSize="17sp"
        android:textColor="#FF0000"
        android:layout_marginBottom="30dp"


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