Java代码动态修改 ConstraintLayout 内控件布局的辅助类
时间:2022-06-01
本文章向大家介绍Java代码动态修改 ConstraintLayout 内控件布局的辅助类,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
上图
输入图片说明
ConstraintUtil.java
import android.support.annotation.IdRes;
import android.support.constraint.ConstraintLayout;
import android.support.constraint.ConstraintSet;
import android.transition.TransitionManager;
/**
* Created by xiaolei on 2017/9/8.
*/
public class ConstraintUtil
{
private ConstraintLayout constraintLayout;
private ConstraintBegin begin;
private ConstraintSet applyConstraintSet = new ConstraintSet();
private ConstraintSet resetConstraintSet = new ConstraintSet();
public ConstraintUtil(ConstraintLayout constraintLayout)
{
this.constraintLayout = constraintLayout;
resetConstraintSet.clone(constraintLayout);
}
/**
* 开始修改
* @return
*/
public ConstraintBegin begin()
{
synchronized (ConstraintBegin.class)
{
if (begin == null)
{
begin = new ConstraintBegin();
}
}
applyConstraintSet.clone(constraintLayout);
return begin;
}
/**
* 带动画的修改
* @return
*/
public ConstraintBegin beginWithAnim()
{
TransitionManager.beginDelayedTransition(constraintLayout);
return begin();
}
/**
* 重置
*/
public void reSet()
{
resetConstraintSet.applyTo(constraintLayout);
}
/**
* 带动画的重置
*/
public void reSetWidthAnim()
{
TransitionManager.beginDelayedTransition(constraintLayout);
resetConstraintSet.applyTo(constraintLayout);
}
public class ConstraintBegin
{
/**
* 清除关系<br/>
* 注意:这里不仅仅会清除关系,还会清除对应控件的宽高为 w:0,h:0
* @param viewIds
* @return
*/
public ConstraintBegin clear(@IdRes int... viewIds)
{
for (int viewId : viewIds)
{
applyConstraintSet.clear(viewId);
}
return this;
}
/**
* 清除某个控件的,某个关系
* @param viewId
* @param anchor
* @return
*/
public ConstraintBegin clear(int viewId,int anchor)
{
applyConstraintSet.clear(viewId,anchor);
return this;
}
/**
* 为某个控件设置 margin
* @param viewId 某个控件ID
* @param left marginLeft
* @param top marginTop
* @param right marginRight
* @param bottom marginBottom
* @return
*/
public ConstraintBegin setMargin(@IdRes int viewId, int left, int top, int right, int bottom)
{
setMarginLeft(viewId,left);
setMarginTop(viewId,top);
setMarginRight(viewId,right);
setMarginBottom(viewId,bottom);
return this;
}
/**
* 为某个控件设置 marginLeft
* @param viewId 某个控件ID
* @param left marginLeft
* @return
*/
public ConstraintBegin setMarginLeft(@IdRes int viewId, int left)
{
applyConstraintSet.setMargin(viewId, ConstraintSet.LEFT, left);
return this;
}
/**
* 为某个控件设置 marginRight
* @param viewId 某个控件ID
* @param right marginRight
* @return
*/
public ConstraintBegin setMarginRight(@IdRes int viewId, int right)
{
applyConstraintSet.setMargin(viewId, ConstraintSet.RIGHT, right);
return this;
}
/**
* 为某个控件设置 marginTop
* @param viewId 某个控件ID
* @param top marginTop
* @return
*/
public ConstraintBegin setMarginTop(@IdRes int viewId, int top)
{
applyConstraintSet.setMargin(viewId, ConstraintSet.TOP, top);
return this;
}
/**
* 为某个控件设置marginBottom
* @param viewId 某个控件ID
* @param bottom marginBottom
* @return
*/
public ConstraintBegin setMarginBottom(@IdRes int viewId, int bottom)
{
applyConstraintSet.setMargin(viewId, ConstraintSet.BOTTOM, bottom);
return this;
}
/**
* 为某个控件设置关联关系 left_to_left_of
* @param startId
* @param endId
* @return
*/
public ConstraintBegin Left_toLeftOf(@IdRes int startId, @IdRes int endId)
{
applyConstraintSet.connect(startId, ConstraintSet.LEFT, endId, ConstraintSet.LEFT);
return this;
}
/**
* 为某个控件设置关联关系 left_to_right_of
* @param startId
* @param endId
* @return
*/
public ConstraintBegin Left_toRightOf(@IdRes int startId, @IdRes int endId)
{
applyConstraintSet.connect(startId, ConstraintSet.LEFT, endId, ConstraintSet.RIGHT);
return this;
}
/**
* 为某个控件设置关联关系 top_to_top_of
* @param startId
* @param endId
* @return
*/
public ConstraintBegin Top_toTopOf(@IdRes int startId, @IdRes int endId)
{
applyConstraintSet.connect(startId, ConstraintSet.TOP, endId, ConstraintSet.TOP);
return this;
}
/**
* 为某个控件设置关联关系 top_to_bottom_of
* @param startId
* @param endId
* @return
*/
public ConstraintBegin Top_toBottomOf(@IdRes int startId, @IdRes int endId)
{
applyConstraintSet.connect(startId, ConstraintSet.TOP, endId, ConstraintSet.BOTTOM);
return this;
}
/**
* 为某个控件设置关联关系 right_to_left_of
* @param startId
* @param endId
* @return
*/
public ConstraintBegin Right_toLeftOf(@IdRes int startId, @IdRes int endId)
{
applyConstraintSet.connect(startId, ConstraintSet.RIGHT, endId, ConstraintSet.LEFT);
return this;
}
/**
* 为某个控件设置关联关系 right_to_right_of
* @param startId
* @param endId
* @return
*/
public ConstraintBegin Right_toRightOf(@IdRes int startId, @IdRes int endId)
{
applyConstraintSet.connect(startId, ConstraintSet.RIGHT, endId, ConstraintSet.RIGHT);
return this;
}
/**
* 为某个控件设置关联关系 bottom_to_bottom_of
* @param startId
* @param endId
* @return
*/
public ConstraintBegin Bottom_toBottomOf(@IdRes int startId, @IdRes int endId)
{
applyConstraintSet.connect(startId, ConstraintSet.BOTTOM, endId, ConstraintSet.BOTTOM);
return this;
}
/**
* 为某个控件设置关联关系 bottom_to_top_of
* @param startId
* @param endId
* @return
*/
public ConstraintBegin Bottom_toTopOf(@IdRes int startId, @IdRes int endId)
{
applyConstraintSet.connect(startId, ConstraintSet.BOTTOM, endId, ConstraintSet.TOP);
return this;
}
/**
* 为某个控件设置宽度
* @param viewId
* @param width
* @return
*/
public ConstraintBegin setWidth(@IdRes int viewId, int width)
{
applyConstraintSet.constrainWidth(viewId, width);
return this;
}
/**
* 某个控件设置高度
* @param viewId
* @param height
* @return
*/
public ConstraintBegin setHeight(@IdRes int viewId, int height)
{
applyConstraintSet.constrainHeight(viewId, height);
return this;
}
/**
* 提交应用生效
*/
public void commit()
{
applyConstraintSet.applyTo(constraintLayout);
}
}
}
使用
public void onApplyClick(View view)
{
constraintUtil = new ConstraintUtil(constraintLayout);
ConstraintUtil.ConstraintBegin begin = constraintUtil.beginWithAnim();
begin.clear(R.id.button1,R.id.button2,R.id.button3);
begin.Left_toLeftOf(R.id.button1,R.id.main);
begin.Left_toRightOf(R.id.button2,R.id.button1);
begin.Right_toLeftOf(R.id.button2,R.id.button3);
begin.Right_toRightOf(R.id.button3,R.id.main);
begin.setWidth(R.id.button1, ConstraintSet.WRAP_CONTENT);
begin.setWidth(R.id.button2, ConstraintSet.WRAP_CONTENT);
begin.setWidth(R.id.button3, ConstraintSet.WRAP_CONTENT);
begin.setHeight(R.id.button1, ConstraintSet.WRAP_CONTENT);
begin.setHeight(R.id.button2, ConstraintSet.WRAP_CONTENT);
begin.setHeight(R.id.button3, ConstraintSet.WRAP_CONTENT);
begin.commit();
}
- JUC包下的CountDownLatch,CyclicBarrier,Semaphore
- java队列,ArrayBlockingQueue
- 多线程使用wait和notify做生产者消费者模型导致线程全部假死
- 偏执的iOS逆向研究员:收集全版本的macOS iOS+越狱+内核调试
- java 多线程暂停与恢复:suspend,resume
- ArrayList底层实现
- Master-work模式
- Condition控制线程通信:java三个线程循环打印ABC
- java根据wait,notify,synchronize关键字自定义队列
- ActiveMQ几个重要的配置文件
- TiDB 在 Ping++ 金融聚合支付业务中的实践
- 设计模式之装饰模式
- JVM之垃圾回收
- java如何根据二进制流确定图片的类型
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 初试 Open Service Mesh(OSM)
- K8S 生态周报| runc v1.0-rc92 发布
- 聊聊 Python 面试最常被问到的几种设计模式(上)
- 推荐一套个人文档管理系统。
- OpenCV图像读取(imread) 显示(imshow) 保存(imwrite)的冷知识点
- CodeReview实践-Gerrit自动触发JenkinsCI
- OpenCV常用图像拼接方法(一) :直接拼接
- ClickHouse|MergeTree引擎之数据分区
- OpenCV常用图像拼接方法(二) :基于模板匹配拼接
- 为了解决 Prometheus 大内存问题,我竟然强行将 Prometheus Operator 给肢解了。。
- 面试官:webpack原理都不会?
- 算法篇:树之对称二叉树
- 算法篇:树之二叉树的恢复
- 算法篇:树之利用数组处理链表
- 灰子的Go笔记:sync.Map