对于Android 的手势不光在软件中会经常用到,比如浏览器中的翻页,滚动页面等等;当然其实在我们开发Android游戏的时候加上了Android手势操作更会让游戏增加一个亮点,比如一般的CAG ,PUZ等类型的游戏选择关卡啦、简单背景的移动啦,都可以使用手势来操作即可,类似前段时间很火的《让人愤怒的小鸟!》咳咳、不好意思说错了,是《愤怒的小鸟》,因为总是听群里啊,朋友啊说小鸟出新版本啦,小鸟出PC硬盘版啦! 唉~你说可让人愤怒,其实说实话,小鸟这个游戏确实不错,我所看到的唯一的亮点是这款游戏的创意!说实话,现在的游戏没有做不出来的只有想不出来的好创意、咳咳。回到话题来,那么下面我们来稍微了解下什么是Android 手势! 所谓手势操作,类似跳舞机、EZdancer~这些利用不同动作和音符让人手舞足蹈一样,那么Android这里的手势只是让我们在游戏和软件中的操作有了更多的花样和玩法,根据玩家接触屏幕时间的长短,在屏幕上滑动的距离,按下抬起的时间等进行了包装,其实就是Android 对触屏处理做了包装和处理。
多时候,利用触摸屏的Fling、Scroll等Gesture(手势)操作来操作会使得应用程序 的用户体验大大提升,比如用Scroll手势在 浏览器中滚屏,用Fling在阅读器中翻页等。在Android 系 统中,手势的识别是通过 GestureDetector.OnGestureListener接口来实现的,不过William翻遍了Android的官方文档也没有找到一个相 关的例子,API Demo中的TouchPaint也仅仅是提到了onTouch事件的处理,没有涉及到手势。Android Developer讨论组里也有不少人有和我类似的问题,结合他们提到的方法和我所做的实验,我将给大家简单讲述一下Android中手势识别的实现
下面我讲解一个实例来说明Gesture手势操作。
private ViewFlipper flipper;
private GestureDetector detector;
detector = new GestureDetector(this);//
detector.setIsLongpressEnabled(true);
flipper = new ViewFlipper(this);
flipper.setBackgroundColor(Color.WHITE); flipper.addView(addTextView("第一美女", 0));// flipper.addView(addTextView("第二美女", 1)); flipper.addView(addTextView("第三美女", 2)); flipper.addView(addTextView("第四美女", 3)); flipper.addView(addTextView("第五美女", 4)); flipper.addView(addTextView("第六美女", 5)); flipper.addView(addTextView("第七美女", 6));// flipper.addView(addTextView("第八美女", 7)); flipper.addView(addTextView("第九美女", 8)); flipper.addView(addTextView("第十美女", 9)); setContentView(flipper);
而addTextView方法的实现细节如下所示:
private View addTextView(String text, int i) { TextView tv = new TextView(this); tv.setText(text); tv.setGravity(1); LinearLayout output = new LinearLayout(this); output.setOrientation(LinearLayout.VERTICAL); Drawable dabg; switch (i) { case 0: dabg = this.getResources().getDrawable(R.drawable.a1); output.setBackgroundDrawable(dabg); break; case 1: dabg = this.getResources().getDrawable(R.drawable.a2); output.setBackgroundDrawable(dabg); break; case 2: dabg = this.getResources().getDrawable(R.drawable.a3); output.setBackgroundDrawable(dabg); break; case 3: dabg = this.getResources().getDrawable(R.drawable.a4); output.setBackgroundDrawable(dabg); break; case 4: dabg = this.getResources().getDrawable(R.drawable.a5); output.setBackgroundDrawable(dabg); break; case 5: dabg = this.getResources().getDrawable(R.drawable.a6); output.setBackgroundDrawable(dabg); break; case 6: dabg = this.getResources().getDrawable(R.drawable.a7); output.setBackgroundDrawable(dabg); break; case 7: dabg = this.getResources().getDrawable(R.drawable.a8); output.setBackgroundDrawable(dabg); break; case 8: dabg = this.getResources().getDrawable(R.drawable.a9); output.setBackgroundDrawable(dabg); break; case 9: dabg = this.getResources().getDrawable(R.drawable.a10); output.setBackgroundDrawable(dabg); break; } output.addView(tv); return output; }
将图片添加到ViewFlipper对象中了。然后要通过手势操作切换图片
@Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub return this.detector.onTouchEvent(event); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // TODO Auto-generated method stub if (e1.getX() - e2.getX() > 120) { this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.drawable.left_in)); this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.drawable.left_out)); this.flipper.showNext(); return true; } else if (e1.getX() - e2.getX() < -120) { this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.drawable.right_in)); this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.drawable.right_out)); this.flipper.showPrevious(); return true; } else if (e1.getY() - e2.getY() > 200) { this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.drawable.push_up_in)); this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.drawable.push_up_out)); this.flipper.showNext(); return true; } else if (e1.getY() - e2.getY() < -200) { this.flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.drawable.push_down_in)); this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.drawable.push_down_out)); this.flipper.showPrevious(); return true; } return false; }
重写两个事件,一个是onTouchEvent函数,一个是onFling函数
这样就可以实现翻页效果了。
如果想要实现幻灯片效果的话,就是自定实现图片切换。可以使用Thread ,Runable,Handler来实现之
private Handler handler; private Runnable runnable ;
runnable = new Runnable(){ int i = 0; @Override public void run() { // TODO Auto-generated method stub //Message对象由android系统提供 Message msg = handler.obtainMessage(); //将msg对象arg1成员变量设置为i; msg.arg1 = i; i++; try{ Thread.sleep(5000); }catch(InterruptedException e ){ e.printStackTrace(); } handler.sendMessage(msg); if(i == 11){ i = 0; } } }; handler = new Handler(){ @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub super.handleMessage(msg); switch(msg.arg1){ case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: flipper.setInAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.drawable.left_in)); flipper.setOutAnimation(AnimationUtils.loadAnimation(MainActivity.this, R.drawable.left_out)); flipper.showNext(); break; } handler.post(runnable); } };
通过 handler.post(runnable); //open the state
触发
而动画效果:
left_in.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="500" /> </set>
left_out.xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0" android:toXDelta="-100%p" android:duration="500" /> </set>
还有其他的事件
@Override public boolean onDown(MotionEvent e) { // TODO Auto-generated method stub return false; } @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; }