parent
							
								
									f7dbda1f50
								
							
						
					
					
						commit
						93541d8131
					
				| @ -0,0 +1,266 @@ | ||||
| package io.legado.app.utils | ||||
| 
 | ||||
| import androidx.annotation.IdRes | ||||
| import androidx.constraintlayout.widget.ConstraintLayout | ||||
| import androidx.constraintlayout.widget.ConstraintSet | ||||
| import androidx.transition.TransitionManager | ||||
| 
 | ||||
| 
 | ||||
| class ConstraintUtil(val constraintLayout: ConstraintLayout) { | ||||
| 
 | ||||
|     private var begin: ConstraintBegin? = null | ||||
|     private val applyConstraintSet = ConstraintSet() | ||||
|     private val resetConstraintSet = ConstraintSet() | ||||
| 
 | ||||
|     init { | ||||
|         resetConstraintSet.clone(constraintLayout) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 开始修改 | ||||
|      */ | ||||
|     fun begin(): ConstraintBegin? { | ||||
|         synchronized(ConstraintBegin::class.java) { | ||||
|             if (begin == null) { | ||||
|                 begin = ConstraintBegin() | ||||
|             } | ||||
|         } | ||||
|         applyConstraintSet.clone(constraintLayout) | ||||
|         return begin | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 带动画的修改 | ||||
|      * @return | ||||
|      */ | ||||
|     fun beginWithAnim(): ConstraintBegin? { | ||||
|         TransitionManager.beginDelayedTransition(constraintLayout) | ||||
|         return begin() | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 重置 | ||||
|      */ | ||||
|     fun reSet() { | ||||
|         resetConstraintSet.applyTo(constraintLayout) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 带动画的重置 | ||||
|      */ | ||||
|     fun reSetWidthAnim() { | ||||
|         TransitionManager.beginDelayedTransition(constraintLayout) | ||||
|         resetConstraintSet.applyTo(constraintLayout) | ||||
|     } | ||||
| 
 | ||||
|     inner class ConstraintBegin { | ||||
|         /** | ||||
|          * 清除关系<br></br> | ||||
|          * 注意:这里不仅仅会清除关系,还会清除对应控件的宽高为 w:0,h:0 | ||||
|          * @param viewIds | ||||
|          * @return | ||||
|          */ | ||||
|         fun clear(@IdRes vararg viewIds: Int): ConstraintBegin { | ||||
|             for (viewId in viewIds) { | ||||
|                 applyConstraintSet.clear(viewId) | ||||
|             } | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 清除某个控件的,某个关系 | ||||
|          * @param viewId | ||||
|          * @param anchor | ||||
|          * @return | ||||
|          */ | ||||
|         fun clear(viewId: Int, anchor: Int): ConstraintBegin { | ||||
|             applyConstraintSet.clear(viewId, anchor) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置 margin | ||||
|          * @param viewId 某个控件ID | ||||
|          * @param left marginLeft | ||||
|          * @param top   marginTop | ||||
|          * @param right marginRight | ||||
|          * @param bottom marginBottom | ||||
|          * @return | ||||
|          */ | ||||
|         fun setMargin( | ||||
|             @IdRes viewId: Int, | ||||
|             left: Int, | ||||
|             top: Int, | ||||
|             right: Int, | ||||
|             bottom: Int | ||||
|         ): ConstraintBegin { | ||||
|             setMarginLeft(viewId, left) | ||||
|             setMarginTop(viewId, top) | ||||
|             setMarginRight(viewId, right) | ||||
|             setMarginBottom(viewId, bottom) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置 marginLeft | ||||
|          * @param viewId 某个控件ID | ||||
|          * @param left marginLeft | ||||
|          * @return | ||||
|          */ | ||||
|         fun setMarginLeft(@IdRes viewId: Int, left: Int): ConstraintBegin { | ||||
|             applyConstraintSet.setMargin(viewId, ConstraintSet.LEFT, left) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置 marginRight | ||||
|          * @param viewId 某个控件ID | ||||
|          * @param right marginRight | ||||
|          * @return | ||||
|          */ | ||||
|         fun setMarginRight(@IdRes viewId: Int, right: Int): ConstraintBegin { | ||||
|             applyConstraintSet.setMargin(viewId, ConstraintSet.RIGHT, right) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置 marginTop | ||||
|          * @param viewId 某个控件ID | ||||
|          * @param top marginTop | ||||
|          * @return | ||||
|          */ | ||||
|         fun setMarginTop(@IdRes viewId: Int, top: Int): ConstraintBegin { | ||||
|             applyConstraintSet.setMargin(viewId, ConstraintSet.TOP, top) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置marginBottom | ||||
|          * @param viewId 某个控件ID | ||||
|          * @param bottom marginBottom | ||||
|          * @return | ||||
|          */ | ||||
|         fun setMarginBottom(@IdRes viewId: Int, bottom: Int): ConstraintBegin { | ||||
|             applyConstraintSet.setMargin(viewId, ConstraintSet.BOTTOM, bottom) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置关联关系 left_to_left_of | ||||
|          * @param startId | ||||
|          * @param endId | ||||
|          * @return | ||||
|          */ | ||||
|         fun Left_toLeftOf(@IdRes startId: Int, @IdRes endId: Int): ConstraintBegin { | ||||
|             applyConstraintSet.connect(startId, ConstraintSet.LEFT, endId, ConstraintSet.LEFT) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置关联关系 left_to_right_of | ||||
|          * @param startId | ||||
|          * @param endId | ||||
|          * @return | ||||
|          */ | ||||
|         fun Left_toRightOf(@IdRes startId: Int, @IdRes endId: Int): ConstraintBegin { | ||||
|             applyConstraintSet.connect(startId, ConstraintSet.LEFT, endId, ConstraintSet.RIGHT) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置关联关系 top_to_top_of | ||||
|          * @param startId | ||||
|          * @param endId | ||||
|          * @return | ||||
|          */ | ||||
|         fun Top_toTopOf(@IdRes startId: Int, @IdRes endId: Int): ConstraintBegin { | ||||
|             applyConstraintSet.connect(startId, ConstraintSet.TOP, endId, ConstraintSet.TOP) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置关联关系 top_to_bottom_of | ||||
|          * @param startId | ||||
|          * @param endId | ||||
|          * @return | ||||
|          */ | ||||
|         fun Top_toBottomOf(@IdRes startId: Int, @IdRes endId: Int): ConstraintBegin { | ||||
|             applyConstraintSet.connect(startId, ConstraintSet.TOP, endId, ConstraintSet.BOTTOM) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置关联关系 right_to_left_of | ||||
|          * @param startId | ||||
|          * @param endId | ||||
|          * @return | ||||
|          */ | ||||
|         fun Right_toLeftOf(@IdRes startId: Int, @IdRes endId: Int): ConstraintBegin { | ||||
|             applyConstraintSet.connect(startId, ConstraintSet.RIGHT, endId, ConstraintSet.LEFT) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置关联关系 right_to_right_of | ||||
|          * @param startId | ||||
|          * @param endId | ||||
|          * @return | ||||
|          */ | ||||
|         fun Right_toRightOf(@IdRes startId: Int, @IdRes endId: Int): ConstraintBegin { | ||||
|             applyConstraintSet.connect(startId, ConstraintSet.RIGHT, endId, ConstraintSet.RIGHT) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置关联关系 bottom_to_bottom_of | ||||
|          * @param startId | ||||
|          * @param endId | ||||
|          * @return | ||||
|          */ | ||||
|         fun Bottom_toBottomOf(@IdRes startId: Int, @IdRes endId: Int): ConstraintBegin { | ||||
|             applyConstraintSet.connect(startId, ConstraintSet.BOTTOM, endId, ConstraintSet.BOTTOM) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置关联关系 bottom_to_top_of | ||||
|          * @param startId | ||||
|          * @param endId | ||||
|          * @return | ||||
|          */ | ||||
|         fun Bottom_toTopOf(@IdRes startId: Int, @IdRes endId: Int): ConstraintBegin { | ||||
|             applyConstraintSet.connect(startId, ConstraintSet.BOTTOM, endId, ConstraintSet.TOP) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 为某个控件设置宽度 | ||||
|          * @param viewId | ||||
|          * @param width | ||||
|          * @return | ||||
|          */ | ||||
|         fun setWidth(@IdRes viewId: Int, width: Int): ConstraintBegin { | ||||
|             applyConstraintSet.constrainWidth(viewId, width) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 某个控件设置高度 | ||||
|          * @param viewId | ||||
|          * @param height | ||||
|          * @return | ||||
|          */ | ||||
|         fun setHeight(@IdRes viewId: Int, height: Int): ConstraintBegin { | ||||
|             applyConstraintSet.constrainHeight(viewId, height) | ||||
|             return this | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 提交应用生效 | ||||
|          */ | ||||
|         fun commit() { | ||||
|             applyConstraintSet.applyTo(constraintLayout) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue