Android手势控制实现缩放、移动图片

本文实例为大家分享了Android手势控制实现缩放、移动图片的方法,供大家参考,具体内容如下

新建一个触摸监听器类

package com.liyong.btprinter; 

import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView; 

public class MulitPointTouchListener implements OnTouchListener { 

private static final String TAG = "Touch";
  // These matrices will be used to move and zoom image
  Matrix matrix = new Matrix();
  Matrix savedMatrix = new Matrix(); 

  // 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; 

  // Remember some things for zooming
  PointF start = new PointF();
  PointF mid = new PointF();
  float oldDist = 1f; 

  @Override
  public boolean onTouch(View v, MotionEvent event) { 

      ImageView view = (ImageView) v;
      // Log.e("view_width",
      // view.getImageMatrix()..toString()+"*"+v.getWidth());
      // Dump touch event to log
      dumpEvent(event); 

      // Handle touch events here...
      switch (event.getAction() & MotionEvent.ACTION_MASK) {
      case MotionEvent.ACTION_DOWN: 

          matrix.set(view.getImageMatrix());
          savedMatrix.set(matrix);
          start.set(event.getX(), event.getY());
          //Log.d(TAG, "mode=DRAG");
          mode = DRAG; 

          //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;
      case MotionEvent.ACTION_UP:
      case MotionEvent.ACTION_POINTER_UP:
          mode = NONE;
          //Log.e("view.getWidth", view.getWidth() + "");
          //Log.e("view.getHeight", view.getHeight() + ""); 

          break;
      case MotionEvent.ACTION_MOVE:
          if (mode == DRAG) {
              // ...
              matrix.set(savedMatrix);
              matrix.postTranslate(event.getX() - start.x, event.getY()
                      - start.y);
          } 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;
      } 

      view.setImageMatrix(matrix);
      return true; // indicate event was handled
  } 

  private void dumpEvent(MotionEvent event) {
      String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE",
              "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" };
      StringBuilder sb = new StringBuilder();
      int action = event.getAction();
      int actionCode = action & MotionEvent.ACTION_MASK;
      sb.append("event ACTION_").append(names[actionCode]);
      if (actionCode == MotionEvent.ACTION_POINTER_DOWN
              || actionCode == MotionEvent.ACTION_POINTER_UP) {
          sb.append("(pid ").append(
                  action >> MotionEvent.ACTION_POINTER_ID_SHIFT);
          sb.append(")");
      }
      sb.append("[");
      for (int i = 0; i < event.getPointerCount(); i++) {
          sb.append("#").append(i);
          sb.append("(pid ").append(event.getPointerId(i));
          sb.append(")=").append((int) event.getX(i));
          sb.append(",").append((int) event.getY(i));
          if (i + 1 < event.getPointerCount())
              sb.append(";");
      }
      sb.append("]");
      //Log.d(TAG, sb.toString());
  } 

  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);
  } 

}

编写一个xml文件

<?xml version="1.0" encoding="UTF-8"?> 

  <LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_height="fill_parent"
  android:layout_width="fill_parent"
  android:id="@+id/linearLayout1"
  android:weightSum="1">
    <ImageView android:layout_width="fill_parent"
    android:id="@+id/priviewimage"
    android:layout_height="fill_parent"
    android:layout_gravity="center"
    android:scaleType="matrix"
    >
   </ImageView>
  </LinearLayout>

注意其中的: android:scaleType="matrix"

priviewimage.setImageBitmap(ActivityPreviewImage.click_bitmap);
priviewimage=(ImageView)findViewById(R.id.priviewimage);
priviewimage.setOnTouchListener(new MulitPointTouchListener()); 

以上就是Android手势控制缩放移动图片的全部代码,希望对大家的学习有所帮助。

(0)

相关推荐

  • Android实现手势滑动多点触摸放大缩小图片效果

    网上文章虽多,但是这种效果少之又少,我真诚的献上以供大家参考 实现原理:自定义ImageView对此控件进行相应的layout(动态布局). 这里你要明白几个方法执行的流程: 首先ImageView是继承自View的子类. onLayout方法:是一个回调方法.该方法会在在View中的layout方法中执行,在执行layout方法前面会首先执行setFrame方法. setFrame方法:判断我们的View是否发生变化,如果发生变化,那么将最新的l,t,r,b传递给View,然后刷新进行动态更新

  • Android实现手势滑动多点触摸缩放平移图片效果

    现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位. 一.概述 想要做到图片支持多点触控,自由的进行缩放.平移,需要了解几个知识点:Matrix , GestureDetector , ScaleGestureDetector 以及事件分发机制,ps:不会咋办,不会你懂的. 1.Matrix 矩阵,看深入了都是3维矩阵的乘啊什么的,怪麻烦的~~ 其实这么了解下就行了: Matrix 数据结构:3维矩阵

  • Android通过手势实现的缩放处理实例代码

    网络上传言HTC的HERO-ROM支持多点触摸的论证大多源于浏览网页和图片时,能像IPhone一样通过手势来控制页面的大小.下面的例子是利用现有的API实现HERO浏览图片和网页的缩放功能. 主要原理是onTouchEvent事件中的参数MotionEvent,它有一个getSize()方法.在一个点的时候,该方法永远返回0,而在两个触电的时候,该方法则根据两点相对位置变化而返回不同的值.我们只需计算出两点之间的距离变化,距离的大小表明我们希望目标变化的趋势.而getX()和getY()方法则永

  • Android自定义控件实现手势密码

    Android手势解锁密码效果图 首先呢想写这个手势密码的想法呢,完全是凭空而来的,然后笔者就花了一天时间弄出来了.本以为这个东西很简单,实际上手的时候发现,还有很多逻辑需要处理,稍不注意就容易乱套.写个UI效果图大约只花了3个小时,但是处理逻辑就处理了2个小时!废话不多说,下面开始讲解.      楼主呢,自己比较自定义控件,什么东西都掌握在自己的手里感觉那是相当不错(对于赶工期的小伙瓣儿们还是别手贱了,非常容易掉坑),一有了这个目标,我就开始构思实现方式.      1.整个自定义控件是继承

  • android使用gesturedetector手势识别示例分享

    复制代码 代码如下: public class MyGestureLintener extends SimpleOnGestureListener {private Context context;public MyGestureLintener(Context context) {    super();    this.context = context;} // 单击,触摸屏按下时立刻触发/*@Overridepublic boolean onDown(MotionEvent e) {  

  • 基于Android中手势交互的实现方法

    闲来无事,琢磨琢磨Android中的手势交互,发现网上在手势方面的文章并不是很多,而且很多的参考价值并不大.于是出此博文,与大家共勉.鉴于我写此博文时对手势交互的研究也不是特深,如果有不正确的地方,还请各位博友批评指正. 首先,在Android系统中,每一次手势交互都会依照以下顺序执行. 1. 接触接触屏一刹那,触发一个MotionEvent事件. 2. 该事件被OnTouchListener监听,在其onTouch()方法里获得该MotionEvent对象. 3. 通过GestureDetec

  • Android中使用ViewFlipper进行手势切换实例

    本文实例讲述了Android中使用ViewFlipper进行手势切换的方法,分享给大家供大家参考.具体实现步骤如下: 首先在layout的xml文件中定义一个ViewFlipper: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?>  <ViewFlipper xmlns:android="http://schemas.android.com/apk/res/android" 

  • android创建手势识别示例代码

    这篇的内容使用到的是android.gesture包,具体的例子参考的是Sample中GestureBuilder程序. 1.手势创建手势创建主要用到GestureOverlayView和GestureLibrary.GestureOverlayView的父类为android.widget.FrameLayout,是手势绘图区.GestureLibrary类主要对手势进行保存.删除等操作的,存放手势的仓库.下面给出创建手势的例子,如下图,可以定义如图手势打开csdn.net 1.1.创建绘图区

  • Android 自定义手势--输入法手势技术

    进行软件开发时,通常我们都喜欢使用较新版本的工具,但这里我为什么使用低版本的SDK来开发Android游戏呢?这里介绍下原因: 1.Android SDK 属于向下兼容!那么低版本可以运行的,高版本基本上更是没问题!(当然每次SDK的更新也会带来新功能,或者修改了一些原来的BUG等等,那么其实对于游戏开发来说,如果你的游戏中不需要更高的SDK版本的支持情况下,完全不必去追求最新的SDK!) 2.使用低版本进行游戏开发这样能兼顾更多的机型,获取更多的用户! 3.大家都知道Android SDK 每

  • Android游戏开发 自定义手势--输入法手势技术

    进行软件开发时,通常我们都喜欢使用较新版本的工具,但这里我为什么使用低版本的SDK来开发Android游戏呢?这里介绍下原因: 1.Android SDK 属于向下兼容!那么低版本可以运行的,高版本基本上更是没问题!(当然每次SDK的更新也会带来新功能,或者修改了一些原来的BUG等等,那么其实对于游戏开发来说,如果你的游戏中不需要更高的SDK版本的支持情况下,完全不必去追求最新的SDK!) 2.使用低版本进行游戏开发这样能兼顾更多的机型,获取更多的用户! 3.大家都知道Android SDK 每

  • 理解Android的手势识别提高APP的用户体验

    对于触摸屏,其原生的消息无非按下.抬起.移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理.不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了. 基础 GestureDetector的工作原理是,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手

  • Android编程实现自定义手势的方法详解

    本文实例讲述了Android编程实现自定义手势的方法.分享给大家供大家参考,具体如下: 之前介绍过如何在Android程序中使用手势,主要是系统默认提供的几个手势,这次介绍一下如何自定义手势,以及如何对其进行管理. 先介绍一下Android系统对手势的管理,Android系统允许应用程序把用户的手势以文件的形式保存以前,以后要使用这些手势只需要加载这个手势库文件即可,同时Android系统还提供了诸如手势识别.查找及删除等的函数接口,具体如下: 一.加载手势库文件: staticGestureL

随机推荐