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

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

在该事件中,有两个参数可以用来获取对触摸的控制,这两个参数分别为:MotionEvent.getAction()和MotionEvent.ACTION_MASK,前者用于对单点触控进行操作,后者用于对多点触控进行操作,相应地,我们可以通过Android Developers’ 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 void onCreate(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(new OnTouchListener()
{
@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 boolean onCreateOptionsMenu(Menu menu)
    {
    menu.add(0, OPTION_Setting, 0, "Location");

    return true;

    }
    public boolean onOptionsItemSelected(MenuItem item)
    {
    LayoutInflater factory = LayoutInflater.from(this);
    final View textEntryView = factory.inflate(R.layout.second, null);
    int itemId = item.getItemId();
      switch(itemId){
      case OPTION_Setting: 
            final AlertDialog.Builder alert = new AlertDialog.Builder(Map2Activity.this);
            alert.setTitle("alert Title");
            alert.setView(textEntryView);
            alert.setPositiveButton("Ok",
                    new DialogInterface.OnClickListener() {
                        public void 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() {
                        public void onClick(DialogInterface dialog,
                                int whichButton) {
                        }
                    });  
            alert.show(); 
      }
      return true;
    }
     


     
     
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WinForms是微软的一个桌面应用程序开发框架,用于创建Windows操作系统上的图形用户界面。然而,WinForms在多点触控方面的功能相对较弱。 要支持WinForms中的多点触控,我们可以使用.NET框架中的一些技术和类库。首先,我们需要将应用程序的TargetFramework设置为.NET Framework 4.6或更高版本,以便能够使用最新的触控功能。 在WinForms中,我们可以使用Control类中的一些事件和属性来处理多点触控。例如,我们可以使用Control类中的MouseEnter、MouseMove和MouseLeave事件来追踪触摸设备的位置和动作。另外,我们还可以使用Control类中的Handle属性来获取控件的句柄,以便与Windows操作系统的触控事件进行交互。 此外,我们还可以使用.NET Framework中的WPF(Windows Presentation Foundation)来实现更高级的多点触控功能。WPF是一个用于创建富客户端应用程序的框架,它提供了更强大和灵活的触控支持。在WPF中,我们可以使用Touch类和触摸事件来处理多点触控。 总的来说,WinForms对于多点触控的支持相对较弱,但是我们可以通过使用.NET Framework中的一些技术和类库来实现一些基本的多点触控功能。如果需要更高级的多点触控功能,则建议使用WPF来开发应用程序。 ### 回答2: Winform是微软Windows操作系统下的一种图形用户界面应用程序的开发框架,用于构建Windows桌面应用程序。然而,Winform并不原生支持多点触控。 要实现Winform多点触控功能,可以借助第三方库或手动实现。其中一种方法是使用Microsoft Surface SDK或TouchToolkit,它们提供了一些用于处理触控输入的类和控件,可以实现多点触控的支持。这些库通常提供了手势识别、滑动、旋转和缩放等常见的多点触控操作功能。 另一种方法是通过手动捕获和处理原始的触控输入信息。可以在Winform应用程序中重写WndProc方法,并使用Windows消息机制来处理WM_TOUCH消息,从而获取触控输入的信息。然后,可以使用这些信息来实现自定义的多点触控交互逻辑。 无论使用哪种方法,都需要在程序中实现对触控事件的处理逻辑。可以通过在触控事件处理程序中使用适当的代码来响应不同的触控手势,例如单击、双击、长按、滑动等。同时,还可以根据需要对控件进行布局调整,以适应不同的屏幕尺寸和触控操作。 需要注意的是,Winform作为一种传统的桌面应用程序开发框架,其多点触控的支持相对较弱。如果需要更丰富的多点触控功能,推荐考虑使用更为现代的UI开发框架,如WPF或UWP。这些框架提供了更为强大和易用的多点触控支持,可以满足更复杂的用户交互需求。 ### 回答3: WinForms是一种用于开发Windows桌面应用程序的框架,它提供了一系列的UI控件和功能,用于创建丰富的用户界面。然而,WinForms并没有直接支持多点触控的能力,因为它是在较早的时期开发的,当时多点触控并不是主流。 要在WinForms应用程序中实现多点触控,我们可以借助一些第三方库或基于WinForms的扩展来实现。这些库或扩展通常提供了额外的控件和事件来处理多点触控操作。 一种常见的方法是使用TouchHook库来捕获触摸事件。TouchHook是一个高级触摸输入库,它实现了自定义的触摸事件处理逻辑。通过使用TouchHook,我们可以在WinForms应用程序中捕获并处理各种触摸手势,例如滑动、缩放、旋转等。 另一种方法是使用基于WinForms的扩展库,如TeeChart.NET。TeeChart.NET提供了一系列的触摸友好的图表控件,可以通过手势实现图表的交互操作。使用TeeChart.NET,我们可以轻松地在WinForms应用程序中实现触摸导航、缩放和平移等功能。 除了使用第三方库和扩展,我们还可以通过自定义绘制和事件处理来实现基本的多点触控功能。通过捕获鼠标事件和触摸事件,我们可以确定触摸点的位置和操作,并相应地更新UI。 总结来说,虽然WinForms本身并没有原生支持多点触控,但我们可以通过使用第三方库、扩展或自定义绘制和事件处理来实现多点触控功能。这些方法可以帮助我们在WinForms应用程序中创建更具交互性和触摸友好的用户界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值