1

更新:添加了更新。请进一步检查。

我试图用我的文本视图(红色部分)来实现这样的目标:

在此处输入图像描述

这是为了得到这样的布局:

在此处输入图像描述

在阅读了一些有关视图如何绘制自己的信息后,我将 TextView 子类化并添加了一些代码,但我无法获得所需的结果。

在我的代码中,文本位于背景中,并且可绘制对象覆盖了它。
我也ShapeDrawable用过PathShape
我能得到的是:

在此处输入图像描述

更新: @malimo 的建议解决了在形状后面绘制文本的问题,但问题仍然存在。
我可以使用 9-patch 解决方案,或者可以绘制位图来掩盖事物,但整个布局将放在一个滚动条内,并且在较小的屏幕上,可能会滚动。
背景是渐变的,不会滚动。因此,当使用蒙版滚动内容时,差异将被清楚地突出显示,这是我不希望发生的事情。

是否有一个选项可以让我决定视图将自身绘制成的整个形状,并使其成为路径而不是矩形?
视图会让我编辑矩形的绘制方式吗?

如果仔细观察,在任何文本视图的右侧,边框都不是直线,而是 45 度斜线。我还希望斜线留下的其余区域是透明的,这样当它在渐变上方滚动时,它看起来还不错。如果可行,我也会将其应用于其他视图(例如该按钮和图像视图)。

是否可以向我提供 TextView 的 Base 类使用的矩形,并修改该形状并将其返回绘制?

我使用的快速而肮脏的代码是这样的:

public class CustomTextView extends TextView{

public CustomTextView(Context context, AttributeSet attribSet) {
    super(context, attribSet);
}

@Override
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);

    Path path = new Path();
    path.moveTo(20, 20);
    path.lineTo(100,20);
    path.lineTo(130, 70);
    path.lineTo(20, 70);
    path.lineTo(20, 20);
    Paint paint = new Paint();
    paint.setColor(Color.RED);
    paint.setStyle(Style.FILL);
    paint.setStrokeWidth(2);
    PathShape pathShape = new PathShape(path,getWidth(),getHeight());

    ShapeDrawable shapeDrawable = new ShapeDrawable(pathShape);
    shapeDrawable.getPaint().set(paint);
    shapeDrawable.setBounds(0, 0, getWidth(), getHeight());

    shapeDrawable.draw(canvas);

}

}

我使用此代码的 XML 如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res/com.example.customviewdemo"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="#FF99FF" >


<com.example.customviewdemo.CustomTextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/customView"
    android:text="Hello, World!" />

</RelativeLayout>

我哪里错了?
还是有更好的方法来解决这个问题?

任何帮助,将不胜感激。

4

1 回答 1

2

只需使用 9 补丁 png (developer.android.com/tools/help/draw9patch.html)作为您的 textView 的背景可绘制,您应该能够达到预期的结果......

(如果您真的想坚持自己的方法,请尝试在调用 'shapeDrawable.draw(canvas);' 之后调用 'super.onDraw(canvas);')

问候

于 2013-09-27T10:47:25.863 回答