博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android多点触摸放大缩小图片
阅读量:7050 次
发布时间:2019-06-28

本文共 2730 字,大约阅读时间需要 9 分钟。

 

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=""
 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>

转载地址:http://lkdol.baihongyu.com/

你可能感兴趣的文章
Rust Pattern - 读文件
查看>>
Esxi 5.1外网端口配置
查看>>
pg_lightool-postgres数据库基于wal日志的坏页修复
查看>>
linux常用命令之链接
查看>>
2013-5-12 HELLO POJ!
查看>>
java同步关键词解释、synchronized、线程锁(Lock)
查看>>
Nginx 开机启动
查看>>
解决系统App编译签名问题
查看>>
Pubwin数据备份专家官方版
查看>>
PHP + MongoDB + GridFS
查看>>
关于fourinone开源项目的几点看法
查看>>
Erlang list shuffle
查看>>
python 迭代器单向,迭代器对象只能使用一次
查看>>
Spring MVC中使用国际化和主题
查看>>
可信任执行环境 TEE(Trusted Execution Environment)
查看>>
java.io.IOException: Could not find resource org/xxx/SqlMapConfig.xml
查看>>
hibernate关联表插入的时候报异常
查看>>
环境准备
查看>>
使用node.js + socket.io + redis实现基本的聊天室场景
查看>>
百度网盘障眼法 此链接分享内容可能因为涉及侵权、色情、反动、低俗等信息,无法访问!...
查看>>