0

前の質問は次のとおりです: Android でユーザー タッチ イベントを使用してサイズ変更可能な四角形を作成する方法は?

四角形の移動は忘れてください。四角形自体は描画されません。以下は私のコードです。エラーは発生しませんが、四角形や角がまったく見えません。

public class DrawView extends View {
    private Paint paint;
    private ArrayList<ColorBall> colorballs = new ArrayList<ColorBall>();
    private int groupID = -1;
    private int ballID = 0;
    private Canvas canvas;
    Point[] pts = new Point[4];
    int left, top, right, bottom;
    private Bitmap bm;
    private BitmapDrawable bmDrawable;

    public DrawView(Context context) {
        super(context);
        paint = new Paint();
        setFocusable(true);
        canvas = new Canvas();
    }

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

    public DrawView(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        paint = new Paint();
        setFocusable(true);
        canvas = new Canvas();
    }

    // -------------------------------------------------------------------//

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        //super.onDraw(canvas);
        this.setBackgroundColor(Color.LTGRAY);
        paint.setStrokeWidth(5);
        paint.setColor(Color.GREEN);

        if (pts[3] == null) {
            return;
        }
        int left, top, right, bottom;
        left = pts[0].x;
        top = pts[0].y;
        right = pts[0].x;
        bottom = pts[0].y;

        for (int i = 1; i < pts.length; i++) {
            left = left > pts[i].x ? pts[i].x : left;
            top = top > pts[i].y ? pts[i].y : top;
            right = right < pts[i].x ? pts[i].x : right;
            bottom = bottom < pts[i].y ? pts[i].y : bottom;
        }

        paint.setAntiAlias(true);
        paint.setDither(true);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeWidth(5);

        // draw stroke
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.parseColor("#AADB1255"));
        paint.setStrokeWidth(2);

        canvas.drawRect(left + colorballs.get(0).getWidthOfBall() / 2, 
                top + colorballs.get(0).getWidthOfBall() / 2, 
                right + colorballs.get(2).getWidthOfBall() / 2, 
                bottom + colorballs.get(2).getWidthOfBall() / 2, paint);

        //fill the rectangle
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.parseColor("#55DB1255"));
        paint.setStrokeWidth(0);

        canvas.drawRect(left + colorballs.get(0).getWidthOfBall() / 2, 
                top + colorballs.get(0).getWidthOfBall() / 2, 
                right + colorballs.get(2).getWidthOfBall() / 2, 
                bottom + colorballs.get(2).getWidthOfBall() / 2, paint);



        // draw corners
        bm = BitmapFactory.decodeResource(getResources(), R.drawable.circle);
        bmDrawable = new BitmapDrawable(getResources(), bm);

        // draw balls on canvas
        paint.setColor(Color.BLUE);
        paint.setTextSize(15);
        paint.setStrokeWidth(0);

        for (int i = 0; i < colorballs.size(); i++) {
            ColorBall ball = colorballs.get(i);
            canvas.drawBitmap(bmDrawable.getBitmap(), ball.getX(), ball.getY(), paint);
            canvas.drawText("" + (i + 1), ball.getX(), ball.getY(), paint);
        }
    }



}

xml は次のとおりです。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <View
        android:id="@+id/drawview"
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        class="com.example.androiddraw.DrawView" />

</RelativeLayout>

すべての適切なセッターとゲッターを備えた ColorBall クラスがあります。私は何が欠けていますか?

前もって感謝します。

4

1 に答える 1

0

あなたのコードを見ると、「this.setBackgroundColor(Color.LTGRAY);」と呼んでいることがわかります。onDraw メソッドで。これをコンストラクターで設定すると、setBackgroundColor を呼び出すとレイアウトが無効になり、再描画が発生します。再帰的な無効化、描画、無効化、描画の状況に陥る可能性があります。これが役立つかどうかを確認してください。

それでも問題が解決しない場合は、 onDraw メソッドをさらに詳しく調べる必要があります。レイアウト プレビューでコードの一部が適切にレンダリングされるかどうかを確認するために、小さなことから始めてみてください。

もう 1 つの確認事項は、Activity.onCreate() で setContentView(R.layout..) を設定していることを確認することです。ときどき忘れてしまい、なぜ画面に何も表示されないのか不思議に思うことがあります。

最後に、以下のように定義されたカスタム レイアウトをさらに確認しました。たぶん、この構文を試すことができます。

<com.example.androiddraw.DrawView
    android:id="@+id/drawview"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
/>

お役に立てれば。

于 2013-08-30T23:20:23.583 に答える