Android设置系统UI可见性

来源:互联网 发布:刘梓晨直播软件 编辑:程序博客网 时间:2024/05/29 15:18
/** * Activity演示了使用系统用户界面UI来实现内容浏览器风格的用户界面(如阅读器界面)。 *  * @description: * @author ldm * @date 2016-5-24 下午4:03:51 */@SuppressWarnings("deprecation")public class ContentBrowserActivity extends Activity implements        OnQueryTextListener, ActionBar.TabListener {    private Content mContent;    /**     * 自定义ScrollView,管理系统UI     *      * @description:View.OnSystemUiVisibilityChangeListener注册监听器来监听系统UI可见性的变化     * @author ldm     * @date 2016-5-24 下午3:43:21     */    public static class Content extends ScrollView implements            View.OnSystemUiVisibilityChangeListener, View.OnClickListener {        private TextView mText;        private TextView mTitleView;        private SeekBar mSeekView;        // SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:Activity全屏显示,但状态栏不会被隐藏覆盖,状态栏依然可见,Activity顶端布局部分会被状态遮住。        int mBaseSystemUiVisibility = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                | SYSTEM_UI_FLAG_LAYOUT_STABLE;// SYSTEM_UI_FLAG_LAYOUT_STABLE:防止系统栏隐藏时内容区域大小发生变化        int mLastSystemUiVis;        Runnable mNavHider = new Runnable() {            @Override            public void run() {                setNavVisibility(false);            }        };        public Content(Context context, AttributeSet attrs) {            super(context, attrs);            mText = new TextView(context);            mText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);            mText.setText(context                    .getString(R.string.alert_dialog_two_buttons2ultra_msg));            mText.setClickable(false);            mText.setOnClickListener(this);            mText.setTextIsSelectable(true);            // 给ScrollView中添加子控件            addView(mText, new ViewGroup.LayoutParams(                    ViewGroup.LayoutParams.MATCH_PARENT,                    ViewGroup.LayoutParams.WRAP_CONTENT));            // 设置系统 UI可见性变化监听            setOnSystemUiVisibilityChangeListener(this);        }        /**         * 初始化标题及SeekBar拖动条         *          * @description:         * @author ldm         * @date 2016-5-24 下午4:00:37         */        public void init(TextView title, SeekBar seek) {            mTitleView = title;            mSeekView = seek;            // 设置状态栏可见            setNavVisibility(true);        }        @Override        public void onSystemUiVisibilityChange(int visibility) {            int diff = mLastSystemUiVis ^ visibility;            mLastSystemUiVis = visibility;            if ((diff & SYSTEM_UI_FLAG_LOW_PROFILE) != 0                    && (visibility & SYSTEM_UI_FLAG_LOW_PROFILE) == 0) {                // 设置导状态栏可见                setNavVisibility(true);            }        }        // 当窗口中包含的可见的view发生变化时触发。        @Override        protected void onWindowVisibilityChanged(int visibility) {            super.onWindowVisibilityChanged(visibility);            setNavVisibility(true);            getHandler().postDelayed(mNavHider, 2000);        }        @Override        protected void onScrollChanged(int l, int t, int oldl, int oldt) {            super.onScrollChanged(l, t, oldl, oldt);            // 滚动过程中,状态栏隐藏            setNavVisibility(false);        }        @Override        public void onClick(View v) {            // 当用户点击 操作时,进行状态栏设置            int curVis = getSystemUiVisibility();            setNavVisibility((curVis & SYSTEM_UI_FLAG_LOW_PROFILE) != 0);        }        void setBaseSystemUiVisibility(int visibility) {            mBaseSystemUiVisibility = visibility;        }        void setNavVisibility(boolean visible) {            int newVis = mBaseSystemUiVisibility;            if (!visible) {                // SYSTEM_UI_FLAG_LOW_PROFILE:状态栏显示处于低能显示状态(low                // profile模式),状态栏上一些图标显示会被隐藏。                // SYSTEM_UI_FLAG_FULLSCREEN:Activity全屏显示,且状态栏被隐藏覆盖掉。                newVis |= SYSTEM_UI_FLAG_LOW_PROFILE                        | SYSTEM_UI_FLAG_FULLSCREEN;            }            // 获取状态栏当前可见性            final boolean changed = newVis == getSystemUiVisibility();            if (changed || visible) {                Handler h = getHandler();                if (h != null) {                    h.removeCallbacks(mNavHider);                }            }            // 设置可见性            setSystemUiVisibility(newVis);            mTitleView.setVisibility(visible ? VISIBLE : INVISIBLE);            mSeekView.setVisibility(visible ? VISIBLE : INVISIBLE);        }    }    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // 标题栏显示在内容上面        getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);        setContentView(R.layout.content_browser);        mContent = (Content) findViewById(R.id.content);        mContent.init((TextView) findViewById(R.id.title),                (SeekBar) findViewById(R.id.seekbar));        // 添加Tab        ActionBar bar = getActionBar();        bar.addTab(bar.newTab().setText("Tab 1").setTabListener(this));        bar.addTab(bar.newTab().setText("Tab 2").setTabListener(this));        bar.addTab(bar.newTab().setText("Tab 3").setTabListener(this));    }    @Override    public boolean onCreateOptionsMenu(Menu menu) {        MenuInflater inflater = getMenuInflater();        inflater.inflate(R.menu.content_actions, menu);        //搜索功能        SearchView searchView = (SearchView) menu.findItem(R.id.action_search)                .getActionView();        searchView.setOnQueryTextListener(this);        MenuItem actionItem = menu                .findItem(R.id.menu_item_share_action_provider_action_bar);        ShareActionProvider actionProvider = (ShareActionProvider) actionItem                .getActionProvider();        actionProvider                .setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);        // 分享操作        Intent shareIntent = new Intent(Intent.ACTION_SEND);        shareIntent.setType("image/*");        Uri uri = Uri.fromFile(getFileStreamPath("shared.png"));        shareIntent.putExtra(Intent.EXTRA_STREAM, uri);        actionProvider.setShareIntent(shareIntent);        return true;    }    @Override    public void onAttachedToWindow() {        super.onAttachedToWindow();    }    @Override    protected void onResume() {        super.onResume();    }    /**     * 对菜单项目进行操作     */    @SuppressLint("InlinedApi")    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {        case R.id.show_tabs://显示ActionBar            getActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);            item.setChecked(true);            return true;        case R.id.hide_tabs://隐藏ActionBar            getActionBar()                    .setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);            item.setChecked(true);            return true;        case R.id.stable_layout://设置状态栏是否保持可见状态            item.setChecked(!item.isChecked());            mContent.setBaseSystemUiVisibility(item.isChecked() ? View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE                    : View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);            return true;        }        return false;    }    @Override    public boolean onQueryTextChange(String newText) {        return true;    }    @Override    public boolean onQueryTextSubmit(String query) {        Toast.makeText(this, "Searching for: " + query + "...",                Toast.LENGTH_SHORT).show();        return true;    }    @Override    public void onTabSelected(Tab tab, FragmentTransaction ft) {    }    @Override    public void onTabUnselected(Tab tab, FragmentTransaction ft) {    }    @Override    public void onTabReselected(Tab tab, FragmentTransaction ft) {    }}

主页面布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <view        android:id="@+id/content"        android:layout_width="match_parent"        android:layout_height="match_parent"        class="com.example.android.apis.view.ContentBrowserActivity$Content" />    <FrameLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:animateLayoutChanges="true"        android:fitsSystemWindows="true" >        <TextView            android:id="@+id/title"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_gravity="top|center_horizontal"            android:background="#c0ffffff"            android:gravity="center"            android:padding="16dp"            android:text="A title goes here"            android:textAppearance="?android:attr/textAppearanceLarge"            android:textColor="#ff000000" />        <SeekBar            android:id="@+id/seekbar"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:layout_gravity="bottom|center_horizontal"            android:layout_marginBottom="16dp" />    </FrameLayout></FrameLayout>

详细的菜单布局等文件可以参考:
https://github.com/ldm520/ANDROID_API_DEMOS等Android官方API开源代码。

0 0