【Android游戏开发之九】(细节处理)触屏事件中的Bug解决方案以及禁止横屏和竖屏切换!

简介:

 

    我们先讲解在触屏事件处理中我们需要改进的bug!然后再给出如何禁止横屏和竖屏切换!以及切换的过程在android os 中是怎样的。

    先看一段代码: 

 
  1. @Override  
  2.     public boolean onTouchEvent(MotionEvent event) {  
  3.         Log.v("test", "onTouchEvent");  
  4.         bmp_y++;  
  5.         if (event.getAction() == MotionEvent.ACTION_MOVE) {  
  6.             Log.v("Himi", "ACTION_MOVE");  
  7.         } else if (event.getAction() == MotionEvent.ACTION_DOWN) {  
  8.             Log.v("Himi", "ACTION_DOWN");  
  9.         } else if (event.getAction() == MotionEvent.ACTION_UP) {  
  10.             Log.v("Himi", "ACTION_UP");  
  11.         }  
  12.         return true;  
  13.         //return super.onTouchEvent(event);//备注1  
  14.     }  
  15.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  16.         Log.v("test", "onKeyDown");  
  17.         bmp_x++;  
  18.         return super.onKeyDown(keyCode, event);  
  19.     } 

    代码很简单,一个是处理实体按键的响应时间,另一个是触屏的响应事件、那么这里要说的有两点:

第一点:

    在surfaceview中我们的onKeyDown 虽然是重写了view的函数,但是仍然需要在初始化的时候去声明获取焦点,setFocusable(true); 如果不调用此方法,那么会造成按键无效。原因是因为如果是自己定义一个继承自View的类,重新实现onKeyDown方法后,只有当该View获得焦点时才会调用onKeyDown方法,Actvity中的onKeyDown方法是当所有控件均没有处理该按键事件时,才会调用.

 

第二点:

    也是今天主要需要讲得的触屏响应的函数,onTouchEvent()! 重写此函数的时候默认最后一句是依照基类的返回方式,return super.onTouchEvent(event); 然后我们在其中去判定 MotionEvent.ACTION_MOVE、MotionEvent.ACTION_DOWN、MotionEvent.ACTION_UP 相对应触屏操作的 拖动、按下、抬起;对此一切都是正确的,但是真正的的运行起项目的时候发现 Log.v("Himi", "ACTION_MOVE"); 这里log的"ACTION_MOVE",永远不会执行!!!为此我找到了解决方法,那么先解释下为什么会出现此类情况。

解释:

    onTouchEvent(),预设使用Oeverride这个方法,通常情況下去呼叫super.onTouchEvent()并传回布林值。但是这里要注意一点,预设如果去呼叫super.onTouchEvent()則很有可能super里面并没做任何事,并且回传false回來,一旦回传false回來,很可能后面的event (例如:Action_Move、Action_Up) 都会收不到了,所以为了确保保后面event能順利收到,要注意是否要直接呼super.TouchEvent()。


例如: 

 
  1. @Override  
  2. public boolean onTouchEvent(MotionEvent event) {  
  3. Log.i("ConanLog", "Event"+event.getAction());  
  4. return super.onTouchEvent(event);  

    这个例子是当你Touch Down的时候会送event進來,接著印出Log,然后呼叫super的onTouchEvent()并回传布林值。此时会回传false,并且之后再也收不到Touch Move或Touch Up的event,為了要确保能收到event,必須要回传true,所以在这里要注意一下。

     这个问题也是当时用到此函数的时候发现的,找了很多资料才找到其解释、所以以后使用onTouchEvent()函数的时候最后的

return super.onTouchEvent(event);

一定要改

return true;

 

最后还要注意一点:在初始化的时候不要忘记setFocusableInTouchMode(true);触屏模式获取焦点,比较类似 setFocusable(true);

——setFocusable(true);//此方法是用来响应按键!如果是自己定义一个继承自View的类,重新实现onKeyDown方法后,只有当该View获得焦点时才会调用onKeyDown方法,Actvity中的onKeyDown方法是当所有控件均没有处理该按键事件时,才会调用.

  

这里讲下如何禁止横屏和竖屏切换! 

    在某些游戏中我们可能需要禁止横屏和竖屏切换,其实实现这个要求很简单,只要在AndroidManifest.xml 里面加入这一行 android :screenOrientation="landscape "(landscape 是横向,portrait 是纵向)。

    在android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置。在activity加上android:configChanges="keyboardHidden|orientation"属性,就不会重启activity.而是去调用onConfigurationChanged(Configuration newConfig). 这样就可以在这个方法里调整显示方式.

 MainActivity中: 

 
  1. public void onConfigurationChanged(Configuration newConfig) {  
  2.         try {  
  3.             super.onConfigurationChanged(newConfig);  
  4.             if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {  
  5.                 Log.v("Himi", "onConfigurationChanged_ORIENTATION_LANDSCAPE");  
  6.             } else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {  
  7.                 Log.v("Himi", "onConfigurationChanged_ORIENTATION_PORTRAIT");  
  8.             }  
  9.         } catch (Exception ex) {  
  10.         }  
  11.     } 

AndroidManifest.xml中: 

 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     package="com.himi" android:versionCode="1" android:versionName="1.0"> 
  4.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  5.         <activity android:name=".MainActivity" android:label="@string/app_name" 
  6.             android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation"> 
  7.             <intent-filter> 
  8.                 <action android:name="android.intent.action.MAIN" /> 
  9.                 <category android:name="android.intent.category.LAUNCHER" /> 
  10.             </intent-filter> 
  11.         </activity> 
  12.     </application> 
  13.     <uses-sdk android:minSdkVersion="4" /> 
  14. </manifest>  










本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/606149,如需转载请自行联系原作者

目录
相关文章
|
18天前
|
安全 Shell Android开发
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
Android系统 init.rc sys/class系统节点写不进解决方案和原理分析
30 0
|
1月前
|
XML Android开发 数据格式
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
android点击FrameLayout、LinearLayout等父布局没响应的原因以及解决方案
32 2
|
3月前
|
Android开发
【Bug】Android resource linking failed和error: failed linking references.
【Bug】Android resource linking failed和error: failed linking references.
|
XML Java Android开发
Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案
Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案
1360 0
Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案
|
5天前
|
Android开发
Android中Glide加载Https图片失败的解决方案
Android中Glide加载Https图片失败的解决方案
14 1
|
18天前
|
安全 编译器 API
Android HAL深入探索(5): 调试HAL报错与解决方案
Android HAL深入探索(5): 调试HAL报错与解决方案
25 1
|
18天前
|
存储 应用服务中间件 网络安全
Android 网络链接稳定性测试解决方案
Android 网络链接稳定性测试解决方案
20 0
|
27天前
|
编译器 调度 Android开发
构建高效Android应用:Kotlin协程的优雅解决方案
【4月更文挑战第14天】 在移动开发领域,性能优化和资源管理是提升用户体验的关键因素。随着Kotlin语言在Android平台上的普及,协程作为其核心特性之一,为开发者提供了一种轻量级的并发处理手段。本文将深入探讨Kotlin协程在Android应用中的运用,通过实例分析其如何简化异步任务,提升应用响应性,并保证代码的简洁与可维护性。我们将透过源码剖析、性能对比及最佳实践,揭示协程在现代Android开发中的重要角色。
|
2月前
|
JSON Android开发 数据格式
android 使用GSON 序列化对象出现字段被优化问题解决方案
android 使用GSON 序列化对象出现字段被优化问题解决方案
|
9月前
|
IDE Java 开发工具
Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8的解决方案
Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8的解决方案