Android中如何在LinearLayout顶部居中位置通过代码绘制圆形
Android Canvas绘制圆形在LinearLayout顶部居中实现方案
核心计算逻辑很简单,只需要确认两个圆心坐标即可:
- 水平居中:圆心X轴坐标取LinearLayout的可用宽度的1/2
- 顶部对齐:圆心Y轴坐标取圆形自身的半径值,此时圆形顶部刚好和LinearLayout顶部完全贴合,不会超出也不会留空
场景1:自定义绘制View作为LinearLayout首子View(推荐)
这是耦合度最低的实现方式,操作步骤如下:
- 在布局文件中,将你的自定义绘制View放在LinearLayout的第一个子项位置,设置View宽度为
match_parent,高度设置为圆直径的数值或者wrap_content即可 - 在自定义View的
onDraw方法中按如下逻辑绘制:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 先把dp单位的半径转为像素值,此处示例半径为40dp float radius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 40, getResources().getDisplayMetrics()); // 圆心X取当前View宽度的一半,和父LinearLayout宽度一致,天然水平居中 float centerX = getMeasuredWidth() / 2f; // 圆心Y取半径值,圆形顶部刚好贴合View顶部,即LinearLayout的顶部 float centerY = radius; // 执行绘制,yourPaint为你提前初始化好的Paint对象 canvas.drawCircle(centerX, centerY, radius, yourPaint); }
注意:如果需要给圆形预留顶部边距,只需要在centerY的基础上加上对应边距的像素值即可;自定义View的高度需要至少为2倍半径,否则圆形会被裁剪。
场景2:直接在LinearLayout自身绘制
如果不想新增子View,可以直接重写LinearLayout的onDraw方法实现:
- 自定义LinearLayout,在构造方法中开启自身绘制开关:
public CustomLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); // LinearLayout默认关闭自身绘制,需要手动开启 setWillNotDraw(false); }
- 重写
onDraw方法执行绘制:
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float radius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 40, getResources().getDisplayMetrics()); float centerX = getMeasuredWidth() / 2f; float centerY = radius; // 如果LinearLayout设置了paddingTop,需要加上padding值避免被裁剪:centerY = radius + getPaddingTop() canvas.drawCircle(centerX, centerY, radius, yourPaint); }
内容的提问来源于stack exchange,提问作者GFriends
相关产品推荐
相关产品推荐

