【问题标题】:How Do Solve Shape round rect too large to be rendered into a texture in android TextBox如何解决形状圆形矩形太大而无法在android TextBox中渲染成纹理
【发布时间】:2017-05-22 15:21:41
【问题描述】:

我为文本视图背景创建了一个形状

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
    android:startColor="#800e1520"
    android:endColor="#801e252f"
    android:angle="45"/>
<padding android:left="7dp"
    android:top="7dp"
    android:right="7dp"
    android:bottom="7dp" />
<corners android:radius="8dp" />

我的文本视图是:

 <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/rel1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="8dp"
        android:background="@drawable/rounded_corners"
        android:gravity="right"
        android:lineSpacingExtra="6dp"
        android:supportsRtl="true"
        android:text="@string/hello_world"
        android:textColor="#FFFFFF" />

当文字像这样短时

但是当文本太大时不显示背景和eclipse logcat显示

Shape round rect too large to be rendered into a texture (424x5884, max=2048x2048)

如何解决? 谢谢你

【问题讨论】:

    标签: android background textbox


    【解决方案1】:

    编辑:最简单的解决方案是去掉圆角。如果去掉圆角并使用简单的矩形,硬件渲染器将不再为背景层创建单个大纹理,也不会再遇到纹理大小限制。


    一个简单的解决方法应该是恢复到该视图的软件渲染:

    View view = findViewById(R.id.textView1);
    view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    

    ...但是我们在这里遇到了类似的问题,我们得到了与您相同的结果,视图(及其子视图)没有渲染。

    您也可以设置视图的图层类型from XML

    <TextView android:layerType="software" />
    

    将 layerType 设置为“none”而不是软件似乎会导致视图绘制,但在我们刚刚尝试的快速测试中,它绘制时没有圆角。

    另一种方法可能是使用不同的方法来渲染圆角矩形,例如

    • 自己在onDraw中剪切和绘制路径
    • 使用PaintDrawable(支持圆角,但必须通过代码设置)
    • 将矩形分成三部分——顶部(圆角)、中间(纯色)和底部(圆角)

    【讨论】:

    • 感谢您的回复,但无法正常工作并清除所有内容,minapi 级别为 11,但您可以举例说明如何使用 ondraw 进行此操作,对不起我的英语不好
    • 是的,该调用的最低 API 级别为 11,但在此之前不存在相关的硬件加速,因此旧版本不需要它。如果您还针对旧版本,XML 方法会更好地工作。但是,似乎这种解决方法可能无法真正解决问题。我会推荐使用“切片”方法:从三个视图构建背景,因此中间部分可以是一个普通的矩形,以避免纹理限制。
    • @MostafaRostami 我已经更新了我的答案,指出您也可以通过移除圆角来解决问题。
    • 是的,这是我的最后一个选择。我删除了圆角并使用了一个简单的矩形。谢谢你的回复,我接受你的回答,谢谢
    • 自定义 onDraw 是更好的方法,因为绘制到画布可以让系统处理如何有效地执行此操作
    【解决方案2】:

    我的解决方案是在画布上绘图。见下文。

    如果您需要做分级等,请查看Shader's, https://developer.android.com/reference/android/graphics/LinearGradient.html 也应该做你需要的。

    /**
     * Created by chris on 04/11/2013
     */
    public class WidgetLinearLayout extends LinearLayout {
    
    //Dither and smooth :)
    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
    private final RectF mBound = new RectF();
    private final float radius;
    
    public WidgetLinearLayout(Context context) {
        this(context, null);
    }
    
    public WidgetLinearLayout(Context context, AttributeSet attrs, int defStyle) {
        this(context, attrs);
    }
    
    public WidgetLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        setBackgroundDrawable(null);
        mPaint.setColor(getResources().getColor(R.color.white));
        mPaint.setStyle(Paint.Style.FILL);
        radius = getResources().getDimension(R.dimen.widget_corner_radius);
        setWillNotDraw(false);
    }
    
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        mBound.set(l, t, r, b);
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRoundRect(mBound, radius, radius, mPaint);
    }
    }
    

    【讨论】:

      【解决方案3】:

      你也可以尝试让你的背景.9.png

      【讨论】:

      • @MostafaRostami 使用 .9.png 时有什么问题。当我有一个比屏幕高 5 倍的 textview 时,我遇到了同样的问题,当我使用 .9.png 时一切正常。
      猜你喜欢
      • 1970-01-01
      • 2012-05-25
      • 2015-08-30
      • 1970-01-01
      • 2018-03-24
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多