2026年11月1日 · 今日 0 帖 · 会员 6.1万 · 主题 17.4万
登录 · 注册 · 游客,欢迎随便逛逛
返回版块
只看作者:洞房 查看全部
1000
Lv9有为九子能等级图标
勋章勋章勋章勋章勋章
帖子
9.3万
回复
2,089
积分
60.3万
注册
2006-12-06
[怀旧国机]

Android中通过按键旋转屏幕

[复制链接]
查看 145 回复 0
楼主 发表于 | 查看全部

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键即可实现屏幕旋转。

登录回复

登录后可以回复这个帖子。旧账号可使用原密码登录。

登录 注册新号
← 返回版块