GVKun编程网logo

Delphi ControlBar Coolbar的使用(delphi tabcontrol)

15

如果您对DelphiControlBarCoolbar的使用和delphitabcontrol感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解DelphiControlBarCoolbar的使用

如果您对Delphi ControlBar Coolbar的使用delphi tabcontrol感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解Delphi ControlBar Coolbar的使用的各种细节,并对delphi tabcontrol进行深入的分析,此外还有关于Android ActionBar和ToolBar的使用、Android CollapsingToolbarLayout:将ActionBar载入Toolbar(2)、Android 之 ToolBar 和自定义 ToolBar 实现沉浸式状态栏、Android折叠式Toolbar使用完全解析(CollapsingToolbarLayout)的实用技巧。

本文目录一览:

Delphi ControlBar Coolbar的使用(delphi tabcontrol)

Delphi ControlBar Coolbar的使用(delphi tabcontrol)

总结

以上是小编为你收集整理的Delphi ControlBar Coolbar的使用全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Android ActionBar和ToolBar的使用

Android ActionBar和ToolBar的使用

参考

1、android中的ActionBar和ToolBar
2、『Material Design入门学习笔记』主题与AppCompatActivity(附demo)
3、Android开发:最详细的 Toolbar 开发实践总结
4、Toolbar设置详解----掉坑总结

前言

自android5.0开始,AppCompatActivity代替ActionBarActivity,而且ToolBar也代替了ActionBar,下面就是ActionBar和ToolBar的使用

ActionBar

1、截图

image.png

2、使用

2.1、AppCompatActivity和其对应的Theme

  • AppCompatActivity使用的是v7的ActionBar(和默认的ActionBar使用起来略有区别,一会代码中会有体现)
  • Theme的话继承于Theme.AppCompat.Light.DarkActionBar,系统提供的深色系的actionbar,那么按钮,文字,和菜单是白色的
//Activity
public class ActionBarActivity extends AppCompatActivity

//style
<!--默认所有activity的actionbar的theme-->
    <style name="AppCompatActivity_ActionBarTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textAllCaps">false</item>
    </style>

2.2、ActionBar的使用

  • 获取actionbar:\color{red}{这里v7的是getSupportActionBar(),默认的是getActionBar()}
        //AppCompatActivity use v7 action bar
        actionBar = this.getSupportActionBar();
        //Activity use action bar
        //actionBar = this.getActionBar();

        if(actionBar == null){
            return;
        }
  • 设置主副标题
        //主标题
        actionBar.setTitle("ActionBar Title");
        //副标题
        actionBar.setSubtitle("Sub Title");
  • 设置navigation up按钮:可见+可用+更换图标
        //左侧按钮:可见+可用+更换图标
        actionBar.setDisplayHomeAsUpEnabled(true);
        actionBar.setHomeButtonEnabled(true);
        //actionBar.setHomeAsUpIndicator(R.mipmap.back_white);
  • 设置navigation up按钮的监听:复写onSupportNavigateUp(),\color{red}{但是如果有menu复写onOptionsItemSelected函数的话,则onSupportNavigateUp()将不会被调用}
/**
     * 复写:左侧按钮点击动作
     * android.R.id.home
     * v7 actionbar back event
     * 注意:如果复写了onOptionsItemSelected方法,则onSupportNavigateUp无用
     * */
    @Override
    public boolean onSupportNavigateUp() {
        finish();
        return super.onSupportNavigateUp();
    }

    /**
     * 复写:左侧按钮点击动作
     * android.R.id.home
     * actionbar back event
     * 注意:如果复写了onOptionsItemSelected方法,则onSupportNavigateUp无用
    @Override
    public boolean onNavigateUp() {
        finish();
        return super.onNavigateUp();
    }* */
  • 设置logo(icon等):用logo代替icon,不知道为什么不灵??
        //设置logo
        actionBar.setLogo(android.R.mipmap.sym_def_app_icon);
        actionBar.setDisplayUseLogoEnabled(true);
        //设置icon:use logo instead of an icon
        //actionBar.setIcon(R.mipmap.ic_launcher);
  • 设置菜单menu和对应监听:android.R.id.home就是左侧的navigation up按钮
   /**
     * 复写:添加菜单布局
     * */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    /**
     * 复写:设置菜单监听
     * */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
                //actionbar navigation up 按钮
            case android.R.id.home:
                finish();
                break;

            case R.id.action_refresh:
                Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_add:
                Toast.makeText(this, "Add selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_settings:
                Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }
  • 设置tab和对应监听
        //增加actionbar 下面的tab按钮
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        actionBar.addTab(actionBar.newTab().setText("Tab 1").setTabListener(new ActionBar.TabListener() {
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
                Toast.makeText(ActionBarActivity.this, "Tab 1 select",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
        }));
        actionBar.addTab(actionBar.newTab().setText("Tab 2").setTabListener(new ActionBar.TabListener() {
            @Override
            public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) {
                Toast.makeText(ActionBarActivity.this, "Tab 2 select",Toast.LENGTH_SHORT).show();
            }
            @Override
            public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
            @Override
            public void onTabReselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { }
        }));
  • 或者完全自定义
       //自定义
        actionBar.setCustomView(R.layout.actionbar_title);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
  • 隐藏、显示actionbar
case R.id.btn_hide:
                if(actionBar != null){
                    /**
                     * 隐藏actionbar
                     * 1、有actionbar情况下:actionBar.hide();
                     * 2、直接使用Theme.Holo.NoActionBar
                     * 3、theme中添加属性
                     *      <item name="windowActionBar">false</item>
                     *      <item name="windowNoTitle">true</item>
                     * 4、在setContent之前 Window feature must be requested before adding content
                     *    AppCompatActivity: supportRequestWindowFeature(Window.FEATURE_NO_TITLE),
                     *    Activity: requestWindowFeature(Window.FEATURE_NO_TITLE);
                     *
                     * */
                    actionBar.hide();
                }
                break;

            case R.id.btn_show:
                if(actionBar != null){
                    actionBar.show();
                }
                break;

-------------------------------------分割线-------------------------------

Menu(共通的菜单,不细说)

1、showAsAction属性

  • always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示
  • ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中
  • never则表示永远显示在overflow中
  • withText:这个值使菜单项和它的图标,文本一起显示

2、布局

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <!--showAsAction属性
        always表示永远显示在ActionBar中,如果屏幕空间不够则无法显示
        ifRoom表示屏幕空间够的情况下显示在ActionBar中,不够的话就显示在overflow中
        never则表示永远显示在overflow中
        withText:这个值使菜单项和它的图标,文本一起显示-->

    <!--menuCategory:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。-->

    <!--orderInCategor:同种类菜单的排列顺序。该属性需要设置一个整数值-->

    <item
        android:id="@+id/action_refresh"
        android:icon="@mipmap/refresh"
        android:title="Refresh"
        app:showAsAction="always" />
    <item
        android:id="@+id/action_add"
        android:icon="@mipmap/add"
        android:title="Add"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_settings"
        android:icon="@mipmap/settings"
        android:title="Settings"
        app:showAsAction="never">
    </item>
</menu>

-------------------------------------分割线-------------------------------

ToolBar

了解了ActionBar的话,那么ToolBar和其差不多,更加强大,更加符合MD风格,然后就代替ActionBar,使用起来差不多,但是又UI上的坑

1、截图:颜色不正常的

image.png

2、使用

2.1、隐藏ActionBar有4中方式

  • 1、如果继承了theme有actionbar的则,在setContentView方法之前设置:v7的supportRequestWindowFeature(Window.FEATURE_NO_TITLE);或者非v7的requestWindowFeature(Window.FEATURE_NO_TITLE);
  • 2、theme直接继承没有actionbar的,比如说:Theme.AppCompat.Light.NoActionBar
  • 3、theme中没设置属性没有actionbar:<item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
  • 4、actionBar.hide();

2.2、AppCompatActivity和其对应的Theme

//activity
public class ToolBarActivity extends AppCompatActivity

//style
    <!--默认所有activity的toolbar的theme-->
    <!--<style name="AppCompatActivity_ToolBarTheme" parent="Theme.AppCompat.Light.NoActionBar">-->
    <style name="AppCompatActivity_ToolBarTheme" parent="Theme.AppCompat.Light">
        <!--不要actionbar,不要title-->
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>

        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textAllCaps">false</item>
    </style>

ToolBar的使用

  • toolbar在layout中布局代码:
    \color{red}{这里面有UI的坑,就是深色toolbar,文字也是黑色的,难看}
<!--这里是代替actionbar的,当然可以设置在baseactivity中通用,然后include进来-->
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:background="?attr/colorPrimary"
        android:layout_height="wrap_content"
        android:minHeight="?attr/actionBarSize">

    </android.support.v7.widget.Toolbar>
  • 获取toolbar并取代actionbar,这里设置toolbar的标题必须在setSupportActionBar之前,否则无用
       //隐藏默认actionbar
        ActionBar actionBar = getSupportActionBar();
        if(actionBar != null){
            actionBar.hide();
        }

        //获取toolbar
        toolBar = findViewById(R.id.toolbar);
        //主标题,必须在setSupportActionBar之前设置,否则无效,如果放在其他位置,则直接setTitle即可
        toolBar.setTitle("ToolBar Title");
        //用toolbar替换actionbar
        setSupportActionBar(toolBar);
  • 设置副标题
        //副标题+颜色
        toolBar.setSubtitle("Sub Title");
  • 设置navigation up按钮的图标和点击监听
        //左侧按钮:可见+更换图标+点击监听
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);//显示toolbar的返回按钮
        //toolBar.setNavigationIcon(R.mipmap.back_white);
        toolBar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
       
  • 设置logo
         //设置logo
        toolBar.setLogo(android.R.mipmap.sym_def_app_icon); 
  • 设置菜单menu及其监听
/**
     * 复写:添加菜单布局
     * */
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    /**
     * 复写:设置菜单监听
     * */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_refresh:
                Toast.makeText(this, "Refresh selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_add:
                Toast.makeText(this, "Add selected", Toast.LENGTH_SHORT).show();
                break;
            case R.id.action_settings:
                Toast.makeText(this, "Settings selected", Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }
        return true;
    }
       
  • 加载自定义toolbar:直接在toolbar的layout中写即可,可以是文字居中等等
  • 隐藏、显示toolbar
 case R.id.btn_hide:
                if(toolBar != null){
                    toolBar.setVisibility(View.GONE);
                }
                break;

            case R.id.btn_show:
                if(toolBar != null){
                    toolBar.setVisibility(View.VISIBLE);
                }
                break;

3、截图:颜色正常的

4、用ToolBar 的Theme和PopupTheme来控制颜色正常,或自定义颜色

4.1、ToolBar显然颜色不对,那找找为啥ActionBar的时候对的,直觉告诉我是theme的问题,于是找Theme.AppCompat.Light.DarkActionBar,点击进去看会看到

  • actionBarPopupThem是Light的,就是menu菜单点击弹出那个
  • actionBarTheme是深色系的,那么控制按钮图标和主副标题颜色就是白色的
<style name="Base.Theme.AppCompat.Light.DarkActionBar" parent="Base.Theme.AppCompat.Light">
        <item name="actionBarPopupTheme">@style/ThemeOverlay.AppCompat.Light</item>
        <item name="actionBarWidgetTheme">@null</item>
        <item name="actionBarTheme">@style/ThemeOverlay.AppCompat.Dark.ActionBar</item>

        <!-- Panel attributes -->
        <item name="listChoiceBackgroundIndicator">@drawable/abc_list_selector_holo_dark</item>

        <item name="colorPrimaryDark">@color/primary_dark_material_dark</item>
        <item name="colorPrimary">@color/primary_material_dark</item>
    </style>

4.2、新建Toolbar的theme和popuptheme:这里面就是继承刚刚找到的东西,当然也可以再自定义颜色咯

    <!--给toolbar单独设置的theme,让toolbar上按钮颜和文字颜色变化的-->
    <style name="MyDarkToolBarTheme" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
        <!--toolbar图标颜色-->
        <!--<item name="colorControlNormal">@color/colorAccent</item>-->
        <!--toolbar的title颜色-->
        <!--<item name="android:textColorPrimary">@color/colorAccent</item>-->
        <!--toolbar的subtitle颜色-->
        <!--<item name="subtitleTextColor">@color/colorAccent</item>-->
    </style>

    <!--给toolbar的menu内单独设置的theme,让toolbar上按钮颜和文字颜色变化的-->
    <style name="MyLightPopupTheme" parent="ThemeOverlay.AppCompat.Light">
        <!--设置背景-->
        <!--<item name="android:background">@android:color/white</item>-->
        <!--设置字体颜色-->
        <!--<item name="android:textColor">@color/colorAccent</item>-->
        <!--设置不覆盖锚点-->
        <!--<item name="overlapAnchor">false</item>-->
    </style>

4.3、添加Toolbar的theme和popuptheme

//需添加
xmlns:app="http://schemas.android.com/apk/res-auto"

<!--这里是代替actionbar的,当然可以设置在baseactivity中通用,然后include进来-->
    <android.support.v7.widget.Toolbar
        省略...
        app:theme="@style/MyDarkToolBarTheme"
        app:popupTheme="@style/MyLightPopupTheme">

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

大功告成

以上就是ActionBar和ToolBar的入门使用,后面配合上系统的StatusBar和NavigationBar,并实现沉浸式还有的烦,但这些都属于基础部分,得打牢UI基础。

友情链接>>> Android 沉浸式风格(为毛叫沉浸式这么唬人)



作者:Kandy_JS
链接:https://www.jianshu.com/p/81d0bcb282cb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Android CollapsingToolbarLayout:将ActionBar载入Toolbar(2)

Android CollapsingToolbarLayout:将ActionBar载入Toolbar(2)

Android CollapsingToolbarLayout:将ActionBar载入Toolbar(2)

我之前写了一篇文章:《Android Material Design : CollapsingToolbarLayout使用简介》文章链接地址:http://blog.csdn.net/zhangphil/article/details/48930821
这篇文章主要介绍了Android CollapsingToolbarLayout使用方法。在此篇文章的基础上,增加一点儿内容,就是将Android ActionBar装载到Toolbar里面。
测试的activity MainActivity.java :

package zhangphil.demo;


import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends AppCompatActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
		setSupportActionBar(toolbar);
		getSupportActionBar().setDisplayHomeAsUpEnabled(true);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		if (id == R.id.action_settings) {
			return true;
		}
		return super.onOptionsItemSelected(item);
	}
}


注意在AndroidManifest定义MainActivity的theme时写上:

android:theme="@style/Theme.AppCompat.Light.NoActionBar"
这段代码写上,才可以使得Toolbar取代ActionBar。


MainActivity.java需要的布局文件activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="300dip"
        android:background="#1e88e5"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" >

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:contentScrim="#ff5252"
            app:expandedTitleMarginEnd="60dp"
            app:expandedTitleMarginStart="50dp" >

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_collapseMode="parallax"
                android:background="@drawable/ic_launcher"
                android:scaleType="centerCrop" />

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="50dp"  
                android:text="0" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="50dp"  
                android:text="1" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="50dp"  
                android:text="2" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="50dp"  
                android:text="3" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="50dp"  
                android:text="4" />

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="50dp"  
                android:text="5" />
        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dip"
        app:layout_anchor="@+id/appbar"
        app:layout_anchorGravity="bottom|right|end"
        android:clickable="true"
        android:src="@drawable/ic_launcher" />

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



同时MainActivity.java需要的res/menu/main.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="zhangphil.demo.MainActivity" >
    
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="设置"
        app:showAsAction="never"/>
    
</menu>


代码运行结果:

Android 之 ToolBar 和自定义 ToolBar 实现沉浸式状态栏

Android 之 ToolBar 和自定义 ToolBar 实现沉浸式状态栏

沉浸式状态栏确切的说应该叫做透明状态栏。一般情况下,状态栏的底色都为黑色,而沉浸式状态栏则是把状态栏设置为透明或者半透明。

沉浸式状态栏是从 android Kitkat(Android 4.4)开始出现的,它可以被设置成与 APP 顶部相同的颜色,这就使得切换 APP 时,整个界面就好似切换到了与 APP 相同的风格样式一样。在内容展示上会显得更加美观。

本博客主要说的是结合 ToolBar 来实现状态栏的两种实现方式,效果如图:

        

前提条件是 Api 得大于等于 19(4.4 版本以上)

方式 1:

布局 toolbar1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        app:title="App Title"
        app:subtitle="Sub Title"
        app:navigationIcon="@android:drawable/ic_input_add"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:fitsSystemWindows="true"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="沉浸式状态栏"
            android:textSize="30sp" />
    </RelativeLayout>
</LinearLayout>

Activity.Java

public class TooBarStatusActivity1 extends AppCompatActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);//去标题
        setContentView(R.layout.toolbar_layout);
        //透明状态栏
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        //透明导航栏
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        //透明导航栏
        Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
        mToolbar.setTitle("App Title"); //设置Toolbar标题
        mToolbar.setSubtitle("Sub Title"); //设置Toolbar 副标题
        mToolbar.setLogo(R.mipmap.ic_launcher);//设置Toolbar的Logo
        mToolbar.setNavigationIcon(R.mipmap.abc_ic_ab_back_mtrl_am_alpha);
        setSupportActionBar(mToolbar);
    }
}

方式 2:

布局 toolbar2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/white"
    android:orientation="vertical"
   >
    <TextView
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@color/colorAccent"
        android:fitsSystemWindows="true"
        android:clipToPadding="true"
        android:text="自定义的ToolBar布局"
        android:textSize="20sp"
        android:gravity="center_vertical"
        />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFFF00"
        android:text="主布局"
        android:textSize="22sp"
        android:gravity="center"
        />
</LinearLayout>

Activity.Java

public class TooBarStatusActivity2 extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.toolbar_layout2);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            //透明状态栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //透明导航栏
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
    }
}

style.xml

  <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

 

源码点击下载

Android折叠式Toolbar使用完全解析(CollapsingToolbarLayout)

Android折叠式Toolbar使用完全解析(CollapsingToolbarLayout)

简介

在各种不同的应用中,大家可能会经常见到这样一个效果:Toolbar是透明的,有着一个背景图片以及大标题,随着页面向上滑动,其标题逐渐缩放到Toolbar上,而背景图片则在滑动到一定程度后变成了Toolbar的颜色,这种效果也即是折叠式效果。其实这种效果在GitHub上面已经有很多开源库实现了,但是Google在其推出的Design Library库中也给出了一个这种控件,让我们很方便地实现了这种效果。这个控件是CollapsingToolbarLayout,它是一个增强型的FrameLayout。那么,本篇文章就给大家详细地介绍该控件的使用方法以及注意事项。

效果

本文结合一个Demo来进行演示,下面是最终的显示效果,也即折叠式Toolbar的效果:

效果1

引入

使用该控件,需要引入Android Design Library这个库,同时地,我们需要把app的主题也要做相应的修改以便适应这个控件,所以我们也需要appcompat这个库,那么我们在build.gradle文件中引入如下:

dependencies {
 compile 'com.android.support:cardview-v7:24.1.0' //cardview
 compile 'com.android.support:design:24.1.0'
 compile 'com.android.support:appcompat-v7:24.1.0'
}

本文内容均基于官方文档,有兴趣的读者可以前往官方文档进一步查看(自备梯子)。

知识储备

接下来,笔者一步步地介绍该控件的用法。首先,我们先来了解这个控件的常用xml属性。

一、常用xml属性介绍

1)contentScrim:当Toolbar收缩到一定程度时的所展现的主体颜色。即Toolbar的颜色。
2)title:当titleEnable设置为true的时候,在toolbar展开的时候,显示大标题,toolbar收缩时,显示为toolbar上面的小标题。
3)scrimAnimationDuration:该属性控制toolbar收缩时,颜色变化的动画持续时间。即颜色变为contentScrim所指定的颜色进行的动画所需要的时间。
4)expandedTitleGravity:指定toolbar展开时,title所在的位置。类似的还有expandedTitleMargin、collapsedTitleGravity这些属性。
5)collapsedTitleTextAppearance:指定toolbar收缩时,标题字体的样式,类似的还有expandedTitleTextAppearance。

二、常见的标志位

一般开发中,CollapsingToolbarLayout不会单独出现在布局文件中,而是作为另一个控件CoordinatorLayout的子元素出现,那么CoordinatorLayout又是什么呢?其实CoordinatorLayout这个控件很强大,能对其子元素实现多种不同的功能,一个常见的用法就是:给它的一个子元素A设置一个layout_scrollFlags的属性,然后给另外一个子元素B设置一个layout_behavior=”@string/appbar_scrolling_view_behavior”的属性,这个子元素B一般是一个可以滑动的控件,比如RecyclerView、nestedScrollView等,那么当子元素B滑动的时候,子元素A就会根据其layout_scrollFlags的属性值而做出不同的改变,所以我们要为CollapsingToolbarLayout设置layout_scrollFlags属性。

layout_scrollFlags

我们来看看layout_scrollFlags有哪几个属性可以选择:
* scroll:所有想要滑动的控件都要设置这个标志位。如果不设置这个标志位,那么View会固定不动。
* enteralways:设置了该标志位后,若View已经滑出屏幕,此时手指向下滑,View会立刻出现,这是另一种使用场景。
* enteralwaysCollapsed:设置了minHeight,同时设置了该标志位的话,view会以最小高度进度屏幕,当滑动控件滑动到顶部的时候才会拓展为完整的高度。
* exitUntilCollapsed:向上滑动时收缩当前View。但view可以被固定在顶部。
可能直接用语言来描述还是有点太抽象,下面会以实际的效果给大家展示这几个标志位的具体作用。

layout_collapseMode

上面提到CollapsingToolbarLayout是一个FrameLayout,它内部能有多个子元素,而子元素也会有不同的表现。比如说,在上面的gif图中,toolbar在缩放后是固定在顶部的,而imageview则是随着布局的滚动而滚动,也即存在一个相对滚动的过程。所以这些子元素可以添加layout_collapseMode标志位进而产生不同的行为。其实这里也只有两种标志位,分别是:
* pin:有该标志位的View在页面滚动的过程中会一直停留在顶部,比如Toolbar可以被固定在顶部
* parallax:有该标志位的View表示能和页面同时滚动。与该标志位相关联的一个属性是:layout_collapseParallaxMultiplier,该属性是视差因子,表示该View与页面的滚动速度存在差值,造成一种相对滚动的效果。

三、常用的层级关系

上面说到CollapsingToolbarLayout一般作为CoordinatorLayout的子元素出现,其实如果要实现上面的效果,还需要另外一个控件:AppBarLayout。该控件也是Design库的控件,作用是把其所有子元素当做一个AppBar来使用。一般来说,实现折叠式Toolbar可以使用以下的层级关系:

<android.support.design.widget.CoordinatorLayout...>
 <android.support.design.widget.AppBarLayout...>
  <android.support.design.widget.CollapsingToolbarLayout...>
   <!-- your collapsed view -->
   <View.../>
   <android.support.v7.widget.Toolbar.../>
  </android.support.design.widget.CollapsingToolbarLayout>
 </android.support.design.widget.AppBarLayout>

 <!-- Scroll view -->
 <android.support.v7.widget.RecyclerView.../>
</android.support.design.widget.CoordinatorLayout>

从上面的层级关系来看,最外面的一层是CoordinatorLayout,它有两个子元素,分别是AppBarLayout和RecyclerView(可滑动控件),而AppBarLayout则包裹着CollapsingToolbarLayout,CollapsingToolbarLayout的子元素分别是被折叠的View(可以是一张图片,也可以是一个布局)以及我们的Toolbar。

例子①

有了以上的知识储备,我们就可以开始动手写代码了,我们的目标是实现上面的gif图的效果。
1、在activity_main.xml文件中(注:以下注释只是为了方便说明):

<android.support.design.widget.CoordinatorLayout 
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto" <!-- 自定义命名空间 -->
 android:layout_width="match_parent"
 android:layout_height="match_parent">

 <android.support.design.widget.AppBarLayout
  android:layout_width="match_parent"
  android:layout_height="200dp"
  android:fitsSystemWindows="true">

  <android.support.design.widget.CollapsingToolbarLayout
   android:id="@+id/collapsing_toolbar_layout"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   app:contentScrim="?attr/colorPrimary"  <!--toolbar折叠后的主体颜色 -->
   app:expandedTitleMarginEnd="10dp"   <!--文字展开时的Margin -->
   app:expandedTitleMarginStart="10dp"
   app:collapsedTitleTextAppearance="@style/TextAppearance.AppCompat.Title" <!--字体的表现 -->
   app:layout_scrollFlags="scroll|exitUntilCollapsed">   


   <ImageView
    android:id="@+id/iv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop"
    app:layout_collapseMode="parallax"    <!--设置imageView可随着滑动控件的滑动而滑动 -->
    app:layout_collapseParallaxMultiplier="0.5"/> <!--视差因子 -->

   <android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    app:layout_collapseMode="pin" />  <!--toolbar折叠后固定于顶部 -->
  </android.support.design.widget.CollapsingToolbarLayout>

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

 <android.support.v4.widget.nestedScrollView
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  app:layout_behavior="@string/appbar_scrolling_view_behavior"> <!--为滑动控件设置Behavior,这样上面的控件才能做出相应改变 -->

  <LinearLayout
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="match_parent">

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

  </LinearLayout>
 </android.support.v4.widget.nestedScrollView>
</android.support.design.widget.CoordinatorLayout>

与其相关联的item_card.xml布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="100dp"
 android:layout_margin="5dp"
 app:cardElevation="5dp"
 app:contentPaddingTop="2dp"
 app:contentPaddingBottom="2dp">

 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="Learn and Share Android"
  android:textSize="20sp"
  android:layout_gravity="center"/>

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

2、在MainActivity.java文件中再做出一些处理:

 private ImageView iv;
 private CollapsingToolbarLayout collapsingToolbarLayout;
 private Toolbar toolbar;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  collapsingToolbarLayout = (CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar_layout);
  iv = (ImageView) findViewById(R.id.iv);
  toolbar = (Toolbar) findViewById(R.id.toolbar);

  setSupportActionBar(toolbar);
  toolbar.setNavigationIcon(R.mipmap.ic_drawer_home);
  collapsingToolbarLayout.setTitle("DesignLibrarySample");
  collapsingToolbarLayout.setCollapsedTitleTextColor(Color.WHITE);
  collapsingToolbarLayout.setExpandedTitleColor(Color.WHITE);
  iv.setimageResource(R.mipmap.ic_bg);
 }

上面,我们为collapsingToolbarLayout设置了标题,以及收缩时标题的颜色和展开时标题的颜色等。经过上面的一个简单例子,就能实现上面gif图所显示的折叠式Toolbar的效果了。

这里先小结一下:在CoordinatorLayout作为父布局的情况下,给滑动控件设置一个layout_behavior=”@string/appbar_scrolling_view_behavior”标志位(该Behavior系统以及帮我们实现),那么当带有这个标志位的控件滑动的时候会触发带有scroll_flags标志位的另一个控件进行滑动,此时imageview的layout_collapseMode是parallax,所以它会以有视差的方式来相对滑动,而toolbar设置了pin的标记位,所以在收缩后会固定在屏幕顶部。

例子②

在例子①内,我们为CollapsingToolbarLayout设置的scroll_flags是”scroll | exitUntilCollapsed”,那么我们把标志位换成别的会有什么不同的效果呢?
在activity_main.xml内,作如下修改:

<android.support.design.widget.CollapsingToolbarLayout
 ...
 app:layout_scrollFlags="scroll|enteralwaysCollapsed|enteralways">

然后别的不作改动,效果如下:

效果1

显然,所造成的效果发生了变化,这里toolbar并不一致固定在顶部了,而是随着滑动而滑出了屏幕之外,同时如果手指向下滑动,toolbar会逐渐出现并保持着最小的高度,等到回到了最顶部后,toolbar会展开成原来的样子。
那么,基于以上的例子,如果上面少了一个“enteralwaysCollapsed”这个标志位又会怎样呢?该标志位的作用上面也已经解释过了,是控制toolbar以最小的高度进入屏幕,并且在滑动控件滑动到最顶端的时候再展开成完整的高度。如果少了这个标志位,在我们手指向下滑的时候,toolbar也会逐渐出现,但是与上面gif图不同的是,toolbar会继续展开变成原来的样子,即出现imageview。图这里就不放出来了,读者可以自行验证~

通过以上的两个小例子,我们对CollapsingToolbarLayout有了一定的认识,也学会了它的使用方法了,使用它能让我们的应用变得更加美观。那么最后,我们再来谈谈注意事项,也即笔者开发过程中遇到的坑。

注意事项

1、Android Design Support Library的使用需要配合特定的主题,一般用AppCompat下的主题即可,也可以自定义主题,继承自AppCompat的主题,否则会报错。另外如果使用Android Studio的话,主题的相关代码需要在styles.xml(v21)文件内做出相应的修改,否则使用Android 5.0以上的机子做测试的话也会报错。
2、由于使用了AppCompat的主题,那么我们的Activity应该继承自AppCompatActivity。
3、笔者之前使用design support library的版本号是23.1.0,在此版本上,CollapsingToolbarLayout没有设置collapsedTitleTextAppearance属性,标题可以正常显示,然而到了24.1.0版本,即上面所用的版本,如果没有设置collapsedTitleTextAppearance属性,则当toolbar收缩后,其标题文字变得非常小。所以我们要设置collapsedTitleTextAppearance=”@style/TextAppearance.AppCompat.Title”这个属性,才能变得正常。
4、如果没有为CollapsingToolbarLayout设置一个title,那么会使用ActionBar自带的标题来显示应用的名称,这是因为调用了setSupportActionBar(toolbar)函数。

最后附上代码的地址:DesignSupportLibrarySample

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

今天关于Delphi ControlBar Coolbar的使用delphi tabcontrol的讲解已经结束,谢谢您的阅读,如果想了解更多关于Android ActionBar和ToolBar的使用、Android CollapsingToolbarLayout:将ActionBar载入Toolbar(2)、Android 之 ToolBar 和自定义 ToolBar 实现沉浸式状态栏、Android折叠式Toolbar使用完全解析(CollapsingToolbarLayout)的相关知识,请在本站搜索。

本文标签: