diff --git a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/CircularFlow.java b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/CircularFlow.java index 07f6e413c..450f2ca2d 100644 --- a/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/CircularFlow.java +++ b/constraintlayout/constraintlayout/src/main/java/androidx/constraintlayout/helper/widget/CircularFlow.java @@ -69,12 +69,12 @@ public class CircularFlow extends VirtualLayout { /** * @hide */ - private float[] mAngles = new float[32]; + private float[] mAngles; /** * @hide */ - private int[] mRadius = new int[32]; + private int[] mRadius; /** * @hide @@ -150,7 +150,7 @@ protected void init(AttributeSet attrs) { mReferenceDefaultAngle = a.getFloat(attr, DEFAULT_ANGLE); setDefaultAngle(mReferenceDefaultAngle); } else if (attr == R.styleable.ConstraintLayout_Layout_circularflow_defaultRadius) { - mReferenceDefaultRadius = a.getInt(attr, DEFAULT_RADIUS); + mReferenceDefaultRadius = a.getDimensionPixelSize(attr, DEFAULT_RADIUS); setDefaultRadius(mReferenceDefaultRadius); } } @@ -162,9 +162,11 @@ protected void init(AttributeSet attrs) { public void onAttachedToWindow() { super.onAttachedToWindow(); if (mReferenceAngles != null) { + mAngles = new float[1]; setAngles(mReferenceAngles); } if (mReferenceRadius != null) { + mRadius = new int[1]; setRadius(mReferenceRadius); } if (mReferenceDefaultAngle != null) { @@ -178,41 +180,45 @@ public void onAttachedToWindow() { private void anchorReferences() { mContainer = (ConstraintLayout) getParent(); - ConstraintSet c = new ConstraintSet(); - c.clone(mContainer); - for (int i = 0; i <= mCount; i++) { - int id = mIds[i]; - View view = mContainer.getViewById(id); - - if (view != null) { - int radius = DEFAULT_RADIUS; - float angle = DEFAULT_ANGLE; - - if (i < getRadius().length) { - radius = getRadius()[i]; - } else if (mReferenceDefaultRadius != -1) { - mCountRadius++; - mRadius = getRadius(); - mRadius[mCountRadius - 1] = (int) (radius * myContext.getResources().getDisplayMetrics().density); - radius = getRadius()[i]; - } else { - Log.e("CircularFlow", "Added radius to view with id: " + mMap.get(view.getId())); + for (int i = 0; i < mCount; i++) { + View view = mContainer.getViewById(mIds[i]); + if (view == null) { + continue; + } + int radius = DEFAULT_RADIUS; + float angle = DEFAULT_ANGLE; + + if (mRadius != null && i < mRadius.length) { + radius = mRadius[i]; + } else if (mReferenceDefaultRadius != null && mReferenceDefaultRadius != -1) { + mCountRadius++; + if (mRadius == null) { + mRadius = new int[1]; } + mRadius = getRadius(); + mRadius[mCountRadius - 1] = radius; + } else { + Log.e("CircularFlow", "Added radius to view with id: " + mMap.get(view.getId())); + } - if (i < getAngles().length) { - angle = getAngles()[i]; - } else if (mReferenceDefaultAngle != -1) { - mCountAngle++; - mAngles = getAngles(); - mAngles[mCountAngle - 1] = angle; - angle = getAngles()[i]; - } else { - Log.e("CircularFlow", "Added angle to view with id: " + mMap.get(view.getId())); + if (mAngles != null && i < mAngles.length) { + angle = mAngles[i]; + } else if (mReferenceDefaultAngle != null && mReferenceDefaultAngle != -1) { + mCountAngle++; + if (mAngles == null) { + mAngles = new float[1]; } - c.constrainCircle(view.getId(), mViewCenter, radius, angle); + mAngles = getAngles(); + mAngles[mCountAngle - 1] = angle; + } else { + Log.e("CircularFlow", "Added angle to view with id: " + mMap.get(view.getId())); } + ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) view.getLayoutParams(); + params.circleAngle = angle; + params.circleConstraint = mViewCenter; + params.circleRadius = radius; + view.setLayoutParams(params); } - c.applyTo(mContainer); applyLayoutFeatures(); } @@ -430,7 +436,7 @@ private void addAngle(String angleString) { } if (mCountAngle + 1 > mAngles.length) { - mAngles = Arrays.copyOf(mAngles, mAngles.length * 2); + mAngles = Arrays.copyOf(mAngles, mAngles.length + 1); } mAngles[mCountAngle] = Integer.parseInt(angleString); mCountAngle++; @@ -451,7 +457,7 @@ private void addRadius(String radiusString) { } if (mCountRadius + 1 > mRadius.length) { - mRadius = Arrays.copyOf(mRadius, mRadius.length * 2); + mRadius = Arrays.copyOf(mRadius, mRadius.length + 1); } mRadius[mCountRadius] = (int) (Integer.parseInt(radiusString) * myContext.getResources().getDisplayMetrics().density); diff --git a/constraintlayout/constraintlayout/src/main/res/values/attrs.xml b/constraintlayout/constraintlayout/src/main/res/values/attrs.xml index 1b7e5a274..77f5cad9b 100644 --- a/constraintlayout/constraintlayout/src/main/res/values/attrs.xml +++ b/constraintlayout/constraintlayout/src/main/res/values/attrs.xml @@ -265,7 +265,7 @@ - + diff --git a/projects/CarouselExperiments/app/src/main/res/layout/activity_circular_flow_demo.xml b/projects/CarouselExperiments/app/src/main/res/layout/activity_circular_flow_demo.xml index 0dba5f1ad..40afc5a73 100644 --- a/projects/CarouselExperiments/app/src/main/res/layout/activity_circular_flow_demo.xml +++ b/projects/CarouselExperiments/app/src/main/res/layout/activity_circular_flow_demo.xml @@ -77,8 +77,10 @@ android:id="@+id/circularFlow" android:layout_width="match_parent" android:layout_height="match_parent" - app:circularflow_angles="0,40,80,120" - app:circularflow_radiusInDP="90,100,110,120" + app:circularflow_defaultRadius="110dp" + app:circularflow_defaultAngle="45" + app:circularflow_radiusInDP="110, 150, 170, 190" + app:circularflow_angles="10, 40, 80, 135" app:circularflow_viewCenter="@+id/view1" app:constraint_referenced_ids="view2,view3,view4,view5" /> \ No newline at end of file diff --git a/projects/MotionLayoutVerification/app/src/main/res/layout/verification_922.xml b/projects/MotionLayoutVerification/app/src/main/res/layout/verification_922.xml index 98a09a9d6..5f477435f 100644 --- a/projects/MotionLayoutVerification/app/src/main/res/layout/verification_922.xml +++ b/projects/MotionLayoutVerification/app/src/main/res/layout/verification_922.xml @@ -254,7 +254,7 @@ android:id="@+id/circularFlow" android:layout_width="match_parent" android:layout_height="match_parent" - app:circularflow_defaultRadius="140" + app:circularflow_defaultRadius="140dp" app:circularflow_angles="0,0,15,30,45,60,75,90,105,120,135,150,165,180,195,210,225,240,255,270,285,300,315,330,345" app:circularflow_radiusInDP="116" app:circularflow_viewCenter="@id/earth"