本文主要包括以下内容

  1. ToolBar的使用
  2. RecyclerView的定义与使用

ToolBar

风格 (style)

界面 (layout)

程序 (java)

首先自定义一个theme,并将AppTheme的parent改成我们自定义的theme

(style.xml)
<resources> <style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryDark">@color/primary_dark</item>
<item name="colorAccent">@color/accent</item>
<item name="android:windowBackground">@color/window_background</item>
</style> <style name="AppTheme" parent="BaseAppTheme" /> </resources>

其中,colorPrimaryDark是状态栏底色

App bar 底色

navigationBarColor 导航栏底色

主视窗底色:windowBackground

在这里定义整个界面的底色

在layout中定义toolbar

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="?attr/colorPrimary"
>
</android.support.v7.widget.Toolbar>

在java代码中

有以下方法

setNavigationIcon:

即设定 up button 的图标,因为 Material 的介面,在 Toolbar这里的 up button样式也就有別于过去的 ActionBar 哦。

setLogo

APP 的图标。

setTitle

主标题。

setSubtitle

副标题。

setOnMenuItemClickListener

设定菜单各按鈕的动作。

效果如下

实现

 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar=(Toolbar)findViewById(R.id.toolbar);
mRecyclerView= (RecyclerView) findViewById(R.id.recyclerView); // App Logo
toolbar.setLogo(R.drawable.ic_launcher);
// Title
toolbar.setTitle("My Title2");
// Sub Title
toolbar.setSubtitle("Sub title"); setSupportActionBar(toolbar); // Navigation Icon 要設定在 setSupoortActionBar 才有作用
// 否則會出現 back button
toolbar.setNavigationIcon(R.drawable.ab_android); toolbar.setOnMenuItemClickListener(onMenuItemClick); }

在menu中定义菜单

<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=".MainActivity">
<item android:id="@+id/action_edit"
android:title="edit"
android:orderInCategory="80"
android:icon="@drawable/ab_edit"
app:showAsAction="ifRoom" /> <item android:id="@+id/action_share"
android:title="share"
android:orderInCategory="90"
android:icon="@drawable/ab_share"
app:showAsAction="ifRoom" /> <item android:id="@+id/action_settings"
android:title="setting"
android:orderInCategory="100"
app:showAsAction="never"/>
</menu>

设置图标与图标响应事件

  1. 并且在onCreateOptionsMenu方法中绑定,
  2. 然后用OnMenuItemClickListener 设置监听
  3. toolbar.setOnMenuItemClickListener(onMenuItemClick),将监听赋给toolbar
 private Toolbar.OnMenuItemClickListener onMenuItemClick = new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
String msg = "";
switch (menuItem.getItemId()) {
case R.id.action_edit:
msg += "Click edit";
break;
case R.id.action_share:
msg += "Click share";
break;
case R.id.action_settings:
msg += "Click setting";
break;
} if(!msg.equals("")) {
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
return true;
}
}; @Override
public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main,menu);
return super.onCreateOptionsMenu(menu);
}

参考链接:

android:ToolBar详解(手把手教程) - 泡在网上的日子

RecycleView的使用

RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。

据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView、GridView。

那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。

  • 你想要控制其显示的方式,请通过布局管理器LayoutManager
  • 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
  • 你想要控制Item增删的动画,请通过ItemAnimator
  • 你想要控制点击、长按事件,请自己写

基本使用

mRecyclerView = findView(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(layout);
//设置adapter
mRecyclerView.setAdapter(adapter)
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(
getActivity(), DividerItemDecoration.HORIZONTAL_LIST));

简单实现

package com.zj.material2recy;

import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { RecyclerView recyclerView; private List<String> mDatas;
private HomeAdapter mAdapter;
Toolbar toolbar; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar= (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setTitle("KSFHFSSF"); initData();
recyclerView= (RecyclerView) findViewById(R.id.id_recyclerview);
recyclerView.setHasFixedSize(true); //recyclerView.setLayoutManager(new LinearLayoutManager(this));
//recyclerView.setLayoutManager(new GridLayoutManager(MainActivity.this,3));
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
mAdapter = new HomeAdapter();
recyclerView.setAdapter(mAdapter); recyclerView.setItemAnimator(new DefaultItemAnimator()); } public void add(View view)
{
mAdapter.add(view);
} public void remove(View view)
{
mAdapter.remove(view);
} List<Integer> mHeights;
protected void initData()
{
mDatas = new ArrayList<String>();
for (int i = 'A'; i < 'z'; i++)
{
mDatas.add("" + (char) i);
} mHeights = new ArrayList<Integer>();
for (int i = 0; i < mDatas.size(); i++)
{
mHeights.add( (int) (100 + Math.random() * 300));
}
} class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{ public void add(View view)
{
mDatas.add(2,"insert");
notifyItemInserted(2);
} public void remove(View view)
{
mDatas.remove(8);
notifyItemRemoved(8);
} @Override
public HomeAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder=new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(R.layout.item_main,parent,false));
return holder;
} @Override
public void onBindViewHolder(HomeAdapter.MyViewHolder holder, int position) {
int temp= (int) (Math.random()*5+10);
//holder.tv.setHeight(temp); ViewGroup.LayoutParams lp = holder.tv.getLayoutParams();
lp.height = mHeights.get(position);
holder.tv.setLayoutParams(lp); holder.tv.setText(mDatas.get(position)); } @Override
public int getItemCount() {
return mDatas.size();
} class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{ TextView tv; public MyViewHolder(View view)
{
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
view.setOnClickListener(this);
} @Override
public void onClick(View view) { String text=tv.getText().toString();
int positon=recyclerView.getChildAdapterPosition(view);
Snackbar.make(view, text+positon, Snackbar.LENGTH_SHORT).show();
}
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:title="afbd"
android:background="?attr/colorPrimary"
>
</android.support.v7.widget.Toolbar>
<LinearLayout
android:layout_below="@id/toolbar"
android:id="@+id/bt_ctr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="add"
android:onClick="add"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="remove"
android:onClick="remove"/>
</LinearLayout> <android.support.v7.widget.RecyclerView
android:id="@+id/id_recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/bt_ctr"
android:scrollbars="none" /> </RelativeLayout>

recycleView的item布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="60dp"
android:clickable="true"
android:gravity="center_vertical"
android:orientation="vertical"
> <TextView
android:id="@+id/id_num"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="abfd"
android:gravity="center" android:textColor="@android:color/black"
android:textSize="18sp" />
</RelativeLayout>

效果如下:实现了瀑布流,添加,删除时的动画

分割线的实现详见参考链接:

Android RecyclerView 使用完全解析 体验艺术般的控件 - Hongyang - 博客频道 - CSDN.NET

layoutManger的用法

RecyclerView.LayoutManager吧,这是一个抽象类,好在系统提供了3个实现类,分别实现listView,grideView,瀑布流:

  • LinearLayoutManager 现行管理器,支持横向、纵向。
  • GridLayoutManager 网格布局管理器
  • StaggeredGridLayoutManager 瀑布就式布局管理器
//mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));

ItemAnimator的用法

ItemAnimator也是一个抽象类,好在系统为我们提供了一种默认的实现类,期待系统多

添加些默认的实现。

借助默认的实现,当Item添加和移除的时候,添加动画效果很简单:

// 设置item动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
  • 注意,这里更新数据集不是用adapter.notifyDataSetChanged()而是

    notifyItemInserted(position)与notifyItemRemoved(position)

    否则没有动画效果。

    上述为adapter中添加了两个方法:
public void addData(int position) {
mDatas.add(position, "Insert One");
notifyItemInserted(position);
} public void removeData(int position) {
mDatas.remove(position);
notifyItemRemoved(position);
}

点击事件监听实现

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{ TextView tv; public MyViewHolder(View view)
{
super(view);
tv = (TextView) view.findViewById(R.id.id_num);
view.setOnClickListener(this);
} @Override
public void onClick(View view) { String text=tv.getText().toString();
int positon=recyclerView.getChildAdapterPosition(view);
Snackbar.make(view, text+positon, Snackbar.LENGTH_SHORT).show();
}
}
}

首先setOnclickListener,由MyViewHolder 接收并处理

完成:参考链接如下

Android RecyclerView 使用完全解析 体验艺术般的控件 - Hongyang - 博客频道 - CSDN.NET

动画效果源码

Material Design入门的更多相关文章

  1. Material Design入门(三)

    本文主要包括 CollapsingToolbarLayout实现滚动动画效果 ViewPager+tabLayout实现左右类Tab效果 控件介绍 这次需要用到得新控件比较多,主要有以下几个: Coo ...

  2. Material Design入门(二)

    本文主要包括以下内容 侧滑菜单DrawerLayout实现 CardView实现 DrawerLayout介绍 drawerLayout是Support Library包中实现了侧滑菜单效果的控件,可 ...

  3. Android(Lollipop/5.0) Material Design(二) 入门指南

    Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...

  4. 走着官方的教程入门Material Design(一)

    又到期末了,学习下Google的材料设计.写下此文记录自己的同时,分享给需要的同学,若发现文中有什么问题和不对,欢迎指出 使用 Material Design 创建新应用 首先需要使用材料主题 如果是 ...

  5. Android入门3:从Toolbar到Material Design

    在Android5.0(API 21)之后,Toolbar被Google推广,逐渐走入大家视野.具体关于Actionbar和Toolbar的对比就不多啰嗦了,跟着潮流走是没错的.下面先上张简单的效果图 ...

  6. Android Material Design-Creating Apps with Material Design(用 Material Design设计App)-(零)

    转载请注明出处:http://blog.csdn.net/bbld_/article/details/40400031 翻译自:http://developer.android.com/trainin ...

  7. Android(Lollipop/5.0) Material Design(六) 使用图像

    Material Design列 Android(Lollipop/5.0)Material Design(一) 简单介绍 Android(Lollipop/5.0)Material Design(二 ...

  8. 12个优秀的国外Material Design网站案例

    眼看2017年就快完了,你是不是还没完全搞懂Material Design呢?是嫌说明文档太长,还是觉得自己英文不好?都没关系,小编今天给大家整理了一份干货满满的学习笔记,并列举了一些国外的Mater ...

  9. Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa

    MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播 ...

随机推荐

  1. 用VSCode写python的正确姿势

    最近在学习python,之前一直用notepad++作为编辑器,偶然发现了VScode便被它的颜值吸引.用过之后发现它启动快速,插件丰富,下载安装后几乎不用怎么配置就可以直接使用,而且还支持markd ...

  2. C#实现自动升级(附源码)

    http://blog.csdn.net/zhuweisky/article/details/50439386 OAUS

  3. Stream Byte[] 转换

    public byte[] StreamToBytes(Stream stream) { byte[] bytes = new byte[stream.Length]; stream.Read(byt ...

  4. spark.SecurityManager: SecurityManager: authentication disabled

  5. html5+ 获取当前设备的加速度信息

    getCurrentAcceleration 获取当前设备的加速度信息 void plus.accelerometer.getCurrentAcceleration( successCB, error ...

  6. Mac Sublime Text 2 简单使用

    按 Ctrl+` 调出 console 粘贴以下代码到底部命令行并回车: import urllib2,os;pf='Package Control.sublime-package';ipp=subl ...

  7. Nginx 服务器性能参数设置

    Nginx服务器性能调优 Nginx 配置文件 1.根据CPU内核数设置worker进程个数,以12核CPU为例,设置11个worker进程: worker_processes 11; worker_ ...

  8. ajax遍历数组(实现百度搜索提示的效果)

    方法一: 页面 <input type="hidden" id="classpath" value="${pageContext.request ...

  9. 安装lnmp后,忘记phpmyadmin的root密码,怎么办

    如果忘记MySQL root密码,如何重设密码?执行如下命令:wget http://soft.vpser.net/lnmp/ext/reset_mysql_root_password.sh;sh r ...

  10. ES6的promise对象研究

    ES6的promise对象研究 什么叫promise? Promise对象可以理解为一次执行的异步操作,使用promise对象之后可以使用一种链式调用的方式来组织代码:让代码更加的直观. 那我们为什么 ...