ImageView根据手势进行缩放,拖动



package com.example.scale;

import android.content.Context;

import android.graphics.Matrix;

import android.graphics.PointF;

import android.util.AttributeSet;

import android.util.FloatMath;

import android.view.MotionEvent;

import android.widget.ImageView;

/**

* @author wuxif_000   ImageView根据手势进行缩放,拖动........

*

*/

public class TouchImageView extends ImageView {

Matrix matrix = new Matrix();

Matrix savedMatrix = new Matrix();

static final int NONE = 0;

/**

* 对imageView进行上、下、左、右拖动..........

*/

static final int DRAG = 1;

/**

* 对imageView进行缩放...........

*/

static final int ZOOM = 2;

int mode = NONE;

/**

* MotionEvent.ACTION_DOWN的坐标

*/

PointF start = new PointF();

/**

* 第一次感觉到两点的时候,获取两点间的中点坐标,以此点进行缩放,如果是多点触控的话........

*/

PointF mid = new PointF();

/**

* 第一次感觉到两点的时候,两点间的距离

*/

float oldDistance = 1f;

/**

* 对图片进行缩放的最大比例

*/

private  final int  maxScale=5;

public TouchImageView(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction() & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN:

//第一个手指down的时候

matrix.set(getImageMatrix());

savedMatrix.set(matrix);

start.set(event.getX(), event.getY());

mode = DRAG;

break;

case MotionEvent.ACTION_POINTER_DOWN:

//第二个手指down时,两点间的距离.......

oldDistance=spacing(event);

if (oldDistance > 10f) {

matrix.set(savedMatrix);

//保存两点间的中点........

midPoint(mid, event);

//对图片进行缩放

mode = ZOOM;

}

break;

case MotionEvent.ACTION_MOVE:

if(mode==DRAG){

matrix.set(savedMatrix);

//一个手指进行上、下、左、右拖动...........

//x,y移动的距离计算...........

matrix.postTranslate(event.getX() - start.x, event.getY()

- start.y);

}else if(mode==ZOOM){

//对imageView进行缩放........

//两点之间的距离

float newDistance = spacing(event);

//如果两点间的距离>10就进行缩放..........

if (newDistance > 10f) {

matrix.set(savedMatrix);

//缩放最大为5

float f = newDistance / oldDistance;

float scale = f>maxScale?maxScale:f;

//在最初两点间的中点,以该点进行缩放........

matrix.postScale(scale, scale, mid.x, mid.y);

}

}

break;

case MotionEvent.ACTION_UP:

mode=NONE;

//点击事件处理,旋转180度............

if (Math.abs(event.getX()-start.x) < 10 & Math.abs(event.getY()-start.y) < 10) {

matrix.set(savedMatrix);

matrix.postRotate(180, getWidth()/2, getHeight()/2);

}

break;

case MotionEvent.ACTION_POINTER_UP:

mode=NONE;

break;

default:

break;

}

setScaleType(ImageView.ScaleType.MATRIX);

setImageMatrix(matrix);

//return super.onTouchEvent(event);

//要设为true,不然setImageMatrix(matrix)不起作用

//要设为true,不然setImageMatrix(matrix)不起作用

//要设为true,不然setImageMatrix(matrix)不起作用

return true;

}

/**

* 两点的距离 Determine the space between the first two fingers

*/

private float spacing(MotionEvent event) {

float x = event.getX(0) - event.getX(1);

float y = event.getY(0) - event.getY(1);

return FloatMath.sqrt(x * x + y * y);

}

/**

* 两点的中点 Calculate the mid point of the first two fingers

* */

private void midPoint(PointF point, MotionEvent event) {

//1,2的中点是(1+2) /2=1.5

float x = event.getX(0) + event.getX(1);

float y = event.getY(0) + event.getY(1);

point.set(x / 2, y / 2);

}

}

时间: 2024-10-11 04:06:30

ImageView根据手势进行缩放,拖动的相关文章

自定义Imageview控件实现多种手势操作 (拖动、水平缩放、竖直缩放、等比例缩放、双击、长按)

项目中需要使用自定义控件的多种手势操作,之前在网上查阅资料的时候发现能找到的一般是只实现了其中的几种,这次就把我做的控件分享一下,人人为我,我为人人嘛,哈哈! 这个自定义控件实现的主要功能是控件的拖动和缩放(注意:不是对控件中的图片进行操作,话说很多帖子都把这两个混了),其中缩放可以按照三个方向进行,就是水平.竖直和等比例.双击操作只做了一个提示,长按加上了一个简单的弹出菜单. 抱歉的是没有足够的时间写详细注释了,如果跟你需要的功能相同就请直接调用,要是需要改代码就费点神自己读懂代码吧,看不懂的

移动端(手机及平板)禁止用户缩放/拖动网页

禁止缩放 <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> user-scalable=no|yes 设置用户缩放 禁止拖动 document.ontouchmove = function(e){ e.preventDefault(); }; //文档禁止 touchm

roid imageView图片按比例缩放

android:scaleType可控制图片的缩放方式,示例代码如下: 1 <ImageView android:id="@+id/img" 2      android:src="@drawable/logo" 3      android:scaleType="centerInside" 4     android:layout_width="60dip" 5     android:layout_height=&q

自定义ImageVIew 支持手势 拖动、缩放、旋转

import android.content.Context; import android.graphics.Matrix; import android.graphics.PointF; import android.util.AttributeSet; import android.util.FloatMath; import android.view.MotionEvent; import android.widget.ImageView; public class ImageTouch

Android自定义imageview可对图片进行多点缩放和拖动

package com.msstudent.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Matrix; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; i

ImageView图片拖拽缩放控件

1.在父控件为Viewpager的背景实现,所以会处理图片左右滑动和Viewpager滑动 的冲突 package com.example.widget; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.PointF; import androi

Android imageView图片按比例缩放

android:scaleType可控制图片的缩放方式,示例代码如下: [html] view plaincopyprint? <ImageView android:id="@+id/img" android:src="@drawable/logo" android:scaleType="centerInside" android:layout_width="60dip" android:layout_height=&q

Ios 给imageview 添加手势没有反应

道理差不多,简单写写,就是给UIImage所在的UIImageView添加个单击的手势,让用户点击图片时有响应的响应. 有人用个透明的UIButton,感觉有时候不方便. - (void)viewDidLoad { UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)]; imageView.userInteractionEnabled = YES; UITapGestureRe

iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义

1.UIGestureRecognizer 介绍 手势识别在 iOS 中非常重要,他极大地提高了移动设备的使用便捷性. iOS 系统在 3.2 以后,他提供了一些常用的手势(UIGestureRecognizer 的子类),开发者可以直接使用他们进行手势操作. UIPanGestureRecognizer(拖动) UIPinchGestureRecognizer(捏合) UIRotationGestureRecognizer(旋转) UITapGestureRecognizer(点按) UILo