代码之家  ›  专栏  ›  技术社区  ›  M. Afrashteh

Xamarin Android“滚动视图”奇怪的行为

  •  1
  • M. Afrashteh  · 技术社区  · 8 年前

    我创建了自定义的“textView”,文本行由canvas.drawText方法在重写的onDraw方法中绘制。在我添加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有20行文本,则只有19行被滚动,20行根本不显示!当我删除ondraw方法时,一切都正常。

    你认为问题出在哪里?

    1 回复  |  直到 8 年前
        1
  •  1
  •   M. Afrashteh    8 年前

    我在重写的ondraw方法的末尾使用setheight方法来解决问题:

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