【问题标题】:detect clipping in android TextView检测android TextView中的剪辑
【发布时间】:2009-10-14 01:16:00
【问题描述】:

我的 android 应用程序中有一个 TextView,上面有一个设置的宽度。它目前的重力为“center_horitonzal”和一组 textSize (9sp)。我从 sqlite 数据库中提取值以放在此标签上,并且某些值太大而无法以当前 textSize 放入 TextView。

有没有办法检测 TextView 中的文本将被剪裁?我想检测到这一点,并降低字体直到它适合。 iPhone UILabel 中有一个很好的属性可以处理这个问题,称为“adjustToFit”(它也有最小字体大小),我基本上是在尝试模仿它。

这是我正在使用的 TextView 的示例:

<TextView android:id="@+id/label5" android:layout_width="62px"
            android:layout_height="wrap_content" android:layout_x="257px"
            android:layout_y="169px" android:textSize="9sp" 
            android:textColor="#000"
            android:typeface="sans" android:textStyle="bold"
            android:gravity="center_horizontal" android:lines="1" />

【问题讨论】:

    标签: android


    【解决方案1】:

    我找到了一种使用 TextView 的 Paint 对象来测量文本宽度的方法,然后将其降低到适合我需要的大小。下面是一些示例代码:

        float size = label.getPaint().measureText(item.getTitle());
        while (size > 62) {
            float newSize = label.getTextSize() - 0.5f;
            label.setTextSize(newSize);
            size = label.getPaint().measureText(item.getTitle());
        }
    

    【讨论】:

      【解决方案2】:

      另一种方法(可能是等效的)是这样的:

              TextView title = new TextView(context) {
                  @Override
                  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                      int textsize = 30;
                      setTextSize(textsize);
                      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                      while (getMeasuredHeight() > MeasureSpec.getSize(heightMeasureSpec)) {
                          textsize--;
                          setTextSize(textsize);
                          super.onMeasure(widthMeasureSpec, heightMeasureSpec);
                      }
                  }
              };
      

      只是一个警告,这似乎有效,但我只是将它放在一起 - 可能是一些可以测量 TextView 的边缘情况。

      【讨论】:

      • 我应该在这里补充一点,在使用它之后它只会正确处理某些布局情况,所以这应该只是作为一个起点。如果我能得到更通用的版本,我会在这里发布。
      【解决方案3】:

      我写了这个函数来修剪文本末尾的字母,直到它满足一定的宽度要求。

      0.38 函数正在设置我想用这个文本填充的屏幕比例,在这种情况下,它是 38%,因为我希望它覆盖 ~40%,包括填充。适用于我测试过的案例。

      使用这段代码调用下面的函数

      DisplayMetrics metrics = new DisplayMetrics();
      activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
      
      double maxWidth = (double)metrics.widthPixels*0.38 - 1;
      TextPaint painter = station.getPaint();
      
      String left = item.getLocationName();
      left = trimToLength(painter, left, maxWidth);
      
      
      textView.setText(left);
      

      这是函数

      public String trimToLength(TextPaint painter, String initialText, double width)
      {
          String message = initialText;
          String output = initialText;
      
          float currentWidth = painter.measureText(output);
          while (currentWidth > width)
          {
              message = message.substring(0, message.length()-1);
      
              output = message + "...";
      
              currentWidth = painter.measureText(output);
          }
      
          return output;
      }
      

      【讨论】:

      • 字符串操作比较尴尬。在任何 Java 实现中首先要避免的事情之一是在循环中执行此类字符串操作(子字符串、+)...改用 StringBuilders。
      • 在尝试修剪字符串长度时,您不会处理超长字符串,如果是这样,即使您使用 StringBuilder,该算法也远非最佳
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多