화면 주위를 돌아 다니는 작은 스프라이트 애니메이션을 만드는 앱을 만들고 있습니다.방향을 변경 한 후에 전체 화면 오버레이를 전체 화면으로 유지하려면 어떻게해야합니까?
"start service"버튼이있는 주요 활동이 있습니다. 그러면 (onCreate()
에서) 전체 화면보기가 만들어지고 루트 창 관리자에 연결되는 서비스가 시작됩니다.
이 부분은 완벽하게 작동합니다. 그것은 화면을 채우고, 당신은 응용 프로그램을 떠날 수 있고, 애니메이션은 모든 것을 볼 수 있습니다. 당신이 장치를 회전 할 때
문제
가 나온다.스프라이트가 화면의 중앙으로 이동하지만,이 관계가없는 문제가있다; 여기서 중요한 것은 어두운 경계 상자입니다.이 상자는 내가 그릴 수있는 캔버스를 보여주고 전체 화면을 채울 필요가 있습니다.
다른 모든 레이아웃이 보이지만보기가 여전히 세로 모드입니다. 올바르게 업데이트되었습니다.
일부 문제는 뷰의 크기를 어떻게 지정했는지에 따라 결정됩니다. "전체 화면"을 지정하기 위해 플래그를 사용했으나 이 아니며은 화면의 크기와 일치하도록 화면의 width
및 height
을 설정했습니다. 따라서 나는 시작할 때 수동으로 설정해야했다.
보기를 만든 후에보기의 너비와 높이를 업데이트하는 방법을 모르지만 필자는보기의 크기가 캔버스의 크기를 결정하므로 필자는 필자에게 그렇게 느낀다.
public class WalkerService extends Service {
private WalkerView view;
@Override
public void onCreate() {
super.onCreate();
final WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
final DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);
view = new WalkerView(this); // extends SurfaceView
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, // TYPE_SYSTEM_ALERT is denied in apiLevel >=19
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
PixelFormat.TRANSLUCENT
);
view.setFitsSystemWindows(false); // allow us to draw over status bar, navigation bar
// here I _manually_ set the dimensions, because otherwise it defaults to a square (something like 1024x1024)
params.width = metrics.widthPixels;
params.height = metrics.heightPixels;
wm.addView(view, params);
}
}
나는 방향 변경을 수신했는데, 그렇게되면 뷰를 회전 한 :
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
view.setRotation(
newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE
? 90.0f
: 0.0f
);
}
그러나 setRotation()
가 영향을 보이지 않았다
내 서비스는보기과 같이 생성 내보기의 width
및 height
도 캔버스가 렌더링 된 각도를 변경하지 않았습니다.
전체 화면 오버레이를 만드는 방법을 근본적으로 잘못 알고 있습니까? 방향에 관계없이 (심지어 내 앱이 활성 앱이 아닌 경우에도) 전체 화면을 그릴 수있는 기능을 유지하려면 어떻게해야합니까?
아마 Window Service의 윈도우 관리자에 내 뷰를 첨부하는 것과 관련이 있습니다. 아마도 내 뷰에 이상한 부모가 있습니다 (아마도 루트 뷰가 오리 엔테이션의 영향을받지 않을 것이라고 생각할 수 있습니다. 어린이가 채우기 위해 스트레칭 할 경계가 정의되지 않음).
여기서 유용한 정보를 생략 한 경우 전체 소스 코드는 public on GitHub입니다.
WalkerView.java
이 특히 적합 할 수 있으므로 here it is 일 수 있습니다.
이건이 문제와 중복되는 것 같아요. http://stackoverflow.com/a/10107525/5870896 –
조회수 2는 어떻습니까?하나는 세로 용이고 다른 하나는 올바른 너비와 높이가있는 가로 용입니다. 방향 변경이 발생하면 관련없는보기를 제거하고 유효한보기를 windowmanager에 추가하십시오. –
@SecretCoder 내 코드가 내 코드를 작성하는 데 사용한 참조 중 하나이기 때문에 내 코드가 이미 해당 질문에 대한 답을 닮았다고 생각합니다. 유일한 차이점은 링크 된 응답은 인플레이레이터를 사용하여 뷰에 대한 참조를 잡는 반면 내 코드는 서비스에서 뷰 인라인의 인스턴스를 구성한다는 것입니다. 나는 그 대답에 필적할만한 코드를 가지고 있고 문제를 경험할 때 : 나는 연결된 문제가 내 질문에 답하지 않고 따라서 같은 문제가 아니라고 말할 것이다. – Birchlabs