专业的佛山网站设计,WordPress初始化主题,企业的vi设计系统,seo网站分析Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心#xff0c;Kotlin#xff08;2#xff09; 在 Android ScaleGestureDetector检测双指缩放Bitmap基于Matrix动画移动到双指捏合中心点ImageView区域中心#xff0c;Kotlin-CSDN博客 …Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心Kotlin2 在 Android ScaleGestureDetector检测双指缩放Bitmap基于Matrix动画移动到双指捏合中心点ImageView区域中心Kotlin-CSDN博客 的基础上改进一下实现两根手指在屏幕上捏合缩放时候图片随之缩放。当手指在屏幕上抬离时候画布上呈现的是缩放后的图。 class MyImageView : AppCompatImageView {private var mCenterX 0fprivate var mCenterY 0fprivate val mCirclePaint Paint()private var mSrcBmp: Bitmap? nullprivate var mScaleBmp: Bitmap? null//放大系数。private var mScaleFactor 1fprivate var mScaleGestureDetector: ScaleGestureDetector? nullprivate var mCanDrawScaleBmp falseconstructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {mSrcBmp (drawable as BitmapDrawable).bitmap //mSrcBmp是原始图大小没有缩放和拉伸的。mCirclePaint.style Paint.Style.STROKEmCirclePaint.strokeWidth 10fmCirclePaint.isAntiAlias truemCirclePaint.color Color.REDmScaleGestureDetector ScaleGestureDetector(ctx, object : ScaleGestureDetector.SimpleOnScaleGestureListener() {override fun onScale(detector: ScaleGestureDetector): Boolean {//更新两个手指缩放的中心点。mCenterX detector.focusXmCenterY detector.focusY//if (detector.currentSpan 50 detector.timeDelta 20) {mScaleFactor detector.scaleFactorLog.d(fly, onScaleEnd scaleFactor${detector.scaleFactor})//}updateView()return false}})}private fun updateView() {this.invalidate()}override fun onTouchEvent(event: MotionEvent): Boolean {mScaleGestureDetector?.onTouchEvent(event)when (event.actionMasked) {MotionEvent.ACTION_MOVE - {mCanDrawScaleBmp true}MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL - {//如果抬手时候重新置false没有绘制显示原始底图。//mCanDrawScaleBmp false}}return true}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)if (mCanDrawScaleBmp) {myDraw(canvas)}}private fun myDraw(canvas: Canvas) {mScaleBmp Bitmap.createScaledBitmap(mSrcBmp!!,(this.width * mScaleFactor 1).toInt(), //注意这里的精度损失会造成坐标偏移.(this.height * mScaleFactor 1).toInt(),//注意这里的精度损失会造成坐标偏移.true)val cx this.width / 2fval cy this.height / 2fval matrix Matrix()matrix.setScale(mScaleFactor, mScaleFactor)matrix.setTranslate(cx - mCenterX * mScaleFactor, cy - mCenterY * mScaleFactor)canvas.drawBitmap(mScaleBmp!!, matrix, null)//中心圆圈canvas.drawCircle(cx, cy, 50f, mCirclePaint)}
} 需要改进的地方是滑动缩放过程不是图片缩放不是非常丝滑流畅需要改善。 Android ScaleGestureDetector检测双指缩放Bitmap基于Matrix动画移动到双指捏合中心点ImageView区域中心Kotlin-CSDN博客文章浏览阅读75次点赞3次收藏5次。需要注意的因为在xml布局里面特别设置了ImageView的高度为wrap_content手指在屏幕触点的位置是放大镜里面放大图片后准确圆心位置但是如果ImageView设置成match_parent则因为ImageView里面的Bitmap被缩放(此处Bitmap其实小于ImageView被拉伸了)拉伸后的Bitmap水平方向坐标与ImageView一直重合但竖直方向Bitmap坐标与ImageView不一致会造成一种现象手指触点放大镜放大后水平方向是正确的但竖直方向有偏移量。https://blog.csdn.net/zhangphil/article/details/135705931