edit_note帖子
455
stars积分
28,782
event加入
2012-03-09
怀旧国机
Android中通过按键旋转屏幕
schedule发表于 2012-11-07 04:51:00
visibility查看 144
chat_bubble回复 2
#1 楼主
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 == a
ctivity*.screen_orientation_landscape) {
ro = activity*.screen_orientation_portrait;
} else {
ro = activity*.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, m*enabled);
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(“*“, “rotation failed “);
+ }
+ }
+ return true;
}
ok,重新编译后,长按menu键即可实现屏幕旋转。
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 == a
ctivity*.screen_orientation_landscape) {
ro = activity*.screen_orientation_portrait;
} else {
ro = activity*.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, m*enabled);
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(“*“, “rotation failed “);
+ }
+ }
+ return true;
}
ok,重新编译后,长按menu键即可实现屏幕旋转。
全部回复 (2)
2012-11-07 05:47:00
沙发
加入繁花家族,铸就中国红客道路!
2012-11-07 07:55:00
板凳
亲,加入创世纪,一起创奇迹!加入后戴好家帽,即可获得3999币币哦,只求一辈子的兄弟姐妹,朋友,加入创世纪吧!
登录 后才能回复
flag举报帖子