5

カスタムで線を引こうとしていますViewPathここでは、単一のセグメントだけで単純なものを作成し、そこから作成し、最後にそれを使用して内側に描画することを意図して、PathShapeそれをに貼り付けました。ただし、これは機能しません。ここに私の例を参照してください。ShapeDrawableCanvasonDraw()

package com.example.test;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.PathShape;
import android.util.Log;
import android.view.View;

public class TestView extends View {

    private Path mPath = null;
    private Paint mPaint = null;
    private PathShape mPathShape = null;
    private ShapeDrawable mShapeDrawable = null;

    public TestView(Context context) {
        super(context);
    }

    private void init() {
        int width = this.getWidth() / 2;
        int height = this.getHeight() / 2;

        Log.d("init", String.format("width: %d; height: %d", width, height));

        this.mPath = new Path();
        this.mPath.moveTo(0, 0);
        this.mPath.lineTo(width, height);

        this.mPaint = new Paint();
        this.mPaint.setColor(Color.RED);

        this.mPathShape = new PathShape(this.mPath, 1, 1);

        this.mShapeDrawable = new ShapeDrawable(this.mPathShape);
        this.mShapeDrawable.getPaint().set(this.mPaint);
        this.mShapeDrawable.setBounds(0, 0, width, height);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        // Doing this here because in the constructor we don't have the width and height of the view, yet
        this.init();
    }

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

        Log.d("onDraw", "Drawing");

        // This works, but won't let me do what I'm really trying to do
        canvas.drawLine(0.0f, 0.0f, this.getWidth() / 2.0f, this.getHeight() / 2.0f, this.mPaint);

        // This should work, but does not
        //this.mPathShape.draw(canvas, this.mPaint);

        // This should work, but does not
        //this.mShapeDrawable.draw(canvas);
    }

}

onDraw()メソッドのコメントからわかるように、PathShapeまたはを使用して実際ShapeDrawableに描画することはできません。試してみると何も描かれていません。誰かがその理由を知っていますか?PathCanvas

これをテストしているデバイスはAndroid4.1.1を実行しています。

4

1 に答える 1

13

これには2つの問題があります。

1つ目はPaintスタイルです。デフォルトはですがPaint.Stroke.FILL、行を入力すると何も入力されません。私はこれを追加する必要がありました(ありがとう、Romain Guy):

this.mPaint.setStyle(Paint.Style.STROKE);

2番目の問題は、の標準の高さと幅がPathShape正しくないことです。私はこれに関するドキュメントを読みましたが、正しく理解していませんでした。これは、最初の問題を修正すると明らかになりました。カスタムビューの高さと幅に設定すると(ビュー全体に描画しているため)、これが修正されました。ShapeDrawableまた、一致するようにの境界を変更する必要がありました。

this.mPathShape = new PathShape(this.mPath, this.getWidth(), this.getHeight());

this.mShapeDrawable.setBounds(0, 0, this.getWidth(), this.getHeight());

うまくいけば、これは将来誰か他の人を助けるでしょう。

于 2012-07-20T01:44:58.353 に答える