【问题标题】:zooming child views without using View.onDraw and canvas.setMatrix不使用 View.onDraw 和 canvas.setMatrix 缩放子视图
【发布时间】:2023-03-27 12:28:01
【问题描述】:

是否可以在 ViewGroup 或 Layout 上设置矩阵,以便自动影响所有子级?例如,如果你有这样的布局:

  1. MainActivity - 相对布局
    • ViewGroup - 相对布局
    • 图像视图
    • LayeredDrawable

所以应该可以在 ViewGroup 中实现缩放/平移,这样 ImageView 和 LayeredDrawable(ViewGroup 的子级)都会受到影响。我想避免使用 View.OnDraw(在捏缩放的所有示例中都使用)。

有什么想法吗?

【问题讨论】:

  • 对于 ViewGroup 你实际上使用 dispatchDraw 因为 onDraw 默认不被调用
  • 那么在画布上设置的矩阵(onDraw的参数)会在dispatchDraw期间影响所有的孩子吗?
  • 它们将根据矩阵绘制,但它们的边界不会改变
  • 那么可能无法正确处理其中一个孩子上的触摸事件。例如,如果父母说旋转 45 度,那么孩子被正确绘制,但用户仍然需要在 0 度触摸呢?
  • 但请参阅 MotionEvent.transform(Matrix)

标签: android android-layout layout multi-touch pinchzoom


【解决方案1】:

检查 getChildStaticTransformation http://developer.android.com/reference/android/view/ViewGroup.html#getChildStaticTransformation(android.view.View,android.view.animation.Transformation) 这是一个为视图组的每个子级调用的回调,并允许您为子级设置转换

【讨论】:

  • 酷。这看起来很完美。我会检查一下。我为此找到了一个不错的example
  • 顺便说一句,它只会相对于 Matrix 绘制孩子,但仍然不会改变孩子的界限,所以它的卢克覆盖了 dispatchDraw
  • 嗯,实际上在 3.0 之前的 Android 上更改视图边界是您应该始终避免的,因为对于渲染/布局系统来说这是一项非常昂贵的操作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多