Android:实现手势滑动的事件处理方法

本文介绍如何在Android应用中实现手势识别,包括滑动、长按等操作,并提供了一个示例程序,展示如何通过手势来切换不同的图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先得Activity必须实现OnGestureListener接口,该接口提供了关于手势操作的一些方法,

onDown方法:onDown是,一旦触摸屏按下,就马上产生onDown事件

public boolean onDown(MotionEvent e) {

      return false;

}

onFling方法:当手在屏幕上滑动但手未离开屏幕时触发

参数:

MotionEvent e1 手开始触碰屏幕的位置的MotionEvent对象

MotionEvent e2 手结束触碰屏幕的位置的MotionEvent对象

float velocityX 表示手在水平方向的移动速度

float velocityX 表示手在垂直方向的移动速度

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)

 

onLongPress方法:长按屏幕时触发

public void onLongPress(MotionEvent e)

 

onScroll方法:当手在屏幕上滑动离开屏幕时触发,参数跟onFling一样(注意两者的区别)

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)

 

onShowPress方法:点击了触摸屏,但是没有移动和弹起的动作onShowPress和onDown的区别在于  onDown是,一旦触摸屏按下,就马上产生onDown事件,但是onShowPress是onDown事件产生后,  一段时间内,如果没有移动鼠标和弹起事件,就认为是onShowPress事件。

public void onShowPress(MotionEvent e)

 

onSingleTapUp方法:轻击触摸屏后,弹起。如果这个过程中产onLongPress、onScroll和onFling事件,就不会  产生onSingleTapUp事件。 

public boolean onSingleTapUp(MotionEvent e)

 

 

 

注意:手势是要结合触摸才能有效的,所以该类必须实现onTouchEvent方法,该方法响应触摸事件

public boolean onTouchEvent(MotionEvent event) {

    //这里将当前事件交给手势管理器处理

     // gesture是手势管理器(GestureDetector

    return gesture.onTouchEvent(event);

 }

 

完整代码:

package com.zzq.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.widget.ImageView;

public class GestureTestActivity extends Activity implements OnGestureListener{
    /** Called when the activity is first created. */
	/**定义手势管理器*/
	private GestureDetector gesture;
	/**得到要切换的图片数组*/
	private int[] imgarr = new int[]{
					R.drawable.whatsnew_fornew_01,
					R.drawable.whatsnew_fornew_02,
					R.drawable.whatsnew_fornew_03,
					R.drawable.whatsnew_fornew_04,
					R.drawable.whatsnew_fornew_05
	};
	//这个是显示五个小点的ImageView的id
	private int[] dotIdarr = new int[]{
			R.id.img_one_id,
			R.id.img_two_id,
			R.id.img_three_id,
			R.id.img_four_id,
			R.id.img_five_id,
	};
	/**图片的当前位置*/
	private int loca = 0;
	/**显示图片的组件*/
	private ImageView mainImage;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mainImage = (ImageView)findViewById(R.id.image_id);
        //这里是创建一个手势管理器对象
        gesture = new GestureDetector(this);
        //初始状态让ImageView显示第一张图片
        mainImage.setImageResource(imgarr[loca]);
        ImageView imgone = (ImageView)findViewById(R.id.img_one_id);
        //初始状态设置小圆点为白点(表示当前显示第一张图片)
        imgone.setImageResource(R.drawable.page_indicator_focused);
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    	// TODO Auto-generated method stub
    	return gesture.onTouchEvent(event);
    }
    
	@Override
	public boolean onDown(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		//去掉上一个的白原点
		ImageView dotTopImg = (ImageView)findViewById(dotIdarr[loca]);
		dotTopImg.setImageResource(R.drawable.page_indicator_unfocused);
		//从右往左滑动,并且滑动距离至少为100像素
		if(e1.getX()-e2.getX()>100){
			//当滑到最后一张时,回到第一张
			if(loca==(imgarr.length-1)){
				loca = -1;
			}
			loca++;
			//显示下一张图片
			mainImage.setImageResource(imgarr[loca]);	
		}
		//从左往右滑动
		else if(e1.getX()-e2.getX()< -100){
			//当滑到第一张时,回到最后一张
			if(loca==0){
				loca = 5;
			}
			loca--;
			mainImage.setImageResource(imgarr[loca]);
		}
		//设置当前显示图片对应原点
		ImageView dotImg = (ImageView)findViewById(dotIdarr[loca]);
		dotImg.setImageResource(R.drawable.page_indicator_focused);
		return true;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		return false;
	} 

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}
}


布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center">

    <ImageView
        android:id="@+id/image_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:id="@+id/dot_imge_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:gravity="center_horizontal"
        android:layout_marginBottom="38dp"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/img_one_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"/>

        <ImageView
            android:id="@+id/img_two_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:src="@drawable/page_indicator_unfocused" />

        <ImageView
            android:id="@+id/img_three_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:src="@drawable/page_indicator_unfocused" />

        <ImageView
            android:id="@+id/img_four_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:src="@drawable/page_indicator_unfocused" />

        <ImageView
            android:id="@+id/img_five_id"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            android:src="@drawable/page_indicator_unfocused" />
    </LinearLayout>

</RelativeLayout>

效果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值