1.Activity

package com.fit.touchimage;

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.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.MarginLayoutParams;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnTouchListener {
    /** Called when the activity is first created. */
 
 //放大缩小
 Matrix matrix=new Matrix();
 Matrix savedMatrix=new Matrix();
 
 PointF start=new PointF();
 PointF mid=new PointF();
 float oldDist;
 
 private ImageView myImageView;
 
 //模式
 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);
       
        myImageView=(ImageView) findViewById(R.id.myImage);
        myImageView.setOnTouchListener(this);
       
    }

@Override
 public boolean onTouch(View v, MotionEvent event) {
  ImageView myImageView=(ImageView) v;
  switch(event.getAction()&MotionEvent.ACTION_MASK){
   //设置拖拉模式
  case MotionEvent.ACTION_DOWN:
   matrix.set(myImageView.getImageMatrix());
   savedMatrix.set(matrix);
   start.set(event.getX(),event.getY());
   mode=DRAG;
  break;
  case MotionEvent.ACTION_UP:
  case MotionEvent.ACTION_POINTER_UP:
   mode=NONE;
   break;
  
  //设置多点触摸模式
  case MotionEvent.ACTION_POINTER_DOWN:
   oldDist=spacing(event);
   if(oldDist>10f){
    savedMatrix.set(matrix);
    midPoint(mid, event);
    mode=ZOOM;
   }
   break;
   //若为DRAG模式,则点击移动图片
  case MotionEvent.ACTION_MOVE:
   if(mode==DRAG){
    matrix.set(savedMatrix);
    matrix.postTranslate(event.getX()-start.x,event.getY()-start.y);
   }
   //若为ZOOM模式,则点击触摸缩放
   else if(mode==ZOOM){
    float newDist=spacing(event);
    if(newDist>10f){
     matrix.set(savedMatrix);
     float scale=newDist/oldDist;
     //设置硕放比例和图片的中点位置
     matrix.postScale(scale,scale, mid.x,mid.y);
    }
   }
   break;
  } 
  myImageView.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);
 }
}

2.布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical" android:layout_width="fill_parent"
 android:layout_height="fill_parent" android:gravity="center">
 <ImageView android:layout_width="fill_parent"
  android:layout_height="fill_parent" android:scaleType="matrix"
  android:id="@+id/myImage" android:src="@drawable/xiaoxiong"/>
</LinearLayout>

Android多点触摸放大缩小图片的更多相关文章

  1. Android 手势滑动,多点触摸放大缩小图片

    效果展示: 基本思路: <1>首先写一个图片控制类ImageControl,实现对图片控制的的基本操作,我们的图片控制类ImageControl是继承自ImageView自定义的视图: & ...

  2. WPF多点触摸放大缩小旋转

    原文:WPF多点触摸放大缩小旋转 版权声明:本文为博主原创文章,需要转载尽管转载. https://blog.csdn.net/z5976749/article/details/40118437 如果 ...

  3. 自定义ImageView实现图片手势滑动,多点触摸放大缩小效果

    首先呢,还是一贯作风,我们先来看看众多应用中的示例:(这种效果是很常见的,可以说应用的必须品.)                搜狐客户端                               ...

  4. Linux与Android 多点触摸协议【转】

    本文转载自:http://blog.csdn.net/xubin341719/article/details/7833277 一.Linux与Android 多点触摸协议 为了使用功能强大的多点触控设 ...

  5. Linux & Android 多点触摸协议

    Linux & Android 多点触摸协议 Android4.0多点触摸入门 1 KERNEL 对于触摸屏的驱动我们简单的划分为两个主要的部分,一个是注册,另一个是上报. 1.1 注册 单点 ...

  6. Linux/Android多点触摸协议

    链接点击打开链接 关于Linux多点触摸协议大家可以参考kernel中的文档:https://www.kernel.org/doc/Documentation/input/multi-touch-pr ...

  7. Linux Android 多点触摸协议 原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/os/71/12306571.shtml

    为了使用功能强大的多点触控设备,就需要一种方案去上报用户层所需的详细的手指触摸数据.这个文档所描述的多点触控协议可以让内核驱动程序向用户层上报任意多指的数据信息. 使用说明 单点触摸信息是以ABS承载 ...

  8. 搞定android多点触摸模拟

    原理在android 创建多点触摸虚拟设备,然后往设备写模拟数据可以

  9. Linux/Android多点触摸协议【转】

    本文转载自: 链接点击打开链接 关于Linux多点触摸协议大家可以参考kernel中的文档:https://www.kernel.org/doc/Documentation/input/multi-t ...

随机推荐

  1. 未知高度的图片在div设置垂直居中

    方法一: 该方法是将外部容器的显示模式设置成display:table,img标签外部再嵌套一个span标签,并设置span的显示模式为display:table-cell,这样就可以很方便的使用ve ...

  2. 理解HTML5数据推送应用开发问题

    一.数据推送 SSE是一种允许服务端向客户端推送新数据(通常称作数据推送)的HTML5技术.那么,究竟什么是数据推送?它与我们可能用过的其他技术有什么不同呢? 让我先来回答什么不是数据推送.数据推送有 ...

  3. ASM下裸设备的路径更改是否会影响数据库的执行

    通过asm来存储数据库文件,在linux下能够通过asmlib的方式来管理块设备,也能够直接使用裸设备来建立asm磁盘.在asmlib方式下,磁盘设备启动顺序和名称的改变不会影响到asm的使用.但假设 ...

  4. EF实体类的枚举属性映射设计方法

    public class FoundationInfo { [Column("id")] public int ID { get; set; } public InvestType ...

  5. python 两个队列进行对比

    python 两个队列进行对比 list01 = [1,2,3,4] list02 = [1,3,5] for i01 in list01: is_in_02 = False for i02 in l ...

  6. 遭遇java.lang.NoClassDefFoundError: org/apache/tomcat/PeriodicEventListener

    前天还正常的程序,今天忽然无法启动了,MyEclipse的Console提醒我如下错误: 严重: Error deploying web application directory rttsbizja ...

  7. (算法)位图BitMap

    题目: 给定一数组,大小为M,数组中的数字范围为1-N,如果某带宽有限,无法传输该大小的数组,该怎么办? 思路: 通过位图BitMap来压缩数组,将数组中每个数字在bit位上标志,这样就可以将数组大小 ...

  8. 通过WebRTC实现实时视频通信(三)

    通过WebRTC实现实时视频通信(一) 通过WebRTC实现实时视频通信(二) 通过WebRTC实现实时视频通信(三) 在这篇文章中我们继续了解WebRTC的相关API,RTCPeerConnecti ...

  9. 相似qq的IM聊天应用源代码

    这个是IM聊天应用源代码,该应用IM支持实现XMPP,以及图片和表情,语音.消息回执等功能,基本覆盖了常见的im应用的功能了,大家能够參考一下吧. 源代码下载:http://code.662p.com ...

  10. ZH奶酪:PHP图片压缩(TinyPNG在线API)和(使用Imagick扩展)

    1.调用TinyPng网站提供的API 1.1.须知 (1)tinypng的官网:https://tinypng.com/ 不知道国内访问会不会很慢,在Singapore打开这个网站很流畅: (2)A ...