加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 教程 > 正文

Android--多点触控的达成

发布时间:2021-11-25 17:41:02 所属栏目:教程 来源:互联网
导读:Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验。 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会

Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上只要使用电容屏触控原理的手机均可以支持多点触控Multitouch技术,对于网页缩放、手势操作上有更好的用户体验。 在Android平台上事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN而移动操作时为 ACTION_MOVE最终放开手指时触发ACTION_UP事件。当然还有用户无规则的操作可能触发ACTION_CANCEL这个动作.
 
对于常规的控件触控操作在内部为View的setOnTouchListener()接口实现的 onTouchEvent()方法来处理。
 
下面用ImageView做演示:
 
 
 
                           
 
main.xml:
 
<?xml version="1.0" encoding="utf-8"?>  
<FrameLayout  
xmlns:android="http://schemas.android.com/apk/res/android"  
android:layout_width="fill_parent"  
android:layout_height="fill_parent" >  
<ImageView android:id="@+id/imageView"  
android:layout_width="fill_parent"  
android:layout_height="fill_parent"  
android:src="@drawable/pic"  
android:scaleType="matrix" >  
</ImageView>  
</FrameLayout>  
 
要注意的是 android:scaleType 的属性必须设置为matrix,否则图片无法改变大小。
java文件:
 
package com.shao.muti;  
  
import android.app.Activity;  
import android.graphics.Matrix;  
import android.graphics.PointF;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.MotionEvent;  
import android.view.View;  
import android.view.View.OnTouchListener;  
import android.widget.ImageView;  
  
public class MutiTouchActivity extends Activity implements OnTouchListener{  
    /** Called when the activity is first created. */  
    private static final String TAG="Touch";  
    private static final int NONE= 0 ;  
    private static final int DRAG = 1;  
    private static final int ZOOM =2;  
    int mode  = NONE;  
    Matrix matrix = new Matrix();  
    Matrix savedMatrix =  new Matrix();  
      
    PointF start = new PointF();  
    PointF mid = new PointF();  
    float oldDist = 1f;  
      
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  
        ImageView view = (ImageView) findViewById(R.id.imageView);  
        view.setOnTouchListener(this);  
    }  
  
    @Override  
    public boolean onTouch(View v, MotionEvent event) {  
        // TODO Auto-generated method stub   
        ImageView view = (ImageView) v;  
        printEventinfo(event);//测试输出信息   
        switch(event.getAction()&MotionEvent.ACTION_MASK)  
        {  
        case MotionEvent.ACTION_DOWN:  
            savedMatrix.set(matrix);  
               //設置初始點位置   
            start.set(event.getX(),event.getY());  
            Log.d(TAG,"mode=DRAG");  
            mode  =DRAG;  
            break;  
        case MotionEvent.ACTION_POINTER_1_DOWN:  
            oldDist= spacing(event);  
            Log.d(TAG,"lodDist="+oldDist);  
            if(oldDist>10f){  
                savedMatrix.set(matrix);  
                midPoint(mid,event);  
                mode = ZOOM;  
                Log.d(TAG,"mode=ZOOM");  
                  
            }  
            break;  
        case MotionEvent.ACTION_UP:  
        case MotionEvent.ACTION_POINTER_1_UP:  
            mode  =NONE;  
            Log.d(TAG,"mode=NONE");  
            break;  
        case MotionEvent.ACTION_MOVE:  
            if(mode==DRAG){  
                matrix.set(savedMatrix);  
                matrix.postTranslate(event.getX()-start.x, event.getY()-start.y);  
            }  
            else if(mode == ZOOM){  
                 float newDist = spacing(event);  
                    Log.d(TAG, "newDist=" + newDist);  
                    if (newDist > 10f) {  
                       matrix.set(savedMatrix);  
                       float scale = newDist / oldDist;  
                       matrix.postScale(scale, scale, mid.x, mid.y);  
                    }  
                 }  
            break;  
        }  
        view.setImageMatrix(matrix);  
        return true;  
          
    }  
    private void printEventinfo(MotionEvent event){  
        int num =0;  
        System.out.println("触控动作---->"+event.getAction()); //获取触控动作比如ACTION_DOWN   
        System.out.println("取触控点的数量--->"+event.getPointerCount()); //获取触控点的数量,比如2则可能是两个手指同时按压屏幕   
        num = event.getPointerCount();  
        for(int i=0;i<num;i++){  
            System.out.println("索引-->"+event.getPointerId(i)); //对于每个触控的点的细节,我们可以通过一个循环执行getPointerId方法获取索引   
            System.out.println("第i个触控点的x位置-->"+event.getX(i)); //获取第i个触控点的x位置   
            System.out.println("第i个触控点的y位置-->"+event.getY(i)); //获取第i个点触控的y位置   
            System.out.println("手指压力-->"+event.getPressure(i)); //LCD可以感应出用户的手指压力,当然具体的级别由驱动和物理硬件决定的   
        }  
        System.out.println("开始时间"+event.getDownTime()); //按下开始时间   
        System.out.println(" 事件结束时间"+event.getEventTime()); // 事件结束时间   
        System.out.println("总共按下时花费时间"+(event.getEventTime()-event.getDownTime())); //总共按下时花费时间   
  
    }  
      /** Determine the space between the first two fingers */  
    private float spacing(MotionEvent event){  
        float x = event.getX(0)-event.getY(1);  
        float y = event.getY(0)-event.getY(1);  
        return (float)Math.sqrt(x*x+y*y);  
    }  
    /** Calculate the mid point of the first two fingers */  
       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);  
       }  
}  

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读