2

ストロークテキスト付きのボタンを開発しました

import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint.Join;
import android.graphics.Paint.Style;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.Button;


public class ButtonStrokeText extends Button
{
    private int strokeColor=Color.TRANSPARENT;
    private int strokeWidth=2;

    public ButtonStrokeText(Context context)
    {
        super(context);
    }
    public ButtonStrokeText(Context context, AttributeSet attrs) 
    {
        super(context, attrs);
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ButtonStrokeText);
        strokeColor=a.getColor(R.styleable.ButtonStrokeText_textStrokeColor, strokeColor);
        strokeWidth=a.getDimensionPixelSize(R.styleable.ButtonStrokeText_textStrokeWidth, strokeWidth);
        a.recycle();
    }
    @Override
    public void onDraw(Canvas canvas)
    {
        final ColorStateList textColor = getTextColors();

        TextPaint paint = getPaint();

        paint.setStyle(Style.STROKE);
        paint.setStrokeJoin(Join.ROUND);
        paint.setStrokeMiter(10);
        setTextColor(strokeColor);
        paint.setStrokeWidth(strokeWidth);

        super.onDraw(canvas);
        paint.setStyle(Style.FILL);

        setTextColor(textColor);
        super.onDraw(canvas);
    }
}

しかし、setTextColor(strokeColor)内にリークがあります。この行のアクティビティがリークされていないとコメントした場合、そうでない場合はリークが発生します。

私の質問は、どうすればこのリークを回避できますか?

4

2 に答える 2

1

あなたの問題はあなたがあなたのをインスタンス化するときだと思いますButtonStrokeText。(アクティビティコンテキスト)getApplicationContext()の代わりに通話で使用します。thisを参照してstrokeColor参照することができます。アクティビティコンテキストはリークを引き起こす可能性があるため、代わりにアプリケーションコンテキストを使用してください。aacontext

于 2013-01-14T12:17:44.117 に答える
0

私はこのリークを使用して解決しました。

@Override
public void invalidate()
{
}

多分それは間違っていますが、それは機能しています)

于 2013-01-15T06:11:36.287 に答える