隐藏导航按钮会导致SurfaceView中的移动以及快速触摸中的不良响应

概述我正在开发一个视频Streming应用.我想隐藏导航按钮,但SurfaceView的位置已从实际中心转换为新中心.我读过有关使用沉浸式全屏模式的信息,但我希望应用程序在android4.0中工作.沉浸式仅适用于4.4.此外,如果我触摸很快,隐藏起来将无法正常工作.如果我将Visibility.GONE与Visibilit

我正在开发一个视频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中的移动以及快速触摸中的不良响应所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1211339.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存