android 圖片的 放大 縮小 移動
public class MainActivity extends Activity {
private ImageView imageView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageView);
imageView.setOnTouchListener(new OnTouchListener() {
// 設置開始點
private PointF startPoint = new PointF();
// 設置圖片位置的變換矩陣
private Matrix matrix = new Matrix();
// 設置圖片當前位置的變換矩陣
private Matrix currentMatrix = new Matrix();
// 初始化模式參數
private int mode = 0;
// 無模式
private static final int NONE = 0;
// 拖拉模式
private static final int DRAG = 1;
// 縮放模式
private static final int ZOOM = 2;
// 開啟縮放效果的門檻
private static final float ZOOM_THRESHOLD = 10.0f;
// 開始距離
private float startDistance;
// 中心點
private PointF middlePoint;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mode = DRAG;
// 記錄圖片當前的移動位置
currentMatrix.set(imageView.getImageMatrix());
// 記錄開始坐標
startPoint.set(event.getX(), event.getY());
break;
// 當屏幕上已經有觸點(手指),再有手指按下時觸發該事件
case MotionEvent.ACTION_POINTER_DOWN:
mode = ZOOM;
//得到兩點間的距離
startDistance = getDistance(event);
//如果大于
if(startDistance > ZOOM_THRESHOLD) {
//得到兩點的中間點
middlePoint = getMiddlePoint(event);
// 記錄圖片當前的縮放比例
currentMatrix.set(imageView.getImageMatrix());
}
break;
case MotionEvent.ACTION_MOVE:
if(mode == DRAG) {
// 獲取X軸移動距離
float distanceX = event.getX() - startPoint.x;
// 獲取Y軸移動距離
float distanceY = event.getY() - startPoint.y;
// 在上次移動停止位置的基礎上再進行移動
matrix.set(currentMatrix);
// 實現圖片位置移動
matrix.postTranslate(distanceX, distanceY);
}else if(mode == ZOOM) {
// 結束距離
float endDistance = getDistance(event);
if(endDistance > ZOOM_THRESHOLD) {
// 縮放比例
float scale = endDistance / startDistance;
matrix.set(currentMatrix);
matrix.postScale(scale, scale, middlePoint.x, middlePoint.y);
}
}
break;
case MotionEvent.ACTION_UP:
// 當手指離開屏幕,但屏幕上仍有其他觸點(手指)時觸發該事件
case MotionEvent.ACTION_POINTER_UP:
mode = 0;
break;
}
imageView.setImageMatrix(matrix);
return true;
}
});
}
/**
* 計算兩點之間的距離
*/
public static float getDistance(MotionEvent event) {
//第二個點x、y坐標減去第一個點x、y坐標
float disX = event.getX(1) - event.getX(0);
float disY = event.getY(1) - event.getY(0);
return FloatMath.sqrt(disX * disX + disY * disY);
}
/**
* 計算兩點之間的中間點
*/
public static PointF getMiddlePoint(MotionEvent event) {
float midX = (event.getX(0) + event.getX(1)) /2;
float midY = (event.getY(0) + event.getY(1)) /2;
return new PointF(midX, midY);
}
} </pre><br />
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!