Android沉浸式状态栏+DrawerLayout+NavigationView+Toolbar,捎带滑动退出当前Activity与点击进去Activity的动画(+swipebacklayout)

废话,讲解都没有,其他大神都有详细解答,我就直接上代码标注重点注意的地方,有问题可以联系我…

  • 先说状态栏
  • 1:styles中配置主题属性,
  • 2:AndroidManifest.xml中设置Activity主题,
  • 3:自定义了一个Toolbar,
  • 4:设置带有DrawerLayout页面的状态栏,
  • 5:Activity进去退出动画
    -先看看图8.0,4.4的版本下的,5.1的情况下都没问题(手机华为,锤子,小米)
    加载页不要状态栏的状态
    进去主页面的状态与侧滑菜单
    滑动退出
    这里写图片描述
    这里写图片描述

    -style 相关都在这里了(记得相对应版本都要有)

<!--标题栏 通知栏颜色-->
    <style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorStyles</item>
        <item name="colorPrimaryDark">@color/colorStyles</item>
        <item name="colorAccent">@color/colorStyles</item>
        <!--隐藏标题栏-->
        <item name="android:windowTranslucentStatus">true</item>
        <!--滑动-->
        <item name="android:windowIsTranslucent">true</item>
        <item name="windowNoTitle">true</item>
        <!-- 沉浸式状态栏 -->
        <item name="android:fitsSystemWindows">false</item>
        <!--切换动画-->
        <item name="android:windowAnimationStyle">@style/animfade</item>
    </style>

    <!--沉浸式-->
    <style name="AppTheme.NoActionBar">
        <!--全屏-->
        <item name="android:windowFullscreen">true</item>
        <!---->
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>

    </style>

    <style name="AppTheme.AppBarOverlay" parent="Base.ThemeOverlay.AppCompat.Dark.ActionBar" />
    <style name="AppTheme.PopupOverlay" parent="Base.Theme.AppCompat.Light" />

    <!-- 界面切换动画 -->
    <style name="animfade" parent="@android:style/Animation.Activity">
        <item name="android:activityOpenEnterAnimation">@anim/slide_in_from_right</item>
        <item name="android:activityOpenExitAnimation">@anim/slide_out_to_left</item>
        <item name="android:activityCloseExitAnimation">@anim/slide_out_to_right</item>
        <item name="android:activityCloseEnterAnimation">@anim/slide_in_form_left</item>
    </style>
  • AndroidManifest.xml中的
<application
        android:persistent="true"
        android:allowBackup="true"
        android:icon="@drawable/ic_logo"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        android:windowSoftInputMode="adjustPan">

        <activity
            android:name=".view.bootpage.MainActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustPan"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>


    </application>
  • Toolbar
    这里写图片描述
  • -
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">


            <android.support.v7.widget.AppCompatImageView
                android:id="@+id/iv_lift"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="@dimen/bar_padding"
                android:layout_marginLeft="@dimen/bar_lift_distance"/>

            <TextView
                android:id="@+id/tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="状态栏"
                android:textSize="@dimen/text_hint_16"
                android:textColor="@color/bar_text"
                android:textStyle="bold"
                android:layout_centerInParent="true"
                android:layout_gravity="center"/>

            <android.support.v7.widget.AppCompatImageView
                android:id="@+id/iv_right"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="end"
                android:padding="@dimen/bar_padding"
                android:layout_marginRight="@dimen/bar_right_distance"/>


        </android.support.v7.widget.Toolbar>


</LinearLayout>
//这里要注意设置标题栏的padding了
public class TitleBarUtil extends LinearLayout implements View.OnClickListener{

    private View v;
    private AppCompatImageView ivLift;
    private AppCompatImageView ivRight;
    private TextView tvTitle;

    public TitleBarUtil(Context context) {
        super(context);
        initView(context);
    }

    public TitleBarUtil(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }


    private OnEventListener onEventListener;


    public void onEventListener(OnEventListener onEvent) {
        this.onEventListener = onEvent;
    }

    //布局
    private void initView(Context context) {
        v = LayoutInflater.from(context).inflate(R.layout.title_bar, null);
        ivLift = (AppCompatImageView) v.findViewById(R.id.iv_lift);
        ivRight = (AppCompatImageView) v.findViewById(R.id.iv_right);
        tvTitle = (TextView) v.findViewById(R.id.tv_title);
        ivLift.setOnClickListener(this);
        ivRight.setOnClickListener(this);
        //标题栏的位置
        Toolbar mToolbar = (Toolbar) v.findViewById(R.id.toolbar);
        mToolbar.setPadding(0,getStatusBarHeight()+30,0,30);

        this.addView(v, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
    }

    @Override
    public void onClick(View v) {

        switch (v.getId()){
            case R.id.iv_lift:
                onEventListener.onLiftListener();
                break;

            case R.id.iv_right:
                onEventListener.onRightListener();
                break;
        }
    }

    //设置数据
    public void setValue(int imgLift, int title, int imgRight){
        this.tvTitle.setText(title);
        if (imgLift > 0){
            ivLift.setBackgroundResource(imgLift);
        }
        if (imgRight > 0){
            ivRight.setBackgroundResource(imgRight);
        }
    }

    //状态栏的高度
    public int getStatusBarHeight() {
        int result = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) {
            result = getResources().getDimensionPixelSize(resourceId);
        }
        return result;
    }


    public interface OnEventListener {
        void onLiftListener();
        void onRightListener();
    }
}
  • 主页面
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:openDrawer="left"
    android:id="@+id/dl_na">


    <include
        layout="@layout/content_home_activity"/>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav"
        android:layout_gravity="left"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        app:headerLayout="@layout/view_navigation_head"
        app:menu="@menu/view_navigation_menu"
        >

    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>
//在页面代码中设置侧滑
private void barUtil(){

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            WindowManager.LayoutParams localLayoutParams = getWindow().getAttributes();
            localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags);

            if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){
                //将侧边栏顶部延伸至status bar
                dlNa.setFitsSystemWindows(true);
                // /将主页面顶部延伸至status bar;虽默认为false,但经测试,DrawerLayout需显示设置
                dlNa.setClipToPadding(false);
            }
        }
    }
  1. 动画(随便写四个动画,代码不粘贴了)这里写一下swipebacklayout使用
compile 'me.imid.swipebacklayout.lib:library:1.0.0'
//其他继承这个就好了
public class BaseActivity extends SwipeBackActivity {

    public Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context = this;
        SwipeBackLayout mSwipeBackLayout = getSwipeBackLayout();
        // 设置滑动方向,可设置EDGE_LEFT, EDGE_RIGHT, EDGE_ALL,EDGE_BOTTOM
        mSwipeBackLayout.setEdgeTrackingEnabled(SwipeBackLayout.EDGE_LEFT);

    }
}
//设置不滑动退出
setSwipeBackEnable(false);//禁用滑动退出
//这是动画进入  退出(和swipebacklayout不会冲突)
public class IntentAnim {

    public static void showCommonAnimIn(Activity act){

        act.overridePendingTransition(R.anim.slide_in_from_right, R.anim.slide_in_form_left);
    }

    public static void showCommonAnimOut(Activity act){

        act.overridePendingTransition(R.anim. slide_out_to_left, R.anim.slide_out_to_right);
    }
}
  • 跳转 退出加动画
IntentAnim.showCommonAnimIn(this);
@Override
    public void finish() {
        super.finish();
        IntentAnim.showCommonAnimOut(this);

    }
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我知道你的问题了。针对你的问题,可以通过如下代码实现AppBarLayout的滚动监听: ```java AppBarLayout appBarLayout = findViewById(R.id.appBarLayout); appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() { @Override public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) { // 在这里处理滚动事件 } }); ``` 其中,`addOnOffsetChangedListener` 方法可以添加滚动监听器,该监听器中的 `onOffsetChanged` 方法中可以处理 AppBarLayout 的滚动事件。 关于CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout 和 RecyclerView 的结合使用,可以参考以下代码: ```xml <androidx.coordinatorlayout.widget.CoordinatorLayout android:id="@+id/coordinatorLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.appbar.AppBarLayout android:id="@+id/appBarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true"> <com.google.android.material.appbar.CollapsingToolbarLayout android:id="@+id/collapsingToolbarLayout" android:layout_width="match_parent" android:layout_height="wrap_content" app:contentScrim="?attr/colorPrimary" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <ImageView android:id="@+id/imageView" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop" android:src="@drawable/image" app:layout_collapseMode="parallax" /> <com.google.android.material.toolbar.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" /> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> </androidx.coordinatorlayout.widget.CoordinatorLayout> ``` 其中,`CoordinatorLayout` 是一个可以协调多个子视图之间交互的布局容器。`AppBarLayout` 是一个垂直的 LinearLayout,可以包含一个或多个子视图,用于实现应用程序栏。`CollapsingToolbarLayout` 是一个具有可折叠效果的 Toolbar 布局。`RecyclerView` 是一个可以滚动的列表视图。 以上代码实现了一个具有可折叠效果的 Toolbar 和一个可以滚动的列表视图。在 `CollapsingToolbarLayout` 中的 `ImageView` 和 `Toolbar` 都有一个 `layout_collapseMode` 属性,用于指定它们的行为。`ImageView` 的 `layout_collapseMode` 属性设置为 `parallax`,表示在滚动时具有视差效果;`Toolbar` 的 `layout_collapseMode` 属性设置为 `pin`,表示在折叠时固定在顶部。 `RecyclerView` 的 `layout_behavior` 属性设置为 `appbar_scrolling_view_behavior`,表示它是一个可以与 `AppBarLayout` 协同工作的滚动视图。这样,`AppBarLayout` 就可以根据 `RecyclerView` 的滚动情况来调整自身的显示状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值