代码:

package com.example.test;import android.os.Bundle;import android.app.Activity;import android.graphics.Matrix;import android.graphics.PointF;import android.util.FloatMath;import android.view.Menu;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;import android.widget.Space;public class MainActivity extends Activity {private static final int NONE = 0;private static final int DRAG = 1;private static final int ZOOM = 2;private int mode = NONE;private Matrix matrix = new Matrix();private Matrix savedMatrix = new Matrix();private PointF start = new PointF();private PointF mid = new PointF();private float oldDist;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ImageView imageView = (ImageView) findViewById(R.id.img);imageView.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View arg0, MotionEvent arg1) {ImageView view = (ImageView) arg0;switch (arg1.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN:savedMatrix.set(matrix);start.set(arg1.getX(), arg1.getY());System.out.println("---------ACTION_DOWN--->>"+ arg1.getX() + "---" + arg1.getY());mode = DRAG;break;case MotionEvent.ACTION_POINTER_UP:System.out.println("---------ACTION_POINTER_UP--->>"+ arg1.getX() + "---" + arg1.getY());mode = NONE;break;case MotionEvent.ACTION_POINTER_DOWN:oldDist = spacing(arg1);if (oldDist > 10f) {savedMatrix.set(matrix);midPoint(mid, arg1);mode = ZOOM;}break;case MotionEvent.ACTION_MOVE:if (mode == DRAG) {matrix.set(savedMatrix);matrix.postTranslate(arg1.getX() - start.x, arg1.getY()- start.y);} else if (mode == ZOOM) {float newDist = spacing(arg1);if (newDist > 10f) {matrix.set(savedMatrix);float scale = newDist / oldDist;matrix.postScale(scale, scale, mid.x, mid.y);}}break;}view.setImageMatrix(matrix);return true;}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);}private void midPoint(PointF point, MotionEvent event) {float x = event.getX(0) + event.getX(1);float y = event.getY(0) + event.getY(1);point.set(x / 2, y / 2);}});}}

布局:

<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:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <ImageView        android:id="@+id/img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:scaleType="matrix"        android:src="@drawable/test" /></RelativeLayout>


更多相关文章

  1. Android 初学入门代码注释 学习笔记001 16.03.18
  2. android代码实现自动关机
  3. android sdcard 检测代码
  4. 关于Android 相对布局中的属性 的介绍和运用
  5. android WiFi 开关代码
  6. android之布局xml各种控件属性详解
  7. android 怎样用代码设置墙纸
  8. android代码实现ScaleAnimation动画(附原码)
  9. Android apps应用检查更新代码

随机推荐

  1. Android(安卓)SDK之API Level
  2. Android(安卓)安全性和权限
  3. Android(安卓)自带图标库 android.R.draw
  4. Android(安卓)SDK NDK 下载地址
  5. Android(安卓)自带图标库 android.R.draw
  6. android studio_聚焦 Android(安卓)11: A
  7. android text右对齐显示 并且 多余文字显
  8. Android(安卓)Activity Manifest 标签
  9. NDK r9d版本下载
  10. Android(安卓)sdk ndk 下载地址