Android设置系统UI可见性

/**
 * 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开源代码。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值