Android开发如何让Canvas drawLine绘制线条显示在ImageView下方
问题场景
在Canvas上绘制线条并叠加图片时,当前实现中线条覆盖在图片上层:
预期效果为线条显示在图片下方:
现有实现代码
图片布局XML
<ImageView android:id="@+id/image1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_vertical|center_horizontal" android:background="@drawable/aw" />
视图层布局XML
<ImageView android:id="@+id/i3" android:layout_width="45dp" android:layout_height="45dp"/> <view android:id="@+id/view" class="com.package.DrawCoord" android:layout_width="fill_parent" android:layout_height="fill_parent" />
DrawCoord.kt绘制逻辑
cv.drawColor(Color.TRANSPARENT) cv.drawLine(....)
MainActivity.kt关联逻辑
val p=findViewById<View>(R.id.image1) val x=findViewById<View>(R.id.i3) x.setBackground(p.background)
问题根因
Android框架下,同一容器内的视图渲染Z轴顺序和XML声明顺序一致:后声明的视图会渲染在先声明视图的上层。当前代码中自定义绘制线条的DrawCoord视图在ImageView之后声明,因此线条会覆盖在图片上方。
调整方案
方案1:调整XML声明顺序(推荐,无版本兼容问题)
将DrawCoord视图的声明移动到ImageView之前,让绘制线条的视图处于更低的渲染层级,调整后的视图层XML代码如下:<!-- 先声明绘制线条的自定义视图,处于下层 --> <view android:id="@+id/view" class="com.package.DrawCoord" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <!-- 后声明图片视图,处于上层 --> <ImageView android:id="@+id/i3" android:layout_width="45dp" android:layout_height="45dp"/>该方案仅在两个视图同属FrameLayout、ConstraintLayout这类支持叠放的布局容器时生效,如果使用LinearLayout等线性排列布局,需要先将两个视图放入FrameLayout容器中再调整顺序。
方案2:设置视图Z轴高度(适配Android 5.0及以上版本)
无需修改XML顺序,直接在代码中给ImageView设置更高的Z轴海拔,强制让图片浮在绘制视图上方,在MainActivity.kt中补充一行代码即可:val p=findViewById<View>(R.id.image1) val x=findViewById<View>(R.id.i3) x.setBackground(p.background) // 设置8dp的Z轴高度,值只要大于DrawCoord视图的elevation即可 x.elevation = 8f * resources.displayMetrics.density
内容的提问来源于stack exchange,提问作者gekomad
相关产品推荐
相关产品推荐

