android 手势放缩_Android应用中实现手势控制图片缩放的完全攻略

本文详细介绍了如何在Android应用中实现手势控制图片的缩放和平移功能。通过讲解Matrix、GestureDetector和ScaleGestureDetector的使用,以及事件分发机制,展示了如何创建一个可以自由放大、缩小并移动的ZoomImageView。通过实例代码,解释了如何处理图片的边界限制,以及与ViewPager的冲突问题,提供了完整的图片预览解决方案。
摘要由CSDN通过智能技术生成

一、概述现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~

我相信看图的整个步骤,大家或者说用户应该不希望被打断把~~~“我擦,竟然不能放大,什么玩意,卸了~~“ , "我擦,竟然不能移动,留有何用,卸了~~"。

哈~所以对于图片的预览,一来,我们要让用户爽;二来,我们作为开发者,也得知道如何实现~~~

想要做到图片支持多点触控,自由的进行缩放、平移,需要了解几个知识点:Matrix , GestureDetector , ScaleGestureDetector 以及事件分发机制,ps:不会咋办,不会你懂的。

二、Matrix矩阵,看深入了都是3维矩阵的乘啊什么的,怪麻烦的~~

其实这么了解下就行了:

Matrix

数据结构:3维矩阵;

内部存储:new Float[9] ; 内部就是个一维数组,内部9个元素;可以进行setValues(float[] values)进行初始化

每个元素代表的意思:

{

MSCALE_X, MSKEW_X, MTRANS_X,

MSKEW_Y, MSCALE_Y, MTRANS_Y,

MPERSP_0, MPERSP_1, MPERSP_2

};

字面上,应该能看出来哪个代表x方向缩放,哪个代表垂直方向的偏移量吧~~有不认识的3个,没事,请无视。

操作

比如你想要设置matrix的偏移量为200,100

你可以这么写:

Matrix transMatrix = new Matrix();

float[] values = new float[] { 1.0, 0, 200, 0, 1.0, 100, 0, 0, 1.0 };

transMatrix.setValues(values);

如果需要在旋转30度,放大两倍~~

这么写其实怪麻烦的~~

Matrix提供了一些常用的API:例如我们可以这么写:

Matrix transMatrix = new Matrix();

transMatrix.postTranslate(200, 100);

如何获取值:

当然了,我们对一个Matrix进行了各种操作,一会postScale,一会postTranslate;那么现在如何获得当前的缩放比例:

前面说setValues可以初始化,那么getValues就能拿到当前矩阵的值,拿到的是个一维数组,9个元素;再通过下标取对应值就可以。

比如我想知道现在x方向缩放比例:

public final float getScale()

{

scaleMatrix.getValues(matrixValues);

return matrixValues[Matrix.MSCALE_X];

}

好了,知道这些就够了~~

GestureDetector :

嗯,自己看API,能够捕捉到长按、双击什么的;用法会在例子中

ScaleGestureDetector:

嗯,有点像继承来的,其实不是的,独立的一个类~用于检测缩放的手势~~~用法会在例子中

三、实战为了大家更好的理解,我会独立出每个功能,最后再整合到一起~~也方面大家对每个API的使用的学习。

1、自由的缩放

需求:当图片加载时,将图片在屏幕中居中;图片宽或高大于屏幕的,缩小至屏幕大小;自由对图片进行方法或缩小;

代码不是很长,直接贴代码了:

package com.zhy.view;

import android.content.Context;

import android.graphics.Matrix;

import android.graphics.drawable.Drawable;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;

import android.view.ScaleGestureDetector;

import android.view.ScaleGestureDetector.OnScaleGestureListener;

import android.view.View;

import android.view.View.OnTouchListener;

import android.view.ViewTreeObserver;

import android.widget.ImageView;

public class ZoomImageView extends ImageView implements OnScaleGestureListener,

OnTouchListener, ViewTreeObserver.OnGlobalLayoutListener

{

private static final String TAG = ZoomImageView.class.getSimpleName();

public static final float SCALE_MAX = 4.0f;

/**

* 初始化时的缩放比例,如果图片宽或高大于屏幕,此值将小于0

*/

private float initScale = 1.0f;

/**

* 用于存放矩阵的9个值

*/

private final float[] matrixValues = new float[9];

private boolean once = true;

/**

* 缩放的手势检测

*/

private ScaleGestureDetector mScaleGestureDetector = null;

private final Matrix mScaleMatrix = new Matrix();

public ZoomImageView(Context context)

{

this(context, null);

}

public ZoomImageView(Context context, AttributeSet attrs)

{

super(context, attrs);

super.setScaleType(ScaleType.MATRIX);

mScaleGestureDetector = new ScaleGestureDetector(context, this);

this.setOnTouchListener(this);

}

@Override

public boolean onScale(ScaleGestureDetector detector)

{

float scale = getScale();

float scaleFactor = detector.getScaleFactor();

if (getDrawable() == null)

return true;

/**

* 缩放的范围控制

*/

if ((scale < SCALE_MAX && scaleFactor > 1.0f)

|| (scale > initScale && scaleFactor < 1.0f))

{

/**

* 最大值最小值判断

*/

if (scaleFactor * scale < initScale)

{

scaleFactor = initScale / scale;

}

if (scaleFactor * scale > SCALE_MAX)

{

scaleFactor = SCALE_MAX / scale;

}

/**

* 设置缩放比例

*/

mScaleMatrix.postScale(scaleFactor, scaleFactor, getWidth() / 2,

getHeight() / 2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值