package com.example.touchdemo;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class MainActivity extends Activity {
    private ImageView image;
    float lastDistance = -1;
    float x0 = 0;
    float y0 = 0;
    private float x;
    private float y;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        image = (ImageView) findViewById(R.id.imgage);
        image.setOnTouchListener(new OnTouchListener() {
            
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                int action = event.getAction();
                Log.i("TAG","触摸开始......");
                switch (action) {
                //加上down方法,即实现单点触控,又实现放大缩小
                case MotionEvent.ACTION_DOWN:
                    x = event.getRawX();
                    y = event.getRawX();
                    break;
                case MotionEvent.ACTION_UP:
                    //注掉这两行,只支持放大缩小,不支持单点触控
                    /*image.setX(event.getX());
                    image.setY(event.getY());*/
                    break;
                case MotionEvent.ACTION_MOVE:
                    //得到触摸点的个数
                    int count = event.getPointerCount();
                    Log.i("TAG","触摸点的个数:"+count);
                    if(count > 1){
                        Log.i("TAG", event.getX(0)+","+event.getY(0)+"|"+event.getX(1)+","+event.getY(1));
                        //获得两点的坐标差
                        float distanceX = event.getX(0) - event.getX(1);
                        float distanceY = event.getY(0) - event.getY(1);
                        //获得两点之间的距离
                        float betweenDistance = (float) Math.sqrt(distanceX*distanceX + distanceY*distanceY);
                        Log.i("TAG","当前两点之间的新距离:"+betweenDistance);
                        if(betweenDistance < 1){
                            lastDistance = betweenDistance;
                        }else if((betweenDistance - lastDistance) > 5){
                            //放大
                            lastDistance = betweenDistance;
                            //获得布局参数
                            RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) image.getLayoutParams();
                            params.width = (int) (image.getWidth()*1.1f);
                            params.height = (int) (image.getHeight()*1.1f);
                            image.setLayoutParams(params);
                        }else if((lastDistance - betweenDistance) > 5){
                            lastDistance = betweenDistance;
                            //获得布局参数
                            RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) image.getLayoutParams();
                            params.width = (int) (image.getWidth()*0.9f);
                            params.height = (int) (image.getHeight()*0.9f);
                            image.setLayoutParams(params);
                        }
                        
                    }else if(count == 1){
                        //注掉这两行,只支持放大缩小,不支持单点触控
                        /*image.setX(event.getX());
                        image.setY(event.getY());*/
                        /**
                         * 即实现单点触控,又实现放大缩小
                         * */
                        //移动距离
                        float rawX = event.getRawX()-x;
                        float rawy = event.getRawY()-y;
                        //定义新的
                        int left = (int) (image.getLeft()+rawX);
                        int top = (int) (image.getTop()+rawy);
                        int right = (int) (image.getRight()+rawX);
                        int bottom = (int) (image.getBottom()+rawy);
                        //赋值
                        image.layout(left, top, right, bottom);
                        //改成新的按下作标
                        x=event.getRawX();
                        y=event.getRawY();
                        
                    }
                    break;

default:
                    break;
                }
                
                return true;
            }
        });
    }

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

touch ImageView的更多相关文章

  1. Android ImageView图片透明区域不响应点击事件,不规则图片透明区域响应点击事件

    转载:http://blog.csdn.net/aminfo/article/details/7872681 经常会在项目中用到透明图片,不规则图片,特别是做游戏的时候,需要对图片的透明区域的点击事件 ...

  2. Android Touch事件传递机制 一: OnTouch,OnItemClick(监听器),dispatchTouchEvent(伪生命周期)

      ViewGroup View  Activity dispatchTouchEvent 有 有 有 onInterceptTouchEvent 有 无 无 onTouchEvent 有 有 有 例 ...

  3. 点击按钮后到底发生了什么,Touch,LongClick或者Click?

    按钮点击事件详解 最近一个项目需要给应用初始界面上的动态按钮添加在不同状态的变换效果,如点击(俗一点也可称为按压)后实现背景图的更换或者图标的缩放等效果.由于按钮点击的时间有长有短,所以采用OnTou ...

  4. Android开发之Touch事件分发机制

    原地址http://www.cnblogs.com/linjzong/p/4191891.html Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实 ...

  5. 开发错误记录1:解决:Only the original thread that created a view hierarchy can touch its views.

    今天在项目中要使用圆角头像,导入开源 CircleImageView ,然后setImageBitmap()时 运行时就会发现,它会报一个致命性的异常:: · ERROR/AndroidRuntime ...

  6. Android事件分发机制(二)30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

  7. Android Touch消息传递机制探究分析

    在Android中,消息的传递控制主要是通过两个方法共同配合使用来对用户的触摸消息进行分发的,下面就来看看这两个方法: onInterceptTouchEvent:此方法定义于ViewGroup中,顾 ...

  8. Android Touch事件传递机制解析 (推荐)

    最近新闻列表里的下拉 down up  move 等等让我十分头疼 ,无意间看到了一篇非常不错的帖子,转载如下: 开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把a ...

  9. Android:30分钟弄明白Touch事件分发机制

    Touch事件分发中只有两个主角:ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理. View在 ...

随机推荐

  1. 转!Java关键字final、static使用总结

    Java关键字final.static使用总结   一.final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可 ...

  2. 如何将根文件系统制作成yaffs格式,并设置从yaffs启动

    1.利用mkyaffs2image 工具,将根文件系统打包成yaffs镜像包 mkyaffs2image-128M root_qtopia root_qtopia.img 2.设置uboot参数boo ...

  3. Jsp-Servlet 那一大堆事儿--1

    为毛全局变量声明时初始化在try内不能用? import javax.servlet.http .*; import java.io.*; import javax.servlet.*; import ...

  4. Java虚拟机类加载机制——案例分析

    转载: Java虚拟机类加载机制--案例分析   在<Java虚拟机类加载机制>一文中详细阐述了类加载的过程,并举了几个例子进行了简要分析,在文章的最后留了一个悬念给各位,这里来揭开这个悬 ...

  5. servlet的配置和上下文

    一.Servlet配置对象(ServletConfig):Servlet初始化时,容器调用其init(ServletConfig)方法,传递该对象. 1.获得对象方法: (1).直接使用getServ ...

  6. meta viewport 详解

    ViewPort <meta>标记用于指定用户是否可以缩放Web页面,如果可以,那么缩放到的最大和最小缩放比例是什么.使用ViewPort <meta>标记还表示文档针对移动设 ...

  7. 初学java之try-catch-finally语句的实例

    /* try - catch语句的例子,模拟向货船上装载集装箱 ,如果货船超重,那么货船认为这是一个异常,将拒绝装载集装箱, 但无论是否发生异常,货船都需要正点起航. */ package st; c ...

  8. SqlServer中把结果集放到到临时表的方法

    一. SELECT INTO   1. 使用select into会自动生成临时表,不需要事先创建   select * into #temp from sysobjects   01. 把存储过程结 ...

  9. Java 之 I/O 系列 02 ——序列化(二)

    Java 之 I/O 系列 目录 Java 之 I/O 系列 01 ——基础 Java 之 I/O 系列 02 ——序列化(一) Java 之 I/O 系列 02 ——序列化(二) 继续上篇的第二个问 ...

  10. javascript function new this

    1. 首先,我们这里把function直接调用时将这个function当做方法来看待,而new function是将function当做类来看待 2. 当把function作为类来使用时,functi ...