触控两点,onTouchEvent

项目中遇到一个需求,需要同时点击屏幕的一个对角弹出一个对话框,查阅相关资料,找到一个常用的方法,即重写onTouchEvent,在方法中做相关处理,自己写了个demo,代码如下package com.example.twotouch;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.Toast;

public class MainActivity extends Activity {
    private int x0;
    private int y0;
    private int x1;
    private int y1;
    private int width;
    private int height;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取屏幕宽高
        WindowManager systemService = (WindowManager)getSystemService(WINDOW_SERVICE);
        width = systemService.getDefaultDisplay().getWidth();
        height = systemService.getDefaultDisplay().getHeight();
    }
    @Override

    public boolean onTouchEvent(MotionEvent event) {

//获取点击点的个数

        int pointerCount = event.getPointerCount();
        int action = event.getAction();
        if (pointerCount==1) {
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                 x0 = (int)event.getX(0);
                 y0=(int)event.getY(0);

                System.out.println("ACTION_DOWN pointerCount="+pointerCount);
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.println("ACTION_MOVE pointerCount="+pointerCount);
                break;
            case MotionEvent.ACTION_UP:
                System.out.println("ACTION_UP pointerCount="+pointerCount);
                break;

            default:
                break;
            }
        }
        
        if (pointerCount==2) {
             x0 = (int)event.getX(0);
             y0=(int)event.getY(0);
             x1 = (int)event.getX(1);
             y1 = (int)event.getY(1);
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                System.out.println("ACTION_DOWN pointerCount="+pointerCount);
                break;
            case MotionEvent.ACTION_MOVE:
                System.out.println("ACTION_MOVE pointerCount="+pointerCount);
                break;
            case MotionEvent.ACTION_UP:
                System.out.println("ACTION_UP pointerCount="+pointerCount);
                break;
            case MotionEvent.ACTION_POINTER_1_DOWN:
                System.out.println("ACTION_POINTER_1_DOWN pointerCount="+pointerCount);
                break;
            case MotionEvent.ACTION_POINTER_1_UP:
                System.out.println("ACTION_POINTER_1_UP pointerCount="+pointerCount);
                break;
            case MotionEvent.ACTION_POINTER_2_DOWN:
                if (x0<width*0.5 && y0<height*0.5) {
                    if (x1>width*0.5 && y1>height*0.5) {
                        Toast.makeText(getApplicationContext(), "弹出窗口", Toast.LENGTH_SHORT).show();
                    }
                    
                }
                System.out.println("ACTION_POINTER_2_DOWN pointerCount="+pointerCount);
                
                break;
            case MotionEvent.ACTION_POINTER_2_UP:
                System.out.println("ACTION_POINTER_2_UP pointerCount="+pointerCount);
                break;

            default:
                break;
            }
            
        }
        return super.onTouchEvent(event);
    }
}

还有一种相对简单的方法就是在屏幕的对角个写以一个view给view写点击事件

代码如下

package com.example.touch;

import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{

    private View viewTop;
    private View viewBotton;
    private boolean isOnclickTop = false;
    private boolean isOnclickBottom = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        viewTop = findViewById(R.id.view_top);
        viewBotton = findViewById(R.id.view_bottom);
        
        initView();
    }

    private void initView() {
        // TODO Auto-generated method stub
        viewTop.setOnClickListener(this);
        viewBotton.setOnClickListener(this);
        
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.view_top:
            isOnclickTop=true;
            
            new CountDownTimer(100,100) {
                
                @Override
                public void onTick(long arg0) {
                    // TODO Auto-generated method stub
                    
                }
                
                @Override
                public void onFinish() {
                    // TODO Auto-generated method stub
                    isOnclickTop=false;
                }
            }.start();
            
            break;
        case R.id.view_bottom:
            isOnclickBottom=true;
            
            new Thread(new Runnable() {//也可以开启一个新的线程
                
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    isOnclickBottom=false;
                }
            }).start();
            
//            new CountDownTimer(100,100) {
//                
//                @Override
//                public void onTick(long arg0) {
//                    // TODO Auto-generated method stub
//                    
//                }
//                
//                @Override
//                public void onFinish() {
//                    // TODO Auto-generated method stub
//                    isOnclickBottom=false;
//                }
//            }.start();
            
            break;
            

        default:
            break;
        }
        if (isOnclickTop==true&&isOnclickBottom==true) {
            Toast.makeText(getApplicationContext(), "弹出窗口", Toast.LENGTH_SHORT).show();
        }
        
    }
}

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
     >

    <View
        android:id="@+id/view_top"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#000000"
         />

    <View
        android:id="@+id/view_bottom"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="#ff0000" />

</RelativeLayout>



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android中,通过多触控的方式控制移动非常常见和简便。首先,Android设备的屏幕可以同时检测和处理多个触摸的输入。这意味着用户可以使用不止一个手指在屏幕上进行操作。 在实现通过多触控控制移动的过程中,最重要的是监听页面上的触摸事件。可以通过在活动或视图的代码中重写相应的触摸事件方法来实现。常见的触摸事件方法包括onTouchEvent()和onInterceptTouchEvent()等。 一种常见的方式是通过记录用户第一次触摸屏幕时的触摸坐标,并随后不断更新它们,来计算用户的手指移动距离和方向。通过计算前后两次触摸坐标的差异,可以确定用户的手指在屏幕上移动的方向和距离。 一种简单的实现方式是使用View类的scrollBy()方法,通过调用该方法来移动视图的内容。通过将计算得到的移动距离传递给scrollBy()方法,可以使视图在用户的触摸下相应地移动。 另一种常见的实现方式是使用SurfaceView来绘制游戏或图形应用程序。通过在SurfaceView的回调方法中检测触摸事件,并在每一帧更新屏幕上的图形内容,可以实现更为复杂的移动控制。 通过结合使用触摸事件的各种方法和移动控制的技巧,开发者可以根据项目需求来实现多种不同的移动效果,满足用户对于交互性和用户体验的要求。因此,Android中通过多触控的方式控制移动变得灵活、方便和可定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值