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"