今天下载传智播客黎活明老师的Android视频看了图片拖动和缩放,放上去以后学习用。
package com.example.test_pictrue_move_drag;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
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.widget.ImageView;
public class MainActivity extends Activity {
private ImageView imageView ;
private PointF startPoint = new PointF();
private Matrix matrix = new Matrix() ;
private Matrix saveCurrentMatrix = new Matrix();
// 初始状态
private final static int NONE = 0;
// 拖动
private final static int DRAG = 1;
// 缩放
private final static int ZOOM = 2;
// 记录当前模式
private int MODE = NONE ;
// 计算两点之间的距离
private float startDistance ;
// 计算两点之间的中心点
private PointF midPoint ;
//
private Bitmap bitmap ;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: // 手指按下屏幕
saveCurrentMatrix.set(imageView.getImageMatrix()); // 记录imageView的当前移动位置
startPoint.set(event.getX(), event.getY()); // 记录开始按下的点坐标
MODE = DRAG ;
break;
case MotionEvent.ACTION_POINTER_DOWN: // 屏幕上已经有一个触点,再有一个手指按下屏幕
MODE = ZOOM ;
startDistance = distance(event);
if(startDistance > 10f){
midPoint = mid(event);
saveCurrentMatrix.set(imageView.getImageMatrix());//记录ImageView当前的缩放倍数
}
break ;
case MotionEvent.ACTION_MOVE:
if(MODE == DRAG ){
// 移动距离
float dx = event.getX() - startPoint.x;
float dy = event.getY() - startPoint.y;
matrix.set(saveCurrentMatrix); //在上一次移动位置的基础上进行移动
// 进行拖动
matrix.postTranslate(dx, dy);
} else if (MODE == ZOOM){
float endDis = distance(event);//结束距离
if(endDis > 10f){
float scale = endDis / startDistance;//得到缩放倍数
matrix.set(saveCurrentMatrix);//在上一次缩放位置的基础上进行缩放
matrix.postScale(scale, scale, midPoint.x, midPoint.y);
}
}
break ;
case MotionEvent.ACTION_UP:// 手指离开屏幕
case MotionEvent.ACTION_POINTER_UP: // 有手指离开屏幕,但还屏幕还有触点
MODE = NONE ;
break;
}
imageView.setImageMatrix(matrix);
return true;
}
});
// bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test_20150119100930);
}
/**
* 计算两点之间的距离
* @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);
}
/**
* 计算两点之间的中间点
* @param event
* @return
*/
public static PointF mid(MotionEvent event){
float midX = (event.getX(1) + event.getX(0)) / 2;
float midY = (event.getY(1) + event.getY(0)) / 2;
return new PointF(midX, midY);
}
// /**
// * 横向、纵向居中
// */
// protected void center(boolean horizontal, boolean vertical) {
// Matrix m = new Matrix();
// m.set(matrix);
// RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());
// m.mapRect(rect);
// float height = rect.height();
// float width = rect.width();
// float deltaX = 0, deltaY = 0;
// if (vertical) {
// // 图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下放留空则往下移
// int screenHeight = getResources().getDisplayMetrics().heightPixels;
// if (height < screenHeight) {
// deltaY = (screenHeight - height) / 2 - rect.top;
// } else if (rect.top > 0) {
// deltaY = -rect.top;
// } else if (rect.bottom < screenHeight) {
// deltaY = imageView.getHeight() - rect.bottom;
// }
// }
// if (horizontal) {
// int screenWidth = getResources().getDisplayMetrics().widthPixels;
// if (width < screenWidth) {
// deltaX = (screenWidth - width) / 2 - rect.left;
// } else if (rect.left > 0) {
// deltaX = -rect.left;
// } else if (rect.right < screenWidth) {
// deltaX = screenWidth - rect.right;
// }
// }
// matrix.postTranslate(deltaX, deltaY);
// }
}
xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<ImageView
android:id="@+id/imageView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:contentDescription="@null"
android:layout_centerInParent="true"
android:src="@drawable/test_20150119100930"
android:scaleType="matrix" />
</RelativeLayout>
附件还有一个另一种拖动的实现方式