Добавление 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"
...
..