0

子ビューがあり、軸の負の側に「ピクセル」を持つ円を描くキャンバスが必要です

    canvas.drawCircle(0, 0, 50f, paint);

これを行うには、clipRect を使用します。これは正常に機能し、完全な円が表示されます。ただし、親ビューでrequestLayoutを使用し、子ビューのx、y位置を変更すると、円の負の側面が表示されません。どうすればよいか教えてください

コードは次のとおりです。

    package natan.android.TestCanvas;

    import android.app.Activity;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.RelativeLayout;
    import android.widget.RelativeLayout.LayoutParams;

    public class TestCanvasActivity extends Activity {

        View childView;
        RelativeLayout parentView;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            childView = new View(this)
            {

                @Override
                protected void onDraw(Canvas canvas) {
                    canvas.clipRect(-50, -50, 50, 50,android.graphics.Region.Op.REPLACE);
                    Paint paint = new Paint();
                    paint.setStyle(Paint.Style.FILL);
                    paint.setColor(Color.RED);
                    canvas.drawCircle(0, 0, 50f, paint);
                    super.onDraw(canvas);
                }

            };

            parentView = new RelativeLayout(this);
            parentView.addView(childView);
            LayoutParams layoutParms = (LayoutParams)(childView.getLayoutParams());
            layoutParms.leftMargin=150;
            layoutParms.topMargin=150;
            setContentView(parentView);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            LayoutParams layoutParms = (LayoutParams)(childView.getLayoutParams());
            layoutParms.leftMargin=100;
            layoutParms.topMargin=100;
            parentView.requestLayout();
            return super.onTouchEvent(event);
        }


    }
4

1 に答える 1

0

私はここから取った魂を見つけたと思う

http://www.devdaily.com/java/jwarehouse/android/core/java/android/view/ViewGroup.java.shtml

このコード行を使用すると、問題が修正されました

   parentView.setClipChildren(false);

   parentView.requestLayout();
   parentView.invalidate();

これが他の誰かに役立つことを願っています。誰かがこの問題についてより多くの洞察を持っている場合は、追加してください

完全なコードは次のとおりです。

    public class TestCanvasActivity extends Activity {

        View childView;
        RelativeLayout parentView;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            childView = new View(this)
            {

                @Override
                protected void onDraw(Canvas canvas) {
                                        Paint paint = new Paint();
                    paint.setStyle(Paint.Style.FILL);
                    paint.setColor(Color.RED);
                    canvas.drawCircle(0, 0, 50f, paint);
                    super.onDraw(canvas);
                }

            };






            parentView = new RelativeLayout(this)
            {

                @Override
                protected void onLayout(boolean changed, int l, int t,
                        int r, int b) {
                    // TODO Auto-generated method stub
                    super.onLayout(changed, l, t, r, b);
                }

            };
            parentView.setClipChildren(false);

            parentView.addView(childView);
            parentView.setClipChildren(false);
            LayoutParams layoutParms = (LayoutParams)(childView.getLayoutParams());
            layoutParms.leftMargin=150;
            layoutParms.topMargin=150;

            setContentView(parentView);

        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            LayoutParams layoutParms = (LayoutParams)(childView.getLayoutParams());
            layoutParms.leftMargin=100;
            layoutParms.topMargin=100;

            parentView.requestLayout();
            parentView.invalidate();

            return super.onTouchEvent(event);


        }


    }
于 2012-04-14T10:06:20.600 に答える