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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!