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

 更新时间:2013年06月22日 10:47:13   作者:  
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) {

        }

}
}

相关文章

  • Android神兵利器之Image Asset Studio的实现

    Android神兵利器之Image Asset Studio的实现

    这篇文章主要介绍了Android神兵利器之Image Asset Studio的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Android图像处理之泛洪填充算法

    Android图像处理之泛洪填充算法

    这篇文章主要介绍了泛洪填充算法,工作原理是从一个点开始附近像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充新颜色为止,分享给大家供大家参考
    2018-05-05
  • android listview的多列模版实例代码

    android listview的多列模版实例代码

    这篇文章主要介绍了android listview的多列模版实例代码的相关资料,这里附有实例代码,具有参考价值,需要的朋友可以参考下
    2017-01-01
  • Android Studio实现简单的通讯录

    Android Studio实现简单的通讯录

    这篇文章主要为大家详细介绍了Android Studio实现简单的通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Android属性动画实现图片从左到右逐渐消失

    Android属性动画实现图片从左到右逐渐消失

    这篇文章主要介绍了Android属性动画实现图片从左到右逐渐消失,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Android游戏开发学习之引擎用法实例详解

    Android游戏开发学习之引擎用法实例详解

    这篇文章主要介绍了Android游戏开发学习之引擎用法,较为详细的分析了Android游戏开发中所常用的JBox2D引擎功能及相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android实现上传图片功能

    Android实现上传图片功能

    这篇文章主要为大家详细介绍了Android实现上传图片功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 教你制作Android中炫酷的ViewPagerIndicator(不仅仿MIUI)

    教你制作Android中炫酷的ViewPagerIndicator(不仅仿MIUI)

    ViewPagerIndicator作为一款分页指标小部件兼容ViewPager,封装上做得非常不错,目前已为众多知名应用所使用。今天给你大家分享一个炫酷的效果,有需要的可以参考学习。
    2016-08-08
  • Android开发Jetpack组件ViewModel使用讲解

    Android开发Jetpack组件ViewModel使用讲解

    这篇文章主要介绍了Android Jetpack架构组件 ViewModel详解,ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在,ViewModel类旨在以注重生命周期的方式存储和管理界面相关的数据,感兴趣可以来学习一下
    2022-08-08
  • Android高仿QQ小红点功能

    Android高仿QQ小红点功能

    这篇文章主要介绍了Android高仿QQ小红点功能的相关资料,需要的朋友可以参考下
    2017-06-06

最新评论