0

我已经设法创建了在文本周围创建非常平滑的笔触的油漆。但是我无法让它吸引到我需要的地方,主要是我相信我正在扩展 View 而不是 TextView?

我的目标是能够围绕我想要的布局上的任何文本进行描边。

绘图视图.java

    public class DrawView extends View{
        Paint paint = new Paint();
        String text = "Blank";

        public DrawView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);

        }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);


    }

    public DrawView(Context context) {

        super(context);

    }



    public void setText(String text) {
        this.text = text;
     }




    public String getText() {
        return text;
    }

    public void draw(Canvas canvas ) {

        Paint strokePaint = new Paint();
        strokePaint.setARGB(255, 0, 0, 0);
        strokePaint.setTextSize(28);
        //strokePaint.setTypeface(tf);
        strokePaint.setStyle(Paint.Style.STROKE);
        strokePaint.setStrokeJoin(Paint.Join.ROUND);
        strokePaint.setStrokeCap(Paint.Cap.ROUND);
        strokePaint.setStrokeWidth(9);
        strokePaint.setAntiAlias(true);


        Paint textPaint = new Paint();
        textPaint.setARGB(255, 255, 255, 255);
        textPaint.setTextSize(28);
        //textPaint.setTypeface(tf);
        textPaint.setAntiAlias(true);

        canvas.drawText(text, 99, 99, strokePaint);
        canvas.drawText(text, 99, 101, strokePaint);
        canvas.drawText(text, 101, 99, strokePaint);
        canvas.drawText(text, 101, 101, strokePaint);
        canvas.drawText(text, 100, 100, textPaint);

        super.draw(canvas);
    }

}

xml

  <com.shadow.pets.DrawView
        android:id="@+id/energyText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
      />

这个视图覆盖了我的整个 LinearLayout 并且我无法控制它在哪里绘制?如果我扩展 TextView,我根本无法让它工作!

对不起,如果它令人困惑,我知道我一定是偏离了轨道,但已经尝试了几个小时,找不到更清楚的话!

4

1 回答 1

1

我认为问题是现在,你的 DrawView 不“知道”它有多大,所以 Wrap_content 只占用了所有可用空间。您可以通过覆盖 onMeasure() 来解决此问题。您可能希望像这样换行到文本的大小:

@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){
   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   int padding = 10;
   Rect r = new Rect();
   Paint p = new Paint();;
   p.setTextSize(28);
   p.getTextBounds(text, 0, text.length(), r);
   this.setMeasuredDimension(r.right - r.left + padding, 
       r.bottom - r.top + padding);
}

“填充”是为 Stroke 边框添加额外的大小。然后在您的绘图类中,将您的 drawTexts 更改为如下所示:

int padding = 5;
int x = this.getLeft() + padding;
int y = this.getBottom() - padding;
canvas.drawText(text, x - 1, y - 1, strokePaint);
canvas.drawText(text, x - 1, y + 1, strokePaint);
canvas.drawText(text, x + 1, y - 1, strokePaint);
canvas.drawText(text, x + 1, y + 1, strokePaint);
canvas.drawText(text, x, y, textPaint);

从理论上讲,这应该可行。当我尝试它时,只要 DrawView 是 LinearLayout 中最左侧的视图,它看起来就很棒,但是当有一个 TextView 和一个 DrawView 时,它被部分覆盖了。我不知道为什么:(但我希望这有助于你开始!

于 2013-06-26T00:24:46.387 回答