Android实现多点触摸操作

Android中的多点触摸可以实现图片的放大、缩小和旋转等处理,供大家参考,具体内容如下

主要通过setOnTouchListener方法来监听用户的触摸事件,通过event.getX(0)和 event.getX(1)来获取第一个触控点和第二个触控点的x轴(或者y轴)坐标,接下来在MotionEvent.ACTION_DOWN、MotionEvent.ACTION_MOVE、MotionEvent.ACTION_UP这几种情况中来对获取到的x轴或者y轴进行处理,就能实现我们想要的效果了。

下面这个小Demo实现了对图片的放大和缩小处理:

package com.example.administrator.translation;
 
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;
 
 
public class MainActivity extends ActionBarActivity {
 
    private RelativeLayout layout;
    private ImageView iv;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        layout = (RelativeLayout) findViewById(R.id.layout);
        iv = (ImageView) findViewById(R.id.iv);
 
 
        layout.setOnTouchListener(new View.OnTouchListener() {
 
            float currentDistance;
            float lastDistance = -1;
 
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
 
                        break;
                    case MotionEvent.ACTION_MOVE:
                        //判断几个触控点
                        if (event.getPointerCount() >= 2) {
                            //两点之间x的坐标差
                            float offsetX = event.getX(0) - event.getX(1);
                            //两点之间y的坐标差
                            float offsetY = event.getY(0) - event.getY(1);
                            //两点之间的距离
                            currentDistance = (float) Math.sqrt(offsetX * offsetX + offsetY * offsetY);
                            if (lastDistance < 0) {
                                //没有缩放
                                lastDistance = currentDistance;
                            } else {
                                if (currentDistance - lastDistance > 5) {//放大
                                    RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) iv.getLayoutParams();
                                    lp.width = (int) (1.1f * iv.getWidth());
                                    lp.height = (int) (1.1f * iv.getHeight());
                                    iv.setLayoutParams(lp);
                                    lastDistance = currentDistance;
                                } else if (currentDistance - lastDistance < -5) {//缩小
                                    int currentIvWidth = iv.getWidth();
                                    int currentIvHeight = iv.getHeight();
                                    if (currentIvWidth > 50 && currentIvHeight >50) {
                                        RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) iv.getLayoutParams();
                                        lp.width = (int) (0.9f * iv.getWidth());
                                        lp.height = (int) (0.9f * iv.getHeight());
                                        iv.setLayoutParams(lp);
                                        lastDistance = currentDistance;
                                    }
 
                                }
                            }
                        }
                        break;
                    case MotionEvent.ACTION_UP:
 
                        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.menu_main, menu);
        return true;
    }
 
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
 
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
 
        return super.onOptionsItemSelected(item);
    }
}

xml代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context=".MainActivity">
 
    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:src="@mipmap/a"
        android:layout_height="wrap_content" />
 
</RelativeLayout>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(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开发中多点触摸的实现方法

    多点触摸技术在实际开发过程中,用的最多的就是放大缩小功能.比如有一些图片浏览器,就可以用多个手指在屏幕上操作,对图片进行放大或者缩小.再比如一些浏览器,也可以通过多点触摸放大或者缩小字体.其实放大缩小也只是多点触摸的实际应用样例之一,有了多点触摸技术,在一定程度上就可以创新出更多的操作方式来,实现更酷的人机交互. 理论上,Android系统本身可以处理多达256个手指的触摸,这主要取决于手机硬件的支持.当然,支持多点触摸的手机,也不会支持这么多点,一般是支持2个点或者4个点.对于开发者来说,编写

  • Android点击事件之多点触摸与手势识别的实现

    前言 最近遇到想要实现三指滑动监听的需求,实现代码不方便贴出来,但是思路还是可以记录一下. Muilti-touch 双指缩放探索 首先要实现OnTouchListener接口,然后重写方法: public boolean onTouch(View v, MotionEvent event); 从这个方法中我们就可以获取实现两指缩放功能的全部信息. View v是触发事件的源,MotionEvent event即一个触摸事件.对屏幕的几乎所有操作都会触发事件,如点击.放开.滑动等. 不同的事件在

  • 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实现手势滑动多点触摸缩放平移图片效果(二)

    上一篇已经带大家实现了自由的放大缩小图片,简单介绍了下Matrix:具体请参考:Android实现手势滑动多点触摸缩放平移图片效果,本篇继续完善我们的ImageView. 首先加入放大后的移动. 1.自由的进行移动 我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以移动~~~ @Override public boolean onTouch(View v, MotionEvent event) { mScaleGestureDetector.onTouchEve

  • android实现多点触摸效果

    本文实例为大家分享了android实现多点触摸效果的具体代码,供大家参考,具体内容如下 1.获取点击xy轴的下标,实现触摸效果. 获取XY画一个圆并且自动从下变大,直到消失不见. 效果图如下: 代码如下: 1.写一个实体类,用于存写触摸点击的XY轴下表,并根据获得的下标用半径把圆画出来,半径默认为0 package com.example.android_pointstouch; import android.content.Context; import android.graphics.Ca

  • Android编程开发之多点触摸(Multitouch)实现方法

    本文实例讲述了Android编程开发之多点触摸(Multitouch)实现方法.分享给大家供大家参考,具体如下: 如果您对开发多点触摸程序感兴趣的话,那么本文将是一个很好的开始,android应用程序开发中,多点触摸不是那么遥不可及,实现起来也很简单,本例只需要两个类就能实现多点触摸. 首先来看看我们的视图类MTView.java: package com.ideasandroid.demo; import android.content.Context; import android.grap

  • Android实现多点触摸操作

    Android中的多点触摸可以实现图片的放大.缩小和旋转等处理,供大家参考,具体内容如下 主要通过setOnTouchListener方法来监听用户的触摸事件,通过event.getX(0)和 event.getX(1)来获取第一个触控点和第二个触控点的x轴(或者y轴)坐标,接下来在MotionEvent.ACTION_DOWN.MotionEvent.ACTION_MOVE.MotionEvent.ACTION_UP这几种情况中来对获取到的x轴或者y轴进行处理,就能实现我们想要的效果了. 下面

  • android实现多点触摸应用

    本文实例为大家分享了android实现多点触摸应用的具体代码,供大家参考,具体内容如下 JhkMultiTouchActivity.java package com.android.forlinx;   import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager;   public class JhkMultiTouchAc

  • Android实现手机多点触摸画圆

    本文实例为大家分享了Android实现手机多点触摸画圆的具体代码,供大家参考,具体内容如下 静态效果图:(多个手指按下和抬起的状态) 代码实现部分: 1.先写个实体类,设置相关的属性 package com.zking.laci.android19_pointstouch;   import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint;   import java.ut

随机推荐