1

これらの点から線を引くことができるように、カスタム ビュー (円) の中心座標を取得しようとしています。カスタム ビューは、TableLayoutそれ自体が の中にある の中にありFrameLayoutます。しかし、問題があります - このコードは正しくありません。アドバイスをお願いします。

このメソッドで指定された値は、すべてのデバイスで間違っています。レイアウトのパディング/マージンなどを変更すると、ドットは明らかに移動しますが、このメソッドで指定されたポイントは変更されません。

public float[] getDotCenterLocationOnScreen() {

        int[] location = new int[2];
        getLocationOnScreen(location);

        int xLoc = location[0];
        int yLoc = location[1];

        float xCenter = xLoc + (getWidth()/2);
        float yCenter = yLoc - (getWidth()/2);

        float[] dotCenterLocation =  { xCenter, yCenter };

        return dotCenterLocation;

    }

私のビュークラスのコードのほとんどは次のとおりです。

        // Radius of Dot
        int RADIUS;
        private static final int START_RADIUS = 30;

        // Value of which the Radius is multiplied by to get full width & height of
        // the DotView
        int sizeMultiplier = 4;

        // Define other Objects
        private Paint paint = new Paint();      

        float mTranslateX;
        float mTranslateY;

        public DotView(Context context, AttributeSet attrs) {
            super(context, attrs);

            paint.setAntiAlias(true);
            paint.setStrokeWidth(6f);
            paint.setStyle(Paint.Style.FILL);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setColor(Color.BLACK);

            RADIUS = START_RADIUS;

        }

        public void setRadius(int radius) {
            RADIUS = radius;
            invalidate();
        }

        public int getRadius() {
            return RADIUS;
        }

        public void onDraw(Canvas canvas) {

            super.onDraw(canvas);
            canvas.save();
            canvas.translate(mTranslateX, mTranslateY);
            canvas.drawCircle(0, 0, RADIUS, paint);
            canvas.restore();
        }

        public float[] getDotCenterLocationOnScreen() {

            int[] location = new int[2];
            getLocationOnScreen(location);

            int xLoc = location[0];
            int yLoc = location[1];

            float xCenter = xLoc + (getWidth()/2);
            float yCenter = yLoc - (getWidth()/2);

            float[] dotCenterLocation =  { xCenter, yCenter };

            return dotCenterLocation;

        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            final int dia = START_RADIUS * sizeMultiplier; // Multiplying by 2 makes
                                                            // boundaries exactly the same size a dot.

            int w = resolveSize(dia, widthMeasureSpec);
            int h = resolveSize(dia, heightMeasureSpec);
            setMeasuredDimension(w, h);
            float radius = Math.min(w, h) / 2F;
            mTranslateX = radius;
            mTranslateY = radius;
}

    }
4

0 に答える 0