安卓学习笔记13:安卓触摸事件

零、学习目标

  1. 能说出安卓触摸事件的两种类型
  2. 能说出安卓触摸包含的三个动作
  3. 能利用安卓触摸事件处理编写应用

一、安卓触摸事件

1、触摸分类

  • 单点触摸
  • 多点触摸

2、触摸动作

  • 按下(MotionEvent.ACTION_DOWN
  • 移动(MotionEvent.ACTION_MOVE
  • 放开(MotionEvent.ACTION_UP

3、触摸监听器

  • onTouchListener

4、触摸方法

  • onTouch() 方法里,我们可以根据不同动作编写不同事件处理代码。

5、触点个数与坐标

  • 通过MotionEvent对象的getX()getY()方法可以获得触摸点的坐标。如果是多点触摸,通过getPointerCount()获取触点个数,然后通过getX(pointerIndex)getY(pointerIndex)获得某个触点的坐标。

二、安卓单点触摸

onTouch方法里,我们可以根据不同动作编写不同的事件处理代码。按下、移动和释放三种不同的操作。通过MotionEvent对象的getX()getY()方法可以获得触摸点的坐标。

三、教学案例——通过单点触摸移动米老鼠

(一)运行效果

在这里插入图片描述

(二)涉及知识点

1、线性布局(LinearLayout
2、图像视图(ImageView
3、单点触摸事件(MotionEventgetX(), getY()

(三)实现步骤

1、创建安卓应用【MoveMickeyByTouch】

在这里插入图片描述
在这里插入图片描述

2、准备背景图片与米老鼠图片,拷贝到drawable目录里

在这里插入图片描述

3、布局资源文件activity_main.xml

在这里插入图片描述

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@drawable/background" >

    <ImageView
        android:id="@+id/ivMickey"
        android:layout_width="100dp"
        android:layout_height="120dp"
        android:scaleType="fitXY"
        android:src="@drawable/mickey" />

</LinearLayout>

4、主界面类MainActivity

在这里插入图片描述

package net.hw.movemickey;

import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    
    
    protected static final String TAG = "move_mickey_by_touch";
    private ImageView ivMickey;
    private LinearLayout root;
    private LinearLayout.LayoutParams LayoutParams;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);

        // 通过控件资源索引获得控件实例
        ivMickey = (ImageView) findViewById(R.id.ivMickey);
        root = (LinearLayout) findViewById(R.id.root);

        // 设置根布局可以获得焦点
        root.setFocusable(true);
        // 让根布局获得焦点
        root.requestFocus();

        // 获取图像控件的布局参数
        LayoutParams = (LinearLayout.LayoutParams) ivMickey.getLayoutParams();

        // 给根布局注册触摸监听器,实现触摸监听器接口,编写触摸事件代码
        root.setOnTouchListener(new View.OnTouchListener() {
    
    

            @Override
            public boolean onTouch(View v, MotionEvent event) {
    
    
                // 根据触摸动作执行不同的操作
                switch (event.getAction()) {
    
    
                    case MotionEvent.ACTION_DOWN: // 触点按下
                        Log.d(TAG, "ACTION_DOWN(" + event.getX() + ", " + event.getY() + ")");
                        break;
                    case MotionEvent.ACTION_MOVE: // 触点移动
                        Log.d(TAG, "ACTION_MOVE(" + event.getX() + ", " + event.getY() + ")");
                        break;
                    case MotionEvent.ACTION_UP: // 触点放开
                        Log.d(TAG, "ACTION_UP(" + event.getX() + ", " + event.getY() + ")");
                }

                // 根据变化的触点坐标来更新图像控件的布局参数
                LayoutParams.leftMargin = (int) event.getX();
                LayoutParams.topMargin = (int) event.getY();

                // 重新设置图像控件的布局参数
                ivMickey.setLayoutParams(LayoutParams);

                return true; // 设置为真,三个事件:down-->move-->up才会依次执行
            }
        });
    }
}

5、启动应用,查看效果

  • 启动后,米老鼠在屏幕左上角
    在这里插入图片描述
  • 在模拟器屏幕上,按下鼠标,移动鼠标,放开鼠标,之后在LogCat里可以看到上述上述三种动作的位置坐标。
    在这里插入图片描述
  • 录屏演示单点触摸移动米老鼠
    在这里插入图片描述
  • 从录屏动画可以看到,移动鼠标,确实可以让米老鼠跟着动起来,但是有一个体验不好,就是触点与米老鼠隔了一段距离,这个问题应该如何解决呢?同学们,先试一试,看看能否搞定。

6、修改主界面类MainActivity

在这里插入图片描述

7、启动应用,查看效果

在这里插入图片描述

  • 从录屏动画可以看到,移动鼠标,确实可以让米老鼠跟着动起来,但触点是在米老鼠的左上角,怎么让触点在米老鼠的中心位置呢?

8、修改主界面类MainActivity

在这里插入图片描述

9、启动应用,查看效果

在这里插入图片描述

10、查看修改后的主界面源代码

  • 采用图像控件的setX()和setY()方法来修改图像控件的位置,因此关于布局参数的代码就可以删除了。
package net.hw.movemickey;

import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    
    
    private static final String TAG = "move_mickey_by_touch";
    private ImageView ivMickey;
    private LinearLayout root;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        // 利用布局资源文件设置用户界面
        setContentView(R.layout.activity_main);

        // 通过控件资源标识符获取控件实例
        ivMickey = findViewById(R.id.ivMickey);
        root = findViewById(R.id.root);

        // 设置根布局可以获得焦点
        root.setFocusable(true);
        // 让根布局获取焦点
        root.requestFocus();

        // 给根布局注册触摸监听器,实现触摸监听器接口,编写触摸事件代码
        root.setOnTouchListener(new View.OnTouchListener() {
    
    
            @Override
            public boolean onTouch(View view, MotionEvent event) {
    
    
                // 根据触摸动作执行不同的操作
                switch (event.getAction()) {
    
    
                    case MotionEvent.ACTION_DOWN: // 触点按下
                        Log.d(TAG, "ACTION_DOWN(" +event.getX() + ", " + event.getY() +")");
                        break;
                    case MotionEvent.ACTION_MOVE: // 触点移动
                        Log.d(TAG, "ACTION_MOVE(" +event.getX() + ", " + event.getY() +")");
                        break;
                    case MotionEvent.ACTION_UP: // 触点放开
                        Log.d(TAG, "ACTION_UP(" +event.getX() + ", " + event.getY() +")");
                        break;
                }

                // 设置图像控件的坐标
                ivMickey.setX(event.getX() - ivMickey.getWidth() / 2);
                ivMickey.setY(event.getY() - ivMickey.getHeight() / 2);

                return true; // 设置为真,三个事件:down-->move-->up才会依次执行
            }
        });
    }
}

四、教学案例 —— 通过多点触摸缩放米老鼠

(一)运行效果

在这里插入图片描述

(二)涉及知识点

1、线性布局(LinearLayout
2、图像视图(ImageView
3、多点触摸事件(MotionEventgetX(pointerIndex)getY(pointerIndex)

(三)实现步骤

1、创建安卓应用【ZoomMickeyByTouch】

在这里插入图片描述
在这里插入图片描述

2、准备背景图片与米老鼠图片,拷贝到drawable目录里

在这里插入图片描述

3、主布局资源文件activity_main.xml

在这里插入图片描述

4、主界面类MainActivity

在这里插入图片描述

  • 声明变量
    在这里插入图片描述
  • 实例化控件
    在这里插入图片描述
  • 设置根布局
    在这里插入图片描述
  • 获取图像控件的布局参数
    在这里插入图片描述
  • 给根布局注册触摸监听器
    在这里插入图片描述

5、运行程序,查看结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/108777693