我正在开发一个视频Streming应用.我想隐藏导航按钮,但SurfaceVIEw的位置已从实际中心转换为新中心.
我读过有关使用沉浸式全屏模式的信息,但我希望应用程序在android 4.0中工作.沉浸式仅适用于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活动相关代码:
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(); } } });}
解决方法:
我已经解决了这个问题:
在活动中,我定义:
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" >
完美的作品.
总结以上是内存溢出为你收集整理的隐藏导航按钮会导致SurfaceView中的移动以及快速触摸中的不良响应全部内容,希望文章能够帮你解决隐藏导航按钮会导致SurfaceView中的移动以及快速触摸中的不良响应所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)