Android图片的拖拽与缩放

图片的缩放就涉及到计算两点之间的距离来得到缩放比,调用矩阵方法来达到缩放的效果。

示例代码:http://download.csdn.net/detail/wwj_748/7324363

package com.wwj.dragscale;

import android.app.Activity;

import android.graphics.Matrix;

import android.graphics.PointF;

import android.os.Bundle;

import android.util.FloatMath;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnTouchListener;

import android.widget.ImageView;

/**

  • 对图片进行拖拽和缩放

  • @author wwj

*/

public class MainActivity extends Activity {

private ImageView imageView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

imageView = (ImageView) findViewById(R.id.imageView);

imageView.setOnTouchListener(new TouchListener());

}

private class TouchListener implements OnTouchListener {

private PointF startPoint = new PointF();

private Matrix matrix = new Matrix();

private Matrix currentMaritx = new Matrix();

private int mode = 0; // 用于标记模式

private static final int DRAG = 1; // 拖动

private static final int ZOOM = 2; // 放大

private float startDis = 0;

private PointF midPoint; // 中心点

@Override

public boolean onTouch(View v, MotionEvent event) {

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

case MotionEvent.ACTION_DOWN:

mode = DRAG; // 拖拽

currentMaritx.set(imageView.getImageMatrix()); // 记录ImageView当前移动位置

startPoint.set(event.getX(), event.getY()); // 开始点

break;

case MotionEvent.ACTION_MOVE:// 移动事件

if (mode == DRAG) { // 图片拖动事件

float dx = event.getX() - startPoint.x; // x轴移动距离

float dy = event.getY() - startPoint.y;

matrix.set(currentMaritx); // 在当前的位置基础上移动

matrix.postTranslate(dx, dy);

} else if (mode == ZOOM) { // 图片放大事件

float endDis = distance(event); // 结束距离

if (endDis > 10f) {

float scale = endDis / startDis; // 放大倍数

matrix.set(currentMaritx);

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

}

}

break;

case MotionEvent.ACTION_UP:

mode = 0;

break;

// 有手指离开屏幕,但屏幕还有触点(手指)

case MotionEvent.ACTION_POINTER_UP:

mode = 0;

break;

// 当屏幕上已经有触点(手指),再有一个手指压下屏幕

case MotionEvent.ACTION_POINTER_DOWN:

mode = ZOOM;

startDis = distance(event);

if (startDis > 10f) { // 避免手指上有两个

midPoint = mid(event);

currentMaritx.set(imageView.getImageMatrix()); // 记录当前的缩放倍数

}

break;

}

// 显示缩放后的图片

imageView.setImageMatrix(matrix);

return true;

}

}

/**

  • 计算两点之间的距离

  • @param event

  • @return

*/

public static float distance(MotionEvent event) {

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

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

return FloatMath.sqrt(dx * dx + dy * dy);

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值