您的位置:首页 > 移动开发 > Android开发

Android中通过按键旋转屏幕

2011-06-22 15:44 288 查看
Q5有个功能,通过长按menu按键,可以旋转屏幕方向(0°或者90°),这个功能有时蛮有用的,下面来看看是如何实现的:

1 修改按键处理程序

frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java

函数

public boolean interceptKeyTi(WindowState win, int code, int metaKeys, boolean down,

int repeatCount, int flags)

在处理菜单键的地方

if (code == KeyEvent.KEYCODE_MENU) {

final int chordBug = KeyEvent.META_SHIFT_ON;

if (down && repeatCount == 0) {

if (mEnableShiftMenuBugReports && (metaKeys & chordBug) == chordBug) {

Intent intent = new Intent(Intent.ACTION_BUG_REPORT);

mContext.sendOrderedBroadcast(intent, null);

return true;

} else if (SHOW_PROCESSES_ON_ALT_MENU &&

(metaKeys & KeyEvent.META_ALT_ON) == KeyEvent.META_ALT_ON) {

Intent service = new Intent();

service.setClassName(mContext, "com.android.server.LoadAverageService");

ContentResolver res = mContext.getContentResolver();

boolean shown = Settings.System.getInt(

res, Settings.System.SHOW_PROCESSES, 0) != 0;

if (!shown) {

mContext.startService(service);

} else {

mContext.stopService(service);

}

Settings.System.putInt(

res, Settings.System.SHOW_PROCESSES, shown ? 0 : 1);

return true;

}

}

//上面是原来的内容,下面是添加的新内容

else if (down && repeatCount == 20 && MenuKeyUp && (!keyguardOn)) {

//如果按下Menu键一定时间,抬起时执行此段函数

MenuKeyUp = false;

try {

int ro = mWindowManager.getRotation(); //获取当前方向

if( ro == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE ) {

ro = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;

} else {

ro = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;

}

}

catch (RemoteException e) {

Log.v(TAG, "!!! getRotation fail !!!");

}

try {

//旋转屏幕

mWindowManager.setRotation(ro, true, Surface.FLAGS_ORIENTATION_ANIMATION_DISABLE);

//最后可跟不同的参数,可实现一些旋转效果

}

catch (RemoteException e) {

Log.v(TAG, "!!! mWindowManager.setRotation fail !!!");

}

return true;

}

if(!down) {

MenuKeyUp = true;

}

}

2 修改实现选择的函数

/frameworks/base/services/java/com/android/server/WindowManagerService.java

找到该函数

public boolean setRotationUncheckedLocked(int rotation, int animFlags)

将以下妨碍选择的内容注释掉

//rotation = mPolicy.rotationForOrientationLw(mForcedAppOrientation,

// mRotation, mDisplayEnabled);

3、当然也可以新作一个rotate键来选择屏幕,以下是引用代码

+ } else if (code == KeyEvent.KEYCODE_ROTATE) {

+ // ROTATE KEY pressed

+ if (down) {

+ mButtonPushFlg = true;

+

+ try {

+ int ro = mWindowManager.getRotation(); // Orientation vertical

+ if (ro == 3 ) {

+ mWindowManager.setRotation (Surface.ROTATION_0,true,mFancyRotationAnimation); //Orientation

landscape

+ } else {

+ mWindowManager.setRotation

(Surface.ROTATION_270,true,mFancyRotationAnimation); //Orientation

portlate

+ }

+ } catch (RemoteException e) {

+ // Igbore

+ Log.i("info", "Rotation failed ");

+ }

+ }

+ return true;

}

OK,重新编译后,长按Menu键即可实现屏幕旋转。

要学好嵌入式,还是建议买一个开发板,这样学习来会更快!

推荐下面4款,你可以根据你的经济能力来选一个

1、高级嵌入式开发板 ARM-A8内核,价格在2200~2700

X-210开发板(代码开放度高,XBOOT很牛)

Mini210开发板 (友善的板子,有沉淀)

2、入门级嵌入式开发板 ARM11内核 ,价格在500~650之间

Tiny6410 (友善之臂经典之作)

OK6410 (特点是支持WINCE7.0)

可以去风火轮团队的店里看一下,在他们那里买开发板有个好处,他们提供更周到的技术支持

风火轮技术开发团队 www.arm-cn.com
官方淘宝店:smartfire.taobao.com

http://blog.csdn.net/linweig/archive/2011/02/24/6205145.aspx
原文:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: