android 多点触摸图片缩放的具体实现方法

布局:

复制代码 代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativeLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

<Button
        android:id="@+id/zoom_in"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="zoom_in" />
    <Button
        android:id="@+id/zoom_out"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="zoom_out" />

<ScrollView
        android:id="@+id/imageContainer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@+id/zoom_in"
        android:fadingEdge="none"
        android:scrollbars="none" >

<HorizontalScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_centerHorizontal="true"
            android:fadingEdge="none"
            android:scrollbars="none" >

<ImageView
                android:id="@+id/imageView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:scaleType="matrix" />
        </HorizontalScrollView>
    </ScrollView>

</RelativeLayout>

程序代码:

复制代码 代码如下:
package taokun.demo.MutilTouchDemo;

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.util.Log;

import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;

public class MutilTouchDemoActivity extends Activity implements OnTouchListener, OnClickListener {
   private static final String TAG = "Touch" ;

// These matrices will be used to move and zoom image
   Matrix matrix = new Matrix();
   Matrix savedMatrix = new Matrix();
   PointF start = new PointF();
   PointF mid = new PointF();
   float  oldDist;
   private ImageView view;
   private Button zoomIn, zoomOut;

//button zoom
   private float scaleWidth = 1;
        private float scaleHeight = 1;
        private Bitmap bmp, zoomedBMP;
        private int zoom_level = 0;
        private static final double ZOOM_IN_SCALE = 1.25;//放大系数
        private static final double ZOOM_OUT_SCALE = 0.8;//缩小系数

// We can be in one of these 3 states
   static final int NONE = 0;
   static final int DRAG = 1;
   static final int ZOOM = 2;
   int mode = NONE;

@Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      //放大按钮
      zoomIn = (Button) findViewById(R.id.zoom_in);
       //缩小按钮
      zoomOut = (Button) findViewById(R.id.zoom_out);
      zoomIn.setOnClickListener(this);
      zoomOut.setOnClickListener(this);
      view = (ImageView) findViewById(R.id.imageView);
      view.setOnTouchListener(this);
      //取得drawable中图片,放大,缩小,多点触摸的作用对象    
       bmp = BitmapFactory.decodeResource(MutilTouchDemoActivity.this.getResources(), R.drawable.splash);

}

public boolean onTouch(View v, MotionEvent event) {
      // Handle touch events here...
      ImageView view = (ImageView) v;

// Handle touch events here...
      switch (event.getAction() & MotionEvent.ACTION_MASK) {
        //设置拖拉模式
        case MotionEvent.ACTION_DOWN:
            savedMatrix.set(matrix);
            start.set(event.getX(), event.getY());
            Log.d(TAG, "mode=DRAG" );
            mode = DRAG;
            break;

case MotionEvent.ACTION_UP:
         case MotionEvent.ACTION_POINTER_UP:
            mode = NONE;
            Log.d(TAG, "mode=NONE" );
            break;
         //设置多点触摸模式
         case MotionEvent.ACTION_POINTER_DOWN:
            oldDist = spacing(event);
            Log.d(TAG, "oldDist=" + oldDist);
            if (oldDist > 10f) {
               savedMatrix.set(matrix);
               midPoint(mid, event);
               mode = ZOOM;
               Log.d(TAG, "mode=ZOOM" );
            }
            break;
          //若为DRAG模式,则点击移动图片
         case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) {
               matrix.set(savedMatrix);
               // 设置位移
               matrix.postTranslate(event.getX() - start.x,
              event.getX() - start.x);
            }
            //若为ZOOM模式,则多点触摸缩放
               else if (mode == ZOOM) {
               float newDist = spacing(event);
               Log.d(TAG, "newDist=" + newDist);
               if (newDist > 10f) {
                  matrix.set(savedMatrix);
                  float scale = newDist / oldDist;
                  //设置缩放比例和图片中点位置
                  matrix.postScale(scale, scale, mid.x, mid.y);
               }
            }
            break;
      }

// Perform the transformation
      view.setImageMatrix(matrix);

return true; // indicate event was handled
   }
//计算移动距离
   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);
   }

//放大,缩小按钮点击事件
@Override
public void onClick(View v) {
        if(v == zoomIn){
                enlarge();
        }else if (v == zoomOut) {
                small();
        }

}

//按钮点击缩小函数
private void small() {

int bmpWidth = bmp.getWidth();
        int bmpHeight = bmp.getHeight();

scaleWidth = (float) (scaleWidth * ZOOM_OUT_SCALE);
        scaleHeight = (float) (scaleHeight * ZOOM_OUT_SCALE);

Matrix matrix = new Matrix();
        matrix.postScale(scaleWidth, scaleHeight);
        zoomedBMP = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix,
                        true);
        view.setImageBitmap(zoomedBMP);
}

//按钮点击放大函数
private void enlarge() {
        try {
                int bmpWidth = bmp.getWidth();
                int bmpHeight = bmp.getHeight();

scaleWidth = (float) (scaleWidth * ZOOM_IN_SCALE);
                scaleHeight = (float) (scaleHeight * ZOOM_IN_SCALE);

Matrix matrix = new Matrix();
                matrix.postScale(scaleWidth, scaleHeight);
                zoomedBMP = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix,
                                true);
                view.setImageBitmap(zoomedBMP);
        } catch (Exception e) {

}

}
}

时间: 2024-10-02 12:46:58

android 多点触摸图片缩放的具体实现方法的相关文章

android 多点触摸图片缩放的具体实现方法_Android

布局: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/relativeLayout1"    android:layout_width="fill_parent

Android实现ImageView图片缩放和拖动_Android

今天我们来编写一个缩放效果的ImageView ,网上有很多人都讲了这些.但有许多人都直接使用了库文件, 那么我们今天做的是直接上代码编写一个拖动和缩放的ImageView,具体看效果图 那么简单了分析一下.在手机上缩放图片和拖动要用到什么?手指对不对 那么控件上什么事件和手机有关.View.OnTouchListener 对不对. ok,那么先新建一个Class ··· public class BaseDragZoomImageView extends ImageView implement

Android实现ImageView图片缩放和拖动

今天我们来编写一个缩放效果的ImageView ,网上有很多人都讲了这些.但有许多人都直接使用了库文件, 那么我们今天做的是直接上代码编写一个拖动和缩放的ImageView,具体看效果图 那么简单了分析一下.在手机上缩放图片和拖动要用到什么?手指对不对 那么控件上什么事件和手机有关.View.OnTouchListener 对不对. ok,那么先新建一个Class ··· public class BaseDragZoomImageView extends ImageView implement

Android编程获取图片和视频缩略图的方法_Android

本文实例讲述了Android编程获取图片和视频缩略图的方法.分享给大家供大家参考,具体如下: 从Android 2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位 置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取. 1. createVideoThumbnail static Bitmap createVideoThumbnail(

Android编程获取图片和视频缩略图的方法

本文实例讲述了Android编程获取图片和视频缩略图的方法.分享给大家供大家参考,具体如下: 从Android 2.2开始系统新增了一个缩略图ThumbnailUtils类,位于framework的android.media.ThumbnailUtils位 置,可以帮助我们从mediaprovider中获取系统中的视频或图片文件的缩略图,该类提供了三种静态方法可以直接调用获取. 1. createVideoThumbnail static Bitmap createVideoThumbnail(

Android编程单击图片实现切换效果的方法_Android

本文实例讲述了Android编程单击图片实现切换效果的方法.分享给大家供大家参考,具体如下: 新建一个Android项目,命名为FrameLayout 此实例主要操作src文件夹下的MainActivity.Java类文件和res/layout下的activity_main.xml布局文件 1.布局主页面代码activity_main.xml↓ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

Android编程单击图片实现切换效果的方法

本文实例讲述了Android编程单击图片实现切换效果的方法.分享给大家供大家参考,具体如下: 新建一个Android项目,命名为FrameLayout 此实例主要操作src文件夹下的MainActivity.Java类文件和res/layout下的activity_main.xml布局文件 1.布局主页面代码activity_main.xml↓ <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android&qu

Android 简单的图片缩放方法

很简单的一个图片缩放方法,注意要比例设置正确否则可能会内存溢出 相关问题 java.lang.IllegalArgumentException: bitmap size exceeds 32bits 可查看 http://blog.csdn.net/zhouzme/article/details/21732095 public static Bitmap scale(Bitmap bitmap, float scaleWidth, float scaleHeight) { int width =

android获取相册图片和路径的实现方法_Android

Android开发获取相册图片的方式网上有很多种,这里说一个Android4.4后的方法,因为版本越高,一些老的api就会被弃用,新的api和老的api不兼容,导致出现很多问题. 比如:managedQuery()现在已经被getContentResolver().query()替代了,不过它们的参数都是一样的 再比如Android4.4后Intent(Intent.ACTION_GET_CONTENT);和Intent(Intent.ACTION_OPEN_DOCUMENT);两个方法所得到的