Xamarin Android "ScrollView" странное поведение - PullRequest
0 голосов
/ 03 июня 2018

Я создал пользовательский «TextView», чтобы текстовые линии отображались в переопределенном методе OnDraw методом canvas.DrawText.Все было хорошо, пока я не добавил ScrollView:

<LinearLayout
    android:background="#ffffff"
    android:layout_height="200dp"
    android:layout_width="match_parent"
    android:orientation="horizontal">
  <ScrollView
    android:id="@+id/scrollV"
    android:layout_height="match_parent"
        android:layout_width="match_parent">
    <myapp.TextViewJustifiable
        android:id="@+id/textViewJustifiableAlertMessage"
        android:layout_gravity="top"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:lineSpacingExtra="8dp"
        android:textSize="16sp"
        android:textColor="#333333" />
  </ScrollView>
</LinearLayout>

В общем, ScrollView не показывает n-ую строку текста пользовательского TextView!Например, если TextView содержит 20 строк текста, прокручивается только 19 строк, а строка из 20 вообще не отображается!Когда я удаляю метод OnDraw, все в порядке.

Как вы думаете, в чем проблема?

1 Ответ

0 голосов
/ 06 июня 2018

Я использовал метод SetHeight в конце переопределенного метода OnDraw для решения проблемы:

> protected override void OnDraw(Canvas canvas)
>         {
>             float floatCharSpaceSize;
>             float floatWordWidth;
>             float floatEmptySpace;
>             float floatJustifedSpaceSize;
>             float floatLineWidth;
>             float floatTextAreaWidth;
>             float floatWordPositionX;
>             float floatWordPositionY;
>             int intLineEnd;
>             int intLineStart;
>             int intSpaceCount;
>             int intTextHeight;
>             int intRemaindedSpaceSize;
>             Layout layoutTextView;
>             Paint.FontMetrics fontMetrics_Paint;
>             string stringLine;
>             string stringText;
>             string[] stringArrWord;
>             TextPaint textPaint = Paint;
> 
>             textPaint.Color = new Color(CurrentTextColor);
>             textPaint.DrawableState = GetDrawableState();
>             floatTextAreaWidth = MeasuredWidth - (PaddingLeft + PaddingRight);
>             floatCharSpaceSize = textPaint.MeasureText(" ");
>             stringText = Text;
>             floatWordPositionY = TextSize + PaddingTop;
>             layoutTextView = Layout;
> 
>             if (layoutTextView == null)
>             {
>                 return;
>             }
> 
>             fontMetrics_Paint = textPaint.GetFontMetrics();
>             intTextHeight = (int)(Math.Ceiling(fontMetrics_Paint.Bottom - fontMetrics_Paint.Top) *
> LineSpacingMultiplier + layoutTextView.SpacingAdd);
> 
>             for (int intIndexA = 0; intIndexA < layoutTextView.LineCount; intIndexA++)
>             {
>                 intLineStart = layoutTextView.GetLineStart(intIndexA);
>                 intLineEnd = layoutTextView.GetLineEnd(intIndexA);
>                 floatLineWidth = StaticLayout.GetDesiredWidth(Text, intLineStart, intLineEnd, textPaint);
>                 stringLine = Text.Substring(intLineStart, intLineEnd - intLineStart);
> 
>                 if (stringLine[stringLine.Length - 1] == ' ')
>                 {
>                     stringLine = stringLine.Substring(0, stringLine.Length - 1);
>                     floatLineWidth -= floatCharSpaceSize;
>                 }
> 
>                 if (BoolJustify == true && intIndexA < layoutTextView.LineCount - 1)
>                 {
>                     floatEmptySpace = floatTextAreaWidth - floatLineWidth;
>                     intSpaceCount = stringLine.Split(' ').Length - 1;
>                     floatJustifedSpaceSize = (int)(floatEmptySpace / intSpaceCount) + floatCharSpaceSize;
>                     intRemaindedSpaceSize = (int)(((floatEmptySpace / intSpaceCount) - (int)(floatEmptySpace / intSpaceCount)) *
> intSpaceCount);
>                     stringArrWord = stringLine.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
> 
>                     if (IntLangDirection == (int)ApplicationLSchool.LangDirection.LTR)
>                     {
>                         floatWordPositionX = 0;
> 
>                         for (int intIndexB = 0; intIndexB < stringArrWord.Length; intIndexB++)
>                         {
>                             floatWordWidth = StaticLayout.GetDesiredWidth(stringArrWord[intIndexB], textPaint);
> 
>                             canvas.DrawText(stringArrWord[intIndexB], floatWordPositionX, floatWordPositionY, textPaint);
> 
>                             if (intRemaindedSpaceSize > 0)
>                             {
>                                 floatWordPositionX += floatWordWidth + floatJustifedSpaceSize + 1;
> 
>                                 intRemaindedSpaceSize--;
>                             }
>                             else
>                             {
>                                 floatWordPositionX += floatWordWidth + floatJustifedSpaceSize;
>                             }
>                         }
>                     }
>                     else if (IntLangDirection == (int)ApplicationLSchool.LangDirection.RTL)
>                     {
>                         floatWordPositionX = floatTextAreaWidth;
> 
>                         for (int intIndexB = 0; intIndexB < stringArrWord.Length; intIndexB++)
>                         {
>                             floatWordWidth = StaticLayout.GetDesiredWidth(stringArrWord[intIndexB], textPaint);
> 
>                             canvas.DrawText(stringArrWord[intIndexB], floatWordPositionX - floatWordWidth, floatWordPositionY, textPaint);
> 
>                             if (intRemaindedSpaceSize > 0)
>                             {
>                                 floatWordPositionX -= floatWordWidth + floatJustifedSpaceSize + 1;
> 
>                                 intRemaindedSpaceSize--;
>                             }
>                             else
>                             {
>                                 floatWordPositionX -= floatWordWidth + floatJustifedSpaceSize;
>                             }
>                         }
>                     }
>                 }
>                 else
>                 {
>                     if (IntLangDirection == (int)ApplicationLSchool.LangDirection.LTR)
>                     {
>                         canvas.DrawText(stringLine, 0, floatWordPositionY, textPaint);
>                     }
>                     else if (IntLangDirection == (int)ApplicationLSchool.LangDirection.RTL)
>                     {
>                         canvas.DrawText(stringLine, floatTextAreaWidth - floatLineWidth, floatWordPositionY, textPaint);
>                     }
>                 }
> 
>                 floatWordPositionY += intTextHeight;
>             }
> 
>             **SetHeight((int)(floatWordPositionY - TextSize - layoutTextView.SpacingAdd) + PaddingBottom);**
>         }
...