• 音乐APP首页框架搭建


    项目采用组件化架构,如下图所示

    在这里插入图片描述

    首页搭建思路

    在这里插入图片描述

    布局编写

    总体布局采用DrawerLayout 实现左侧滑动到菜单区,首页主内存区实现Viewpager和指示器

    <androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/color_white">
    
        
        <RelativeLayout
            android:id="@+id/content_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/color_white">
    
            <RelativeLayout
                android:id="@+id/title_layout"
                android:layout_width="match_parent"
                android:layout_height="45dp"
                android:layout_marginStart="15dp"
                android:layout_marginEnd="15dp">
    
                <TextView
                    android:id="@+id/toggle_view"
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:layout_alignParentStart="true"
                    android:layout_centerVertical="true"
                    android:background="@mipmap/category" />
    
                <TextView
                    android:id="@+id/search_view"
                    android:layout_width="20dp"
                    android:layout_height="20dp"
                    android:layout_alignParentEnd="true"
                    android:layout_centerVertical="true"
                    android:background="@mipmap/b_p" />
    
                <net.lucode.hackware.magicindicator.MagicIndicator
                    android:id="@+id/magic_indicator"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_centerHorizontal="true"
                    android:layout_centerVertical="true"
                    android:layout_marginStart="42dp"
                    android:layout_marginEnd="42dp"
                    android:layout_toStartOf="@id/search_view"
                    android:layout_toEndOf="@id/toggle_view" />
    
            RelativeLayout>
    
            <com.imooc.lib_audio.mediaplayer.view.BottomMusicView
                android:id="@+id/bottom_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true" />
    
            <androidx.viewpager.widget.ViewPager
                android:id="@+id/view_pager"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_above="@id/bottom_view"
                android:layout_below="@id/title_layout" />
    
        RelativeLayout>
    
        
        <RelativeLayout
            android:id="@+id/left_drawer_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:layout_marginEnd="25dp"
            android:background="@color/color_white">
    
            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_above="@id/divider"
                android:scrollbars="none">
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
    
                    <RelativeLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content">
    
                        <ImageView
                            android:id="@+id/avatr_view"
                            android:layout_width="150dp"
                            android:layout_height="150dp"
                            android:layout_centerHorizontal="true"
                            android:layout_marginTop="20dp"
                            android:visibility="gone" />
    
                        <LinearLayout
                            android:id="@+id/unloggin_layout"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:orientation="vertical">
    
                            <TextView
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="20dp"
                                android:gravity="center"
                                android:text="@string/home_login_tip"
                                android:textColor="@color/color_333333"
                                android:textSize="13sp" />
    
                            <TextView
                                android:layout_width="match_parent"
                                android:layout_height="wrap_content"
                                android:layout_marginTop="2dp"
                                android:gravity="center"
                                android:text="@string/home_login_tip_2"
                                android:textColor="@color/color_333333"
                                android:textSize="13sp" />
    
                            <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:layout_gravity="center_horizontal"
                                android:layout_marginTop="20dp"
                                android:background="@drawable/bg_home_login"
                                android:paddingStart="40dp"
                                android:paddingTop="5dp"
                                android:paddingEnd="40dp"
                                android:paddingBottom="5dp"
                                android:text="@string/home_login"
                                android:textColor="@color/color_333333"
                                android:textSize="15sp" />
                        LinearLayout>
                    RelativeLayout>
    
                    <LinearLayout
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="35dp"
                        android:orientation="horizontal"
                        android:paddingStart="30dp"
                        android:paddingEnd="30dp">
    
                        <com.imooc.lib_commin_ui.VerticalItemView
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_weight="1"
                            app:icon="@mipmap/abi"
                            app:iconHeight="35dp"
                            app:iconWidth="35dp"
                            app:infoText="我的消息"
                            app:infoTextColor="@color/color_333333"
                            app:infoTextMarginTop="5dp"
                            app:infoTextSize="11sp"
                            app:tipBg="@drawable/bg_home_tip"
                            app:tipPaddingRight="2dp"
                            app:tipPaddingTop="2dp"
                            app:tipText="1"
                            app:tipTextColor="@color/color_white"
                            app:tipTextSize="11sp" />
    
                        <com.imooc.lib_commin_ui.VerticalItemView
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_weight="1"
                            app:icon="@mipmap/abj"
                            app:iconHeight="35dp"
                            app:iconWidth="35dp"
                            app:infoText="我的好友"
                            app:infoTextColor="@color/color_333333"
                            app:infoTextMarginTop="5dp"
                            app:infoTextSize="11sp"
                            app:tipBg="@drawable/bg_home_tip"
                            app:tipPaddingRight="2dp"
                            app:tipPaddingTop="2dp"
                            app:tipText="1"
                            app:tipTextColor="@color/color_white"
                            app:tipTextSize="11sp" />
    
                        <com.imooc.lib_commin_ui.VerticalItemView
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_weight="1"
                            app:icon="@mipmap/abk"
                            app:iconHeight="35dp"
                            app:iconWidth="35dp"
                            app:infoText="个性换肤"
                            app:infoTextColor="@color/color_333333"
                            app:infoTextMarginTop="5dp"
                            app:infoTextSize="11sp"
                            app:tipBg="@drawable/bg_home_tip"
                            app:tipPaddingRight="2dp"
                            app:tipPaddingTop="2dp"
                            app:tipText="1"
                            app:tipTextColor="@color/color_white"
                            app:tipTextSize="11sp" />
    
                        <com.imooc.lib_commin_ui.VerticalItemView
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:layout_weight="1"
                            app:icon="@mipmap/abi"
                            app:iconHeight="35dp"
                            app:iconWidth="35dp"
                            app:infoText="听歌识曲"
                            app:infoTextColor="@color/color_333333"
                            app:infoTextMarginTop="5dp"
                            app:infoTextSize="11sp"
                            app:tipBg="@drawable/bg_home_tip"
                            app:tipPaddingRight="2dp"
                            app:tipPaddingTop="2dp"
                            app:tipText="1"
                            app:tipTextColor="@color/color_white"
                            app:tipTextSize="11sp" />
                    LinearLayout>
    
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="0.5dp"
                        android:layout_margin="20dp"
                        android:background="#dddddd" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/anc"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:rightText="林志颖北京"
                        app:tileText="演出" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/and"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:rightText="JBL耳机78元"
                        app:tileText="商城" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/ane"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:tileText="附近的人" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/anf"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:tileText="口袋铃声" />
    
                    <View
                        android:layout_width="match_parent"
                        android:layout_height="0.5dp"
                        android:layout_margin="20dp"
                        android:background="#dddddd" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/ang"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:tileText="定时停止播放" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:id="@+id/home_qrcode"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/anh"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:tileText="扫一扫" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:id="@+id/home_music"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/ani"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:tileText="音乐闹钟" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:id="@+id/online_music_view"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/anj"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:tileText="在线听歌免流量" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/ank"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:tileText="游戏推荐" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/anl"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:tileText="优惠卷" />
    
                    <com.imooc.lib_commin_ui.HornizeItemView
                        android:id="@+id/check_update_view"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:hIcon="@mipmap/anm"
                        app:hTipVisiblity="false"
                        app:paddingLeft="20dp"
                        app:paddingRight="20dp"
                        app:tileText="检查更新" />
                LinearLayout>
            ScrollView>
    
            <View
                android:id="@+id/divider"
                android:layout_width="match_parent"
                android:layout_height="0.5dp"
                android:layout_alignTop="@id/operator_view"
                android:background="#dddddd" />
    
            <LinearLayout
                android:id="@+id/operator_view"
                android:layout_width="match_parent"
                android:layout_height="52dp"
                android:layout_alignParentBottom="true"
                android:orientation="horizontal">
    
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="3"
                    android:gravity="center"
                    android:orientation="horizontal">
    
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:src="@mipmap/baz" />
    
                    <View
                        android:layout_width="6dp"
                        android:layout_height="match_parent" />
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="夜间模式"
                        android:textColor="@color/color_333333"
                        android:textSize="15sp" />
                LinearLayout>
    
                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="2"
                    android:gravity="center"
                    android:orientation="horizontal">
    
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:src="@mipmap/bb1" />
    
                    <View
                        android:layout_width="6dp"
                        android:layout_height="match_parent" />
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="设置"
                        android:textColor="@color/color_333333"
                        android:textSize="15sp" />
                LinearLayout>
    
                <LinearLayout
                    android:id="@+id/exit_layout"
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:layout_weight="2"
                    android:gravity="center"
                    android:orientation="horizontal">
    
                    <ImageView
                        android:layout_width="20dp"
                        android:layout_height="20dp"
                        android:src="@mipmap/baq" />
    
                    <View
                        android:layout_width="6dp"
                        android:layout_height="match_parent" />
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="退出"
                        android:textColor="@color/color_333333"
                        android:textSize="15sp" />
                LinearLayout>
    
            LinearLayout>
    
        RelativeLayout>
    androidx.drawerlayout.widget.DrawerLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378
    • 379
    • 380
    • 381
    • 382
    • 383
    • 384
    • 385
    • 386
    • 387
    • 388
    • 389
    • 390
    • 391
    • 392
    • 393
    • 394
    • 395
    • 396
    • 397
    • 398
    • 399
    • 400
    • 401
    • 402
    • 403
    • 404
    • 405
    • 406
    • 407
    • 408
    • 409
    • 410
    • 411
    • 412
    • 413
    • 414
    • 415
    • 416
    • 417
    • 418
    • 419
    • 420
    • 421
    • 422
    • 423
    • 424
    • 425
    • 426
    • 427
    • 428

    指示器初始化

    通过枚举封装首页卡片类型,分为我的、发现、朋友、视频,将指示器和viewpager绑定

    public enum CHANNEL {
    
      MY("我的", 0x01),
    
      DISCORY("发现", 0x02),
    
      FRIEND("朋友", 0x03),
    
      VIDEO("视频", 0x04);
    
      //所有类型标识
      public static final int MINE_ID = 0x01;
      public static final int DISCORY_ID = 0x02;
      public static final int FRIEND_ID = 0x03;
      public static final int VIDEO_ID = 0x04;
    
      private final String key;
      private final int value;
    
      CHANNEL(String key, int value) {
        this.key = key;
        this.value = value;
      }
    
      public int getValue() {
        return value;
      }
    
      public String getKey() {
        return key;
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
        private void initMagicIndicator() {
            MagicIndicator magicIndicator = findViewById(R.id.magic_indicator);
            magicIndicator.setBackgroundColor(Color.WHITE);
            CommonNavigator commonNavigator = new CommonNavigator(this);
            commonNavigator.setAdjustMode(true);
            commonNavigator.setAdapter(new CommonNavigatorAdapter() {
                @Override
                public int getCount() {
                    return CHANNELS == null ? 0 : CHANNELS.length;
                }
    
                @Override
                public IPagerTitleView getTitleView(Context context, final int index) {
                    SimplePagerTitleView simplePagerTitleView = new ScaleTransitionPagerTitleView(context);
                    simplePagerTitleView.setText(CHANNELS[index].getKey());
                    simplePagerTitleView.setTextSize(19);
                    simplePagerTitleView.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
                    simplePagerTitleView.setNormalColor(Color.parseColor("#999999"));
                    simplePagerTitleView.setSelectedColor(Color.parseColor("#333333"));
                    simplePagerTitleView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            mViewPager.setCurrentItem(index);
                        }
                    });
                    return simplePagerTitleView;
                }
    
                @Override
                public IPagerIndicator getIndicator(Context context) {
                    return null;
                }
    
                @Override
                public float getTitleWeight(Context context, int index) {
                    return 1.0f;
                }
            });
            magicIndicator.setNavigator(commonNavigator);
            ViewPagerHelper.bind(magicIndicator, mViewPager);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    viewpager初始化

    不使用传入fragment的list,防止卡顿,每次点击的时候再创建一个newInstance

    public class HomePagerAdapter extends FragmentPagerAdapter {
    
        private CHANNEL[] mList;
    
        public HomePagerAdapter(FragmentManager fm, CHANNEL[] datas) {
            super(fm);
            mList = datas;
        }
    
        //这种方式,避免一次性创建所有的framgent
        @Override
        public Fragment getItem(int position) {
            int type = mList[position].getValue();
            switch (type) {
                case CHANNEL.MINE_ID:
                    return MineFragment.newInstance();
                case CHANNEL.DISCORY_ID:
                    return DiscoryFragment.newInstance();
                case CHANNEL.FRIEND_ID:
                    return FriendFragment.newInstance();
                case CHANNEL.VIDEO_ID:
                    return VideoFragment.Companion.newInstance();
            }
            return null;
        }
    
        @Override
        public int getCount() {
            return mList == null ? 0 : mList.length;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    沉浸式效果开发

    单纯修改配置文件不一定能实现沉浸效果,还需要手动使用代码实现

    
    <resources>
    
      <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        "android:windowTranslucentStatus">false
        
        
        
        "android:statusBarColor">@android:color/transparent
        "android:navigationBarColor">@android:color/white
        "android:fitsSystemWindows">true
        
        "android:windowActivityTransitions">true
      style>
    resources>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在基础ui组件lib_common_ui下创建工具类和BaseActivity

    public class StatusBarUtil {
      /**
       * 修改状态栏为全透明
       */
      public static void transparencyBar(Activity activity) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          Window window = activity.getWindow();
          window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
          window.getDecorView()
              .setSystemUiVisibility(
                  View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
          window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
          window.setStatusBarColor(Color.TRANSPARENT);
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
          Window window = activity.getWindow();
          window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
              WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
      }
    
      /**
       * 状态栏亮色模式,设置状态栏黑色文字、图标,
       * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
       *
       * @return 1:MIUUI 2:Flyme 3:android6.0
       */
      public static void statusBarLightMode(Activity activity) {
        int result = 0;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
          if (miuiSetStatusBarLightMode(activity, true)) {
            result = 1;
          } else if (flymeSetStatusBarLightMode(activity.getWindow(), true)) {
            result = 2;
          } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            activity.getWindow()
                .getDecorView()
                .setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
            result = 3;
          }
        }
      }
    
      /**
       * 已知系统类型时,设置状态栏黑色文字、图标。
       * 适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android
       *
       * @param type 1:MIUUI 2:Flyme 3:android6.0
       */
      public static void statusBarLightMode(Activity activity, int type) {
        if (type == 1) {
          miuiSetStatusBarLightMode(activity, true);
        } else if (type == 2) {
          flymeSetStatusBarLightMode(activity.getWindow(), true);
        } else if (type == 3) {
          activity.getWindow()
              .getDecorView()
              .setSystemUiVisibility(
                  View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
        }
      }
    
      /**
       * 状态栏暗色模式,清除MIUI、flyme或6.0以上版本状态栏黑色文字、图标
       */
      public static void StatusBarDarkMode(Activity activity, int type) {
        if (type == 1) {
          miuiSetStatusBarLightMode(activity, false);
        } else if (type == 2) {
          flymeSetStatusBarLightMode(activity.getWindow(), false);
        } else if (type == 3) {
          activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
        }
      }
    
      /**
       * 设置状态栏图标为深色和魅族特定的文字风格
       * 可以用来判断是否为Flyme用户
       *
       * @param window 需要设置的窗口
       * @param dark 是否把状态栏文字及图标颜色设置为深色
       * @return boolean 成功执行返回true
       */
      public static boolean flymeSetStatusBarLightMode(Window window, boolean dark) {
        boolean result = false;
        if (window != null) {
          try {
            WindowManager.LayoutParams lp = window.getAttributes();
            Field darkFlag =
                WindowManager.LayoutParams.class.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
            Field meizuFlags = WindowManager.LayoutParams.class.getDeclaredField("meizuFlags");
            darkFlag.setAccessible(true);
            meizuFlags.setAccessible(true);
            int bit = darkFlag.getInt(null);
            int value = meizuFlags.getInt(lp);
            if (dark) {
              value |= bit;
            } else {
              value &= ~bit;
            }
            meizuFlags.setInt(lp, value);
            window.setAttributes(lp);
            result = true;
          } catch (Exception e) {
    
          }
        }
        return result;
      }
    
      /**
       * 需要MIUIV6以上
       *
       * @param dark 是否把状态栏文字及图标颜色设置为深色
       * @return boolean 成功执行返回true
       */
      public static boolean miuiSetStatusBarLightMode(Activity activity, boolean dark) {
        boolean result = false;
        Window window = activity.getWindow();
        if (window != null) {
          Class clazz = window.getClass();
          try {
            int darkModeFlag;
            Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
            Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
            darkModeFlag = field.getInt(layoutParams);
            //noinspection unchecked
            Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
            if (dark) {
              //状态栏透明且黑色字体
              extraFlagField.invoke(window, darkModeFlag, darkModeFlag);
            } else {
              //清除黑色字体
              extraFlagField.invoke(window, 0, darkModeFlag);
            }
            result = true;
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              //开发版 7.7.13 及以后版本采用了系统API,旧方法无效但不会报错,所以两个方式都要加上
              if (dark) {
                activity.getWindow()
                    .getDecorView()
                    .setSystemUiVisibility(
                        View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
              } else {
                activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
              }
            }
          } catch (Exception e) {
    
          }
        }
        return result;
      }
    
      //获取屏幕虚拟键高度
      public static int getVirtualBarHeight(Context context) {
        int vh = 0;
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        DisplayMetrics dm = new DisplayMetrics();
        try {
          @SuppressWarnings("rawtypes") Class c = Class.forName("android.view.Display");
          @SuppressWarnings("unchecked") Method method =
              c.getMethod("getRealMetrics", DisplayMetrics.class);
          method.invoke(display, dm);
          vh = dm.heightPixels - display.getHeight();
        } catch (Exception e) {
          e.printStackTrace();
        }
        return vh;
      }
    
      public static int getStatusBarHeight(Context context) {
        int height = 0;
        try {
          Class c = Class.forName("com.android.internal.R$dimen");
          Field f = c.getField("status_bar_height");
          int id = (int) f.get(null);
          height = context.getResources().getDimensionPixelSize(id);
        } catch (Exception e) {
        }
        return height;
      }
    
      public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
      }
    
      public static int px2dip(Context context, float pxValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (pxValue / scale + 0.5f);
      }
    
      /** 获取手机的密度 */
      public static float getDensity(Context context) {
        DisplayMetrics dm = context.getResources().getDisplayMetrics();
        return dm.density;
      }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202

    创建BaseActivity,使用工具类实现沉浸效果:

    public class BaseActivity extends FragmentActivity {
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            StatusBarUtil.statusBarLightMode(this);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    最终实现效果:

    在这里插入图片描述

  • 相关阅读:
    python并发执行request请求
    Node.js安装及环境配置
    RISC-V公司中电丽声完成融资计划
    函数式编程
    【王道】计算机网络应用层(五)
    [附源码]计算机毕业设计springboot云南美食管理系统
    61.旋转链表
    【大数据篇】Hadoop:大数据处理的核心基石
    Verilog入门学习笔记:Verilog基础语法梳理
    实验室超声波清洗器如何选择?
  • 原文地址:https://blog.csdn.net/Lbsssss/article/details/126824263