当前位置:首页 > 嵌入式 > 嵌入式软件
[导读] 说在前面,很早时,android就开始有支持单点手势(单点触控),到android2.2开始支持多点触控.不同的动作序列合起来表示不同的手势。比如Fling手势包括三个过程:将手指按触在

 说在前面,很早时,android就开始有支持单点手势(单点触控),到android2.2开始支持多点触控.

不同的动作序列合起来表示不同的手势。比如Fling手势包括三个过程:将手指按触在屏幕上,然后快速扫过,最后

抬起手指,并且在抬起手指仍然在运动(也就是说抬起手指前,运动的速度并不会减少).每一个步操作都会触发相应的事件。

在View控件内,开发人员可以像处理普通的单击事件时使用setOnClickListener()和setOnLongClickListener()

方法一样处理手势。onTouchEvent()回调方法用于探测View区域内的用户动作。

onTouchEvent()回调方法只接收一个参数。MotionEvent对象。MotionEvent对象包含在View内触发的所有类型动作

的细节,通过收集和分析连续的MotionEvent对象,开发人员可以确定产生了何种手势。你可以使用MotionEvent数据

来识别的探测任何你能想像的手势。不过你也可以使用Android SDK 内置的手势探测器来探测普通的用户动作。

android目前拥有两个不同的类用于手势探测。

(1) GestureDetector类可以用于探测一般的单点触控手势。

(2) ScaleGestureDetector可以用来探测多点缩放操作手势。

除了普通的方向性手势,你还可以使用API level 4中引入的android.gesture包中的GestureOverlayView来识别命令手势。

下面主要是处理普通单点触控手势

API level 1中引入的GestureDetector类可以用来探测单个手势。GestureDetector类所支持的单指手势包括以下几种。

onDown:当用户第一次按触屏幕时触发。

onShowPress:当用户按触屏幕,并且在抬起或移动手指之前触发:用于显示显示地指示按触事件确已探测到。

onSingleTapUp:作为单击(sinlge-tap)事件的一部分,在用户从触屏上抬起手指(使用抬起MotionEvent)时触发。

onSingleTabConfirmed:单击事件发生时调用。

onDoubleTab:双击(double-tap)事件发生时调用。

onDoubleTabEvent:在任何双击手势发生时调用,包括按下(down),移动,或抬起(up)MotionEvent.

onLongPress:与onSingleTapUp类似,但只在用户保持按触状态且不移动一定时间,并且不是标准的单击操作时调用。

onScroll:用户按下手指并且匀速移动手指后,在抬起手指前调用。通常也称为“拖曳”(dragging).

onFling:在用户按下并且加速移动手指后,在抬起手指前调用,通常也称为"拂动(flick)手势。

提示:你可以使用GestureDetector.SimpleOnGestureListener类来监听由GestureDetector识别的任何手势。

实例:在Android中实现图片左右滑动效果。

参考来自:

http://www.cnblogs.com/hanyonglu/archive/2012/02/13/2349827.html

原文比较详细,在此不转。注意的一点就是,为了不带那些不用的方法,可以继承SimpleOnGestureListener类。

说一下,我个人的感受。

1.受到一些网上不正确的文章,实习OnTouchListener了。

结果,本来应该重写GestureDetector.OnGestureListener接口的

onTouchEvent方法时,实现了onTouch()方法,害我老是看不到效果,这里弄,那里查,结果,找了开始那本书学习。

系统学习之后,然后我看源代码。发现了GestureDetector类这样的javadoc:

1/**

2* To use this class:

3 *

     

    4 *

  • Create an instance of the {@code GestureDetector} for your {@link View}

     

    5 *

  • In the {@link View#onTouchEvent(MotionEvent)} method ensure you call

     

    6 * {@link #onTouchEvent(MotionEvent)}. The methods defined in your callback

    7 * will be executed when the events occur.

    8 *

 

9**/

上面那个ensure让我觉得应该检查下是不是实现了。然后,结果就出来了。哈哈。太不小心了。

关于判断手势效果的代码:

1Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT);

2 if (e1.getX() - e2.getX() > 120) {

3 this.mFlipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_in));

4 this.mFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.push_left_out));

5this.mFlipper.showNext();

6 return true;

7 }

1.上面触发事件时,我写有Toast提醒代码,但是实际上,用户看不到。

2.第二 上面判断手势距离要求120px有点大长了。

下面学习下其中起到关键作用的另外一个类。ViewFlipper.

ViewFlipper的类继承关系如下:

ViewFlipper->ViewAnimator->FrameLayout->ViewGroup->View->Object

看一下类描述:(中文翻译来自Android中文翻译组)

1/**

2 * Simple {@link ViewAnimator} that will animate between two or more views

3 * that have been added to it. Only one child is shown at a time. If

4 * requested, can automatically flip between each child at a regular interval.

5 *

6被添加到ViewFlipper中的两个或两个以上的视图之间将执行一个简单的ViewAnimator动画。

1一次仅能显示一个子视图。如果需要,可以设置间隔时间使子视图像幻灯片一样自动显示。

1(译者注:com.example.android.apis.view/Animation_2.java包含该类示例程序)

2

3 * @attr ref android.R.styleable#ViewFlipper_flipInterval

4 * @attr ref android.R.styleable#ViewFlipper_autoStart

5 */

经过使用SimpleOnGestureListener类后的全部Java代码如下:

01package me.banxi.slideapp;

02

03import android.app.Activity;[!--empirenews.page--]

04import android.os.Bundle;

05import android.util.Log;

06import android.view.GestureDetector;

07import android.view.GestureDetector.OnGestureListener;

08import android.view.MotionEvent;

09import android.view.View;

10import android.view.View.OnTouchListener;

11import android.view.animation.AnimationUtils;

12import android.widget.ImageView;

13import android.widget.Toast;

14import android.widget.ViewFlipper;

15

16public class SlideAndGestureActivity extends Activity {

17 private ViewFlipper mFlipper;

18 private GestureDetector mDetector;

19 /** Called when the activity is first created. */

20 @Override

21 public void onCreate(Bundle savedInstanceState) {

22 super.onCreate(savedInstanceState);

23 setContentView(R.layout.slide);

24

25 mDetector = new GestureDetector(getApplicationContext(),new FlingListener());

26 mFlipper = (ViewFlipper )findViewById(R.id.viewFlipper1);

27

28 mFlipper.addView(addTextView(R.drawable.one));

29 mFlipper.addView(addTextView(R.drawable.two));

30 mFlipper.addView(addTextView(R.drawable.three));

31 mFlipper.addView(addTextView(R.drawable.four));

32 mFlipper.addView(addTextView(R.drawable.five));

33

34 }

35

36 private View addTextView(int resId){

37 ImageView view = new ImageView(this);

38 view.setImageResource(resId);

39 return view;

40 }

41

42 @Override

43 public boolean onTouchEvent(MotionEvent event) {

44 return mDetector.onTouchEvent(event);

45 }

46

47 private class FlingListener extends GestureDetector.SimpleOnGestureListener{

48 @Override

49 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

50 float velocityY) {

51 String msg = "e1:"+e1.getX()+","+e1.getY()+"e2:"+e2.getX()+","+e2.getY();

52 Log.i("MotionSlide", msg);

53 if (e1.getX() - e2.getX() > 120) {

54 mFlipper.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_in));

55 mFlipper.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_left_out));

56 mFlipper.showNext();

57 return true;

58 } else if (e1.getX() - e2.getX() < -120) {

59 mFlipper.setInAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_in));

60 mFlipper.setOutAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.push_right_out));

61 mFlipper.showPrevious();

62 return true;

63 }

64 return false;

65 }

66

67 }

68

69}

在实际的项目开发中会遇到这样一样问题。

比如。上面 例子添加的ImageView默认也许不处理事件。所以 可以 正常的滑动。

但是在我的实际的开发中,的发现如ViewFlipper上面有一个GridView,GridView上面排列有Button.然后滑动手势

的事件就不会传播到ViewFlipper中去啊。于是我开始是在GridView上面 设置 一个margin

在margin区域里滑动事件 就会传递给ViwFlipper。(严格来说应该是mDetecotor.onTouchEvent()中去。

然后我就在想这个事件 传播的问题,然后我想到因为其实主要调用mDetecotor的时候,

也是在Activity中的OnTouchEvent(MotionEvent)方法 中。

中将这个MotionEvent事件以这样return mDetector.onTouchEvent(event)方法处理返回 。

于是 想在button中事件中的ACTION_MOVE中也调用mDetector.OnTouchEvent()

但是结果 不行。后来我就不区分ACTION_MOVE等等了。

于是,最后,我在对button和gridView做了如下处理。

1button.setOnTouchListener(new OnTouchListener() {

2 @Override

3 public boolean onTouch(View v, MotionEvent event) {

4 return mDetector.onTouchEvent(event);

5

6 }

7});

1gridView.setOnTouchListener(new OnTouchListener() {

2 @Override

3 public boolean onTouch(View v, MotionEvent event) {

4 return mDetector.onTouchEvent(event);

5 }

6});

我想,因为Fliing这样事件不仅仅是ACTION_MOVE他还有开始的OnDown等等一系列事件组合起来的。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭