Android图片处理:PinchImageView源码解析,刚从阿里、头条面试回来

本文详细解析了Android中PinchImageView的源码,重点介绍了双指缩放和平移的实现,包括内部和外部矩阵的交互,以及在缩放和平移过程中如何处理图片边界和修正位置。文章还指出原代码存在的问题,并给出了惯性滑动的简陋之处。
摘要由CSDN通过智能技术生成

*/

public static Matrix matrixTake(Matrix matrix) {

Matrix result = mMatrixPool.take();

if (matrix != null) {

result.set(matrix);

}

return result;

}

然后去获取内部变换矩阵,并存在 innerMatrix 中。

public Matrix getInnerMatrix(Matrix matrix) {

……

//原图大小

RectF tempSrc = MathUtils.rectFTake(0, 0, getDrawable().getIntrinsicWidth(), getDrawable().getIntrinsicHeight());

//控件大小

RectF tempDst = MathUtils.rectFTake(0, 0, getWidth(), getHeight());

//计算fit center矩阵

matrix.setRectToRect(tempSrc, tempDst, Matrix.ScaleToFit.CENTER);

……

return matrix;

}

MathUtils.rectFTakematrixTake 方法是一样的,只是取出的是 rectF 。关键在于 matrix.setRectToRect 方法,上面已经介绍过了。 继续往下看:

//当前总的缩放比例

float innerScale = MathUtils.getMatrixScale(innerMatrix)[0];

float outerScale = MathUtils.getMatrixScale(mOuterMatrix)[0];

float currentScale = innerScale * outerScale;

这里把内部矩阵的缩放和外部缩放相乘,得到了最终的缩放,内外不影响的设计确实挺好的。 接下来开始计算和进行缩放。

float nextScale = currentScale < MAX_SCALE ? MAX_SCALE : innerScale;

//如果接下来放大大于最大值或者小于fit center值,则取边界

if (nextScale > maxScale) {

nextScale = maxScale;

}

if (nextScale < innerScale) {

nextScale = innerScale;

}

//开始计算缩放动画的结果矩阵

Matrix animEnd = MathUtils.matrixTake(mOuterMatrix);

//计算还需缩放的倍数

animEnd.postScale(nextScale / currentScale, nextScale / currentScale, x, y);

//将放大点移动到控件中心

animEnd.postTranslate(displayWidth / 2f - x, displayHeight / 2f - y);

……

//启动矩阵动画

mScaleAnimator = new ScaleAnimator(mOuterMatrix, animEnd);

mScaleAnimator.start();

这段代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值