多点触控介绍以及程序代码

来源:互联网 发布:后期视频制作软件 编辑:程序博客网 时间:2024/06/05 11:03

实现onTouch(View view, MotionEventevent)的方法,就可以获取触屏的感应事件了。

在该事件中,有两个参数可以用来获取对触摸的控制,这两个参数分别为:MotionEvent.getAction()和MotionEvent.ACTION_MASK,前者用于对单点触控进行操作,后者用于对多点触控进行操作,相应地,我们可以通过AndroidDevelopers’Reference看到,对于单点触控,我们由MotionEvent.getAction()可以得到以下几种事件:ACTION_DOWN、ACTION_UP,而对于多点触控,由MotionEvent.ACTION_MASK,我们可以得到:ACTION_POINTER_DOWN、ACTION_POINTER_UP,都是MotionEvent中的常量,可以直接调用。而有些常量则是单点和多点共用的,如:ACTION_MOVE,因此在按下时,我们必须标记单点与多点触控的区别。


package map2.intel;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.FloatMath;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;



public class Map2Activity extends Activity {
   
TextView view;
ImageView imgView;
ImageView imgStarView;
private EditText nameEditText;
private EditText passwordEditText;
RelativeLayout reLayout;
DisplayMetrics dm = new DisplayMetrics();
final static float scale =Resources.getSystem().getDisplayMetrics().density;


int mapWidth;
int mapHight;
int phoneMapWidth;
int phoneMapHight;
int leftTopLocationX;
int leftTopLocationY;
int phoneMapLocationX;
int phoneMapLocationY;
private static final int NONE = 0;
private static final int DRAG = 1;
private static final int ZOOM = 2;

private int mode = NONE;
private float oldDist;
private Matrix matrix = new Matrix();
private Matrix savedMatrix = new Matrix();
private PointF start = new PointF();
private PointF mid = new PointF();
float scale2;
private static final int OPTION_Setting = 0;

    @Override
    public voidonCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.fl);
      this.getWindowManager().getDefaultDisplay().getMetrics(dm);
       
       
       view = (TextView)findViewById(R.id.textView1);
      imgView=(ImageView)findViewById(R.id.imageView1);
      imgStarView=(ImageView)findViewById(R.id.imageView2);
      reLayout=(RelativeLayout)findViewById(R.id.relativeLayout1);
       reLayout.setVisibility(View.INVISIBLE);
       
  Bitmap nineFmap =BitmapFactory.decodeResource(getResources(), R.drawable.rn);
 
  mapWidth=nineFmap.getWidth();
  mapHight=nineFmap.getHeight();

    
    phoneMapWidth=dm.widthPixels;
    phoneMapHight=dipToPixel(170);
  Toast.makeText(getApplicationContext(),String.valueOf(dm.widthPixels)+String.valueOf(mapHight),
     Toast.LENGTH_SHORT).show();
    leftTopLocationX=16;
    leftTopLocationY=16;
     
     
    imgView.setOnTouchListener(newOnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
float[] values = new float[9]; 
ImageView view = (ImageView) v;
switch (event.getAction() &MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(event.getX(), event.getY());
mode = DRAG;
values = new float[9]; 
matrix.getValues(values); 
break;
case MotionEvent.ACTION_UP:
mode = NONE;
break;
case MotionEvent.ACTION_POINTER_UP:
phoneMapLocationX=(int)(phoneMapLocationX*scale2);
phoneMapLocationY=(int)(phoneMapLocationY*scale2);
mode = NONE;
// if()
break;
case MotionEvent.ACTION_POINTER_DOWN:
oldDist = spacing(event);
if (oldDist > 10f)
{
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
values = new float[9]; 
matrix.getValues(values); 

}
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG)
{
System.out.println("View移动");
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x,
event.getY() - start.y);
values = new float[9]; 
matrix.getValues(values); 
imgStarView.setPadding((int)(values[2]+phoneMapLocationX),(int)(values[5]+phoneMapLocationY),0,0);
}
else if (mode == ZOOM)
{
float newDist = spacing(event);
if (newDist > 10f)
{
matrix.set(savedMatrix);
scale2 = newDist /oldDist;//scale<1,reduce;scale>1,magnify
matrix.postScale(scale2, scale2, mid.x, mid.y);
matrix.getValues(values); 
imgStarView.setPadding((int)(values[2]+phoneMapLocationX*scale2),(int)(values[5]+phoneMapLocationY*scale2),0,0);

}
}
break;
}
view.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);
}
});


       
    }
    
public static int dipToPixel(int dip)
{
     return (int) (dip * scale + 0.5f);
}
    public booleanonCreateOptionsMenu(Menu menu)
    {
   menu.add(0,OPTION_Setting, 0, "Location");

    return true;

    }
    public booleanonOptionsItemSelected(MenuItem item)
    {
    LayoutInflater factory =LayoutInflater.from(this);
    final View textEntryView= factory.inflate(R.layout.second, null);
    int itemId =item.getItemId();
     switch(itemId){
      caseOPTION_Setting: 
           finalAlertDialog.Builder alert = newAlertDialog.Builder(Map2Activity.this);
          alert.setTitle("alert Title");
          alert.setView(textEntryView);
          alert.setPositiveButton("Ok",
                 new DialogInterface.OnClickListener() {
                     publicvoid onClick(DialogInterface dialog,int whichButton) {
                    reLayout.setVisibility(View.VISIBLE);
                    passwordEditText =(EditText)textEntryView.findViewById(R.id.password_edit); 
                    nameEditText =(EditText)textEntryView.findViewById(R.id.username_edit);
                     phoneMapLocationX=phoneMapWidth*Integer.valueOf(nameEditText.getText().toString())/mapWidth+leftTopLocationX;
                      phoneMapLocationY=phoneMapHight*Integer.valueOf(passwordEditText.getText().toString())/mapHight+leftTopLocationY;
                    imgStarView.setPadding((int)(phoneMapLocationX),(int)(phoneMapLocationY),0, 0);
                     }
                 });
          
          alert.setNegativeButton("Cancel",
                 new DialogInterface.OnClickListener() {
                     publicvoid onClick(DialogInterface dialog,
                           int whichButton) {
                     }
                 });  
          alert.show(); 
     }
     return true;
    }
    


    
    
}
0 0
原创粉丝点击