gpt4 book ai didi

android - 隐藏导航按钮会导致 surfaceView 移动和快速触摸时响应不佳

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:49 24 4
gpt4 key购买 nike

我正在开发视频 Streming 应用。我想隐藏导航按钮,但 SurfaceView 位置从实际中心转换为新中心。我阅读了有关使用沉浸式全屏模式的信息,但我希望应用程序在 android 4.0+ 中运行。 Immersive 仅适用于 4.4。

此外,如果我快速触摸,隐藏功能将无法正常工作。如果我使用 Visibility.GONE 与 Visibility.SYSTEM_UI_FLAG_HIDE_NAVIGATION 隐藏工作正常(快速触摸),但重新居中问题仍然存在。GONE 和 SYSTEM_UI_FLAG_HIDE_NAVIGATION 都会出现重新居中移动问题。

SurfaceView 锚定到中心:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/Black">

<SurfaceView
android:id="@+id/videoSurface"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />

<LinearLayout android:orientation="horizontal"
android:id="@+id/channelList"
android:background="#2000"
android:paddingLeft="5.0dip" android:paddingTop="5.0dip" android:paddingBottom="5.0dip" android:layout_width="wrap_content" android:layout_height="80.0dip">
<!-- Inserted dynamically -->
</LinearLayout>

</RelativeLayout>

Java Activity相关代码:

public class VideoActivity extends Activity {
...
//Prepare Screen (FULLSCREEN)
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
...

mVideoSurfaceView = (SurfaceView) findViewById(R.id.videoSurface);
mVideoSurfaceView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View paramAnonymousView, MotionEvent paramAnonymousMotionEvent) {
Log.d("UiVisibility", "onTouch");

VideoActivity.this.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
return false;
}
});

// Synchronize the other elements (from android docs)
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
Log.d("UiVisibility", "onSystemUiVisibilityChange - bool " + String.valueOf((visibility & View.GONE) == 0));
// Note that system bars will only be "visible" if none of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
// TODO: The system bars are visible. Make any desired
// adjustments to your UI, such as showing the action bar or
// other navigational controls.
VideoActivity.this.findViewById(R.id.channelScroll).setVisibility(View.VISIBLE);
getActionBar().show();
} else {
// TODO: The system bars are NOT visible. Make any desired
// adjustments to your UI, such as hiding the action bar or
// other navigational controls.
VideoActivity.this.findViewById(R.id.channelScroll).setVisibility(View.GONE);
getActionBar().hide();
}
}
});
}

最佳答案

我已经解决了这个问题:

在 Activity 中我定义:

  private static int LAYOUT_FLAGS= View.SYSTEM_UI_FLAG_LAYOUT_STABLE
|View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
|View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
private static int HIDE_FLAGS=LAYOUT_FLAGS |View.SYSTEM_UI_FLAG_FULLSCREEN
|View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
  • LAYOUT_FLAGS 将布局设​​置为隐藏状态栏和导航栏。并使内部布局在隐藏或显示条形图时不会移动。
  • HIDE_FLAGS 使隐藏生效。

在 onCreate() 中

...
//Prepare Screen (FULLSCREEN)
requestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
...
//onClick - Hide System UI (Only for hidden, show events are handler by the system)
mVideoSurfaceView = (SurfaceView) findViewById(R.id.videoSurface);
mVideoSurfaceView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Log.d("UiVisibility", "onClick");
hideUI();
}
});

//Synchronize my bars with System UI hidding
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener (new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
Log.d("UiVisibility", "onSystemUiVisibilityChange - bool " + String.valueOf((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0));
// Note that system bars will only be "visible" if none of the
// LOW_PROFILE, HIDE_NAVIGATION, or FULLSCREEN flags are set.
if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
// The system bars are visible. Make any desired
// adjustments to your UI
VideoActivity.this.findViewById(R.id.channelScroll).setVisibility(View.VISIBLE);
//getActionBar().show();
mIsListChannelVisible=true;
} else {
// The system bars are NOT visible. Make any desired
// adjustments to your UI.
VideoActivity.this.findViewById(R.id.channelScroll).setVisibility(View.GONE);
//getActionBar().hide();
mIsListChannelVisible=false;
}
}
});

显示和隐藏方法:

// Hide need a delay to wait nav bar transition is completed. (fix: too fast click fails)
private void hideUI(){
mVideoSurfaceView.getHandler().postDelayed(new Runnable(){
@Override
public void run() {
VideoActivity.this.getWindow().getDecorView().setSystemUiVisibility(HIDE_FLAGS);
}
},600);
}

private void showUI(){
VideoActivity.this.getWindow().getDecorView().setSystemUiVisibility(0);
}

我的自定义栏被导航栏覆盖了,修复它:在 myLayout.xml 中设置 fitSystemWindows=true

<HorizontalScrollView
android:fitsSystemWindows="true"
android:id="@+id/channelScroll"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true" >

它工作完美。

关于android - 隐藏导航按钮会导致 surfaceView 移动和快速触摸时响应不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22066047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com