2

特定の色で丸みを帯びた長方形を描画しようとしていますが、何も得られません。私はすでにたくさんのグーグルをしました、そしてこのようないくつかの質問を見つけて、それらすべてを読みました。しかし、どれも私の問題を解決しませんでした。なぜ私のonDrawメソッドが呼び出されないのですか?

どんな助けでも大歓迎です。

public class RoundedTagItem extends RelativeLayout {

    Context ctx;
    String colorString;
    int color;

    public RoundedTagItem(Context context) {
        super(context);
        this.ctx = context;
        color = Color.WHITE;
        this.setWillNotDraw(false);
        this.setPadding(10, 0, 10, 0);
    }

    public RoundedTagItem(Context context, String color) {
        super(context);
        this.ctx = context;
        this.colorString = color;
        this.setWillNotDraw(false);
        this.setPadding(10, 0, 10, 0);
    }

    @Override
    protected void onDraw(Canvas canvas) {

       if(colorString != null)
             color = Color.parseColor("#" + colorString);

       int rectValue = 35;
       Log.d("Rounded", "rectValue: " + rectValue);
       RectF rect1 = new RectF(0, 0, rectValue, rectValue);

       Paint paint = new Paint();
       paint.setStrokeWidth(1);
       paint.setStrokeCap(Paint.Cap.ROUND);
       paint.setStyle(Paint.Style.FILL);
       paint.setAntiAlias(true);
       paint.setColor(color);

       canvas.save();
       canvas.drawRoundRect(rect1, 10, 10, paint);
       canvas.restore();

       super.onDraw(canvas);
    }

    public void ChangeBackgroundColor(String colorString) {
        color = Color.parseColor(colorString);
        invalidate();
    }

}

次に、メインクラスのこのカスタムビューにアイコンを配置します。

// add category items to view
LinearLayout categories = (LinearLayout) findViewById(R.id.detailTagImagesLayout);
for(int i = 0; i < item.getCategoryItems().size(); i++) {

    RoundedTagItem v = null;
    if(i == 0) 
        v = new RoundedTagItem(DetailActivity.this, 
                           item.getCategoryItems().get(i).getColorCode());
    else 
        v = new RoundedTagItem(DetailActivity.this);            

    ImageView img = new ImageView(DetailActivity.this);
    img.setImageDrawable(Drawable.createFromPath(
                     item.getCategoryItems().get(i).getLightIconUrl()));
    v.addView(img);

    v.setTag(i);
    v.setOnClickListener(new TagClickListener());               

    categories.addView(v);
}
4

2 に答える 2

1

あなたが作る/修正できるいくつかの改善/問題...

これらの行をコンストラクターに移動できます。

if(colorString != null)
   color = Color.parseColor("#" + colorString);

これcolorStringは決して変わらないので、あなたが今それをしている方法は、呼ばれるたびにそれを計算していますonDraw(そして彼は何度も呼ばれるでしょう)。

次にsuper.onDraw(canvas)、最初の行に移動してください。

3番目に、コンストラクターでLayoutParamsを定義する必要があります。ビューの幅/高さが0の場合、その描画は呼び出されません。

this.setLayoutParams(new LayoutParams(150, 150));

最後に、を使用していることを確認してくださいRoundTagItem。次のようなタグを使用して、このビューをxmlに追加できます。使用しているパッケージは<your.package.RoundTagItem>どこですか( )。このように使用する場合は、必ずとを定義してください。your.packagecom.something.blablalayout_widthlayout_height

findViewById(R.layout.your_root)ルートビューに追加する(を使用して取得する)か、ビューをメインコンテンツとして設定することにより、プログラムでビューを追加することもできます。

RoundedTagItem myView = new RoundedTagItem(this);
setContentView(myView);
于 2012-09-27T08:13:08.430 に答える
0

単純な単一のRelativeLayoutXML(rounded_tag_item.xml)を作成し、カスタムビューを拡張してみてください。

public class RoundedTagItem extends RelativeLayout {

    public RoundedTagItem(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public RoundedTagItem(Context context) {
        super(context);
        init(context);  
    }

    private void init(Context context) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (inflater != null) {       
            RelativeLayout layout = (RelativeLayout) inflater.inflate(R.layout.rounded_tag_item, new RelativeLayout(context));

            // rest of stuff...
        }
    }
}
于 2012-09-27T07:44:38.130 に答える