Android Studio中基于Bitmap矩阵定位View及实现坐标平移的最佳方案
实现方案
1. PhotoView上层按Bitmap坐标定位View
核心逻辑是通过PhotoView的显示矩阵,把Bitmap原始坐标映射为PhotoView的视图坐标,再转换到父容器坐标完成定位:
- 第一步获取PhotoView当前的显示矩阵:调用
photoView.getDisplayMatrix()直接获取已封装好的、包含缩放平移变换的当前可用矩阵,无需手动拼接。 - 第二步坐标映射:将Bitmap上的目标原始坐标存入float数组,调用
matrix.mapPoints()完成坐标转换:float[] bitmapPos = new float[]{targetBitmapX, targetBitmapY}; photoView.getDisplayMatrix().mapPoints(bitmapPos); // 此时bitmapPos[0]、bitmapPos[1]为对应PhotoView坐标系内的坐标 - 第三步转换为父容器坐标:获取PhotoView在共同父容器中的偏移量,加上映射后的坐标,再根据需求调整目标View的锚点(比如要中心对齐的话减去目标View宽高的1/2),最终设置目标View的布局参数即可:
int[] photoViewOffset = new int[2]; photoView.getLocationInWindow(photoViewOffset); // 若用相对父容器的坐标可换成getLeft()、getTop() float finalX = bitmapPos[0] + photoViewOffset[0] - targetView.getWidth()/2f; float finalY = bitmapPos[1] + photoViewOffset[1] - targetView.getHeight()/2f; // 更新目标View位置 targetView.setX(finalX); targetView.setY(finalY); - 位置同步:给PhotoView注册
OnMatrixChangedListener,每次矩阵变换(缩放、平移、旋转)时重新计算位置,保证目标View始终钉在Bitmap的对应位置上。
2. ImageView平移动画实现
如果是基于Bitmap坐标的平移,先完成起止点的坐标映射,再用属性动画实现即可:
- 先按照上述坐标转换方法,把Bitmap坐标系下的起始点、终止点都转换为ImageView所在父容器的视图坐标
(startX, startY)、(endX, endY)。 - 用属性动画实现平移,示例代码如下:
val animX = ObjectAnimator.ofFloat(targetImageView, "translationX", startX, endX) val animY = ObjectAnimator.ofFloat(targetImageView, "translationY", startY, endY) AnimatorSet().apply { duration = 300 // 可自定义动画时长 interpolator = AccelerateDecelerateInterpolator() // 可自定义插值器 playTogether(animX, animY) start() } - 特殊场景适配:如果动画过程中PhotoView的矩阵可能发生变化,可改用
ValueAnimator,在动画更新回调中实时计算当前目标坐标,同步更新ImageView位置,避免出现位置偏移。
内容的提问来源于stack exchange,提问作者Saif Jame
相关产品推荐
相关产品推荐

