0

テキストの周りに非常に滑らかなストロークを作成するペイントを作成することができました。しかし、必要な場所に描画するのに問題があります。主に、TextViewではなくViewを拡張しているという事実を信じていますか?

私の目標は、レイアウト上の任意のテキストに線を引くことができるようにすることです。

DrawView.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);
}

「パディング」は、ストロークの境界線に余分なサイズを追加することです。次に、描画クラスで、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);

理論的には、これは機能するはずです。試してみたところ、LinearLayout で DrawView が一番左のビューであれば見栄えは良かったのですが、TextView の次に DrawView があると部分的に上書きされてしまいました。理由はわかりません:(しかし、これがあなたが始めるのに役立つことを願っています!

于 2013-06-26T00:24:46.387 に答える