4

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

<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)

如何解决?谢谢你

4

3 回答 3

5

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


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

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

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

您还可以从 XML设置视图的图层类型:

<TextView android:layerType="software" />

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

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

  • 自己剪裁和绘制路径onDraw
  • 使用 a PaintDrawable(支持圆角,但必须从代码中设置)
  • 将矩形分成三片——顶部(圆角)、中间(纯色)和底部(圆角)
于 2013-01-28T23:46:07.570 回答
2

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

如果您需要做渐变等Shader,请查看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);
}
}
于 2013-11-04T19:08:59.413 回答
0

您也可以尝试将背景设为.9.png

于 2013-05-16T08:04:49.560 回答