zoukankan      html  css  js  c++  java
  • Android学习之多触点滑动

    知识点:

    1、对矩阵:Matrix类熟悉,链接:https://blog.csdn.net/jdsjlzx/article/details/52741445

    2、MotionEvent详解:https://blog.csdn.net/vansbelove/article/details/78416791

    3、定位一个点使用:new PointF();

      getX()、getY():获取点相对于左上角的相对坐标

    4、顺序:创建矩阵锁定位置--->创建常量记录触点动作--->创建点--->计算点间距、两点中心的位置

    重点:1、计算两点之间的距离计算

          2、计算两点间中间点的位置

    代码如下:

    1、MainActivity.java源码:

      1 package com.example.moremovetest;
      2 
      3 import android.app.Activity;
      4 import android.app.usage.UsageEvents.Event;
      5 import android.graphics.Matrix;
      6 import android.graphics.PointF;
      7 import android.os.Bundle;
      8 import android.view.MotionEvent;
      9 import android.view.View;
     10 import android.view.View.OnTouchListener;
     11 import android.widget.ImageView;
     12 
     13 public class MainActivity extends Activity implements OnTouchListener{
     14     private ImageView imageView;
     15     
     16     private Matrix matrix1=new Matrix();//创建一个矩阵,移动前的矩阵、移动后的矩阵
     17     private Matrix matrix2=new Matrix();
     18     
     19     private static final int NONE=0; //常量,没有触点,一个触点,两个触点,实际触点
     20     private static final int DRAG=1;
     21     private static final int ZOOM=2;
     22     private int mode=NONE;
     23     
     24     private PointF startPoint=new PointF();//第一个手指按下的点
     25     private PointF midPoint=new PointF();//两个手指按下的点之间的中点
     26     private float distance=1f;//最初两个手指按下的点之间的距离
     27 
     28     @Override
     29     protected void onCreate(Bundle savedInstanceState) {
     30         super.onCreate(savedInstanceState);
     31         setContentView(R.layout.activity_main);
     32         imageView=(ImageView)findViewById(R.id.image);
     33         imageView.setOnTouchListener(this);
     34     }
     35     
     36     @Override
     37     public boolean onTouch(View arg0, MotionEvent arg1) {
     38         ImageView view=(ImageView)arg0; //参数中传入的view转换为ImageView
     39         
     40         //触摸设置:
     41         switch (arg1.getAction() & MotionEvent.ACTION_MASK) {
     42         case MotionEvent.ACTION_DOWN:      //第一个手指按下
     43             matrix1.set(view.getImageMatrix()); //将图片大小设置一个单位矩阵
     44             matrix2.set(matrix1);      //将矩阵matrix1保存
     45             startPoint.set(arg1.getX(), arg1.getY()); //设置第一个触点的位置
     46             mode=DRAG;
     47             break;
     48         case MotionEvent.ACTION_POINTER_DOWN:  //第二个手指按下
     49             distance=distance(arg1);  //函数distance(MotionEvent event)用于计算两点间的距离
     50             //防止一个手指上出现两个茧
     51             if(distance>10f) {
     52                 matrix2.set(matrix1);
     53                 midPoint=middle(arg1);  //计算两个触点的中间点的位置
     54                 mode=ZOOM;
     55             }
     56             break;
     57         //手指松开:
     58         case MotionEvent.ACTION_UP:
     59         case MotionEvent.ACTION_POINTER_UP:
     60             mode=NONE;
     61             break;
     62         //手指滑动事件:
     63         case MotionEvent.ACTION_MOVE:
     64             if(mode==DRAG) {
     65                 //一个手指滑动:
     66                 matrix1.set(matrix2);
     67                 //位置迁移
     68                 matrix1.postTranslate(arg1.getX()-startPoint.x, arg1.getY()-startPoint.y);
     69             }else if(mode==ZOOM){
     70                 //两个手指滑动
     71                 float newDistance=distance(arg1);
     72                 if(newDistance>10f) {
     73                 matrix1.set(matrix2);
     74                 float scale=newDistance/distance;
     75                 matrix1.postScale(scale, scale,midPoint.x, midPoint.y);
     76                 }
     77             }
     78             break;
     79         default:
     80             break;
     81         }
     82         //设置ImageView的矩阵(Matrix)
     83         view.setImageMatrix(matrix1);
     84         return true;
     85     }
     86     
     87     //计算两点间的距离:
     88     private float distance(MotionEvent event) {
     89         float x=event.getX(0)-event.getX(1);
     90         float y=event.getY(0)-event.getY(1);
     91         return (float)Math.sqrt(x*x+y*y);
     92     }
     93     
     94     //计算两点之间中间点的位置:
     95     private PointF middle(MotionEvent event) {
     96         float x=event.getX(0)-event.getX(1);
     97         float y=event.getY(0)-event.getY(1);
     98         return new PointF(x/2,y/2);
     99     }
    100 }

     2、activity_main.xml:

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:paddingBottom="@dimen/activity_vertical_margin"
     6     android:paddingLeft="@dimen/activity_horizontal_margin"
     7     android:paddingRight="@dimen/activity_horizontal_margin"
     8     android:paddingTop="@dimen/activity_vertical_margin"
     9     tools:context="com.example.moremovetest.MainActivity" >
    10     
    11     <ImageView 
    12         android:id="@+id/image"
    13         android:layout_width="match_parent"
    14         android:layout_height="match_parent"
    15         android:src="@drawable/image"
    16         android:scaleType="matrix"
    17         />
    18 
    19 </LinearLayout>

    3、AndroidManifest.xml:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     3     package="com.example.moremovetest"
     4     android:versionCode="1"
     5     android:versionName="1.0" >
     6 
     7     <uses-sdk
     8         android:minSdkVersion="18"
     9         android:targetSdkVersion="22" />
    10 
    11     <application
    12         android:allowBackup="true"
    13         android:icon="@drawable/ic_launcher"
    14         android:label="@string/app_name"
    15         android:theme="@style/AppTheme" >
    16         <activity
    17             android:name=".MainActivity"
    18             android:label="@string/app_name" >
    19             <intent-filter>
    20                 <action android:name="android.intent.action.MAIN" />
    21 
    22                 <category android:name="android.intent.category.LAUNCHER" />
    23             </intent-filter>
    24         </activity>
    25     </application>
    26 
    27 </manifest>
  • 相关阅读:
    vs调试程序时发现变量、类等程序找不到混乱问题
    ExtJs中XTemplate使用(转)
    windows配置iis网站域名
    Codeforces Round #459 (Div. 2) C (括号问题)
    Codeforces Round #459 (Div. 2) AB
    数据生成python脚本
    腾讯云ubuntu14.04安装hustoj
    ubuntu16.04安装hustoj
    nginx服务器通过server让域名访问二级目录
    Apache服务器通过htaccess让域名指向二级目录
  • 原文地址:https://www.cnblogs.com/hh8888-log/p/9766834.html
Copyright © 2011-2022 走看看