转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持!



Material Design:

Material Design是Google推出的一个全新的设计语言,它的特点就是拟物扁平化。

我将Material Design分为例如以下四部分:

主题和布局——ANDROID
L——Material Design具体解释(主题和布局)

视图和阴影——ANDROID
L——Material Design具体解释(视图和阴影)

UI控件——ANDROID
L——Material Design具体解释(UI控件)

动画——ANDROID
L——Material Design具体解释(动画篇)

而以下这个样例就是之前上面所介所绍的一个综合应用,废话不多说直接看图:

       



Demo简单介绍:

左边的图:

1.RecyclerView,CardView

首先使用了Material Desgin新增的两个控件RecyclerView,CardView。

知识点參考:ANDROID L——RecyclerView,CardView导入和使用(Demo)

2. Floating Action Button & 视图阴影轮廓

这里和上篇文章不同的是我加了一个Floating Action Button(悬浮动作button)去控制CardView在RecyclerView中的加入和删除。

而且在蓝色的悬浮button上设置了阴影了轮廓(黑色背景不是非常清楚)

知识点參考:ANDROID
L——Material Design具体解释(视图和阴影)

3. Reveal Effect

在点击蓝色button时会有一个缩小的动画是使用了Reveal effect动画

知识点參考:ANDROID
L——Material Design具体解释(动画篇)

右面的图:



1. Activity transitions

在点击单个条目时会跳转到一个新的Acitivty,跳转时运行Activity transitions动画,大家会看到第二个Activity中的视图会有一个向中央扩展的效果(Explode)



2. Shared Elements Transition

在从第一个Activity跳转到第二个Activity时,会有一个共享元素的动画效果使图片和悬浮button在两个Activity跳转时移动(控件间距离有些近效果不是特别明显)

3. Reveal effect和动画监听

通过Reveal effect和动画监听实现类似“眨眼睛”的切换视图效果

1、2、3知识点參考:ANDROID
L——Material Design具体解释(动画篇)

代码介绍:

主Activity——MyActivity:

  1. public class MyActivity extends Activity {
  2.  
  3. private RecyclerView mRecyclerView;
  4.  
  5. private MyAdapter myAdapter;
  6.  
  7. ImageButton button;
  8.  
  9. Context context;
  10.  
  11. public static List<Actor> actors = new ArrayList<Actor>();
  12.  
  13. private static String[] names = {"朱茵", "张柏芝", "张敏", "莫文蔚", "黄圣依", "赵薇", "如花"};
  14.  
  15. private static String[] pics = {"p1", "p2", "p3", "p4", "p5", "p6", "p7"};
  16.  
  17. private static String[] works = {"大话西游", "喜剧之王", "p3", "p4", "p5", "p6", "p7"};
  18.  
  19. private static String[] role = {"紫霞仙子", "柳飘飘", "p3", "p4", "p5", "p6", "p7"};
  20.  
  21. private static String[][] picGroups = {{"p1","p1_1", "p1_2", "p1_3"},{"p2","p2_1", "p2_2", "p2_3"},{"p3"},{"p4"},{"p5"},{"p6"},{"p7"}};
  22.  
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. // set Explode enter transition animation for current activity
  27. getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
  28. getWindow().setEnterTransition(new Explode().setDuration(1000));
  29. setContentView(R.layout.main_layout);
  30.  
  31. // init data
  32. this.context = this;
  33. actors.add(new Actor(names[0], pics[0], works[0], role[0], picGroups[0]));
  34. getActionBar().setTitle("那些年我们追的星女郎");
  35.  
  36. // init RecyclerView
  37. mRecyclerView = (RecyclerView) findViewById(R.id.list);
  38. mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
  39. mRecyclerView.setItemAnimator(new DefaultItemAnimator());
  40. // set adapter
  41. myAdapter = new MyAdapter(this, actors);
  42. mRecyclerView.setAdapter(myAdapter);
  43.  
  44. // set outline and listener for floating action button
  45. button = (ImageButton) this.findViewById(R.id.add_button);
  46. button.setOutlineProvider(new ViewOutlineProvider() {
  47. @Override
  48. public void getOutline(View view, Outline outline) {
  49. int shapeSize = (int) getResources().getDimension(R.dimen.shape_size);
  50. outline.setRoundRect(0, 0, shapeSize, shapeSize, shapeSize / 2);
  51. }
  52. });
  53. button.setClipToOutline(true);
  54. button.setOnClickListener(new MyOnClickListener());
  55.  
  56. }
  57.  
  58. public class MyOnClickListener implements View.OnClickListener {
  59. boolean isAdd = true;
  60.  
  61. @Override
  62. public void onClick(View v) {
  63. // start animation
  64. Animator animator = createAnimation(v);
  65. animator.start();
  66.  
  67. // add item
  68. if (myAdapter.getItemCount() != names.length && isAdd) {
  69.  
  70. actors.add(new Actor(names[myAdapter.getItemCount()], pics[myAdapter.getItemCount()], works[myAdapter.getItemCount()], role[myAdapter.getItemCount()], picGroups[myAdapter.getItemCount()]));
  71. mRecyclerView.scrollToPosition(myAdapter.getItemCount() - 1);
  72. myAdapter.notifyDataSetChanged();
  73. }
  74. // delete item
  75. else {
  76. actors.remove(myAdapter.getItemCount() - 1);
  77. mRecyclerView.scrollToPosition(myAdapter.getItemCount() - 1);
  78. myAdapter.notifyDataSetChanged();
  79. }
  80.  
  81. if (myAdapter.getItemCount() == 0) {
  82. button.setImageDrawable(getDrawable(android.R.drawable.ic_input_add));
  83. isAdd = true;
  84. }
  85. if (myAdapter.getItemCount() == names.length) {
  86. button.setImageDrawable(getDrawable(android.R.drawable.ic_delete));
  87. isAdd = false;
  88. }
  89. }
  90. }
  91.  
  92. /**
  93. * start detail activity
  94. */
  95. public void startActivity(final View v, final int position) {
  96.  
  97. View pic = v.findViewById(R.id.pic);
  98. View add_btn = this.findViewById(R.id.add_button);
  99.  
  100. // set share element transition animation for current activity
  101. Transition ts = new ChangeTransform();
  102. ts.setDuration(3000);
  103. getWindow().setExitTransition(ts);
  104. Bundle bundle = ActivityOptions.makeSceneTransitionAnimation((Activity) context,
  105. Pair.create(pic, position + "pic"),
  106. Pair.create(add_btn, "ShareBtn")).toBundle();
  107.  
  108. // start activity with share element transition
  109. Intent intent = new Intent(context, DetailActivity.class);
  110. intent.putExtra("pos", position);
  111. startActivity(intent, bundle);
  112.  
  113. }
  114.  
  115. /**
  116. * create CircularReveal animation
  117. */
  118. public Animator createAnimation(View v) {
  119. // create a CircularReveal animation
  120. Animator animator = ViewAnimationUtils.createCircularReveal(
  121. v,
  122. v.getWidth() / 2,
  123. v.getHeight() / 2,
  124. 0,
  125. v.getWidth());
  126. animator.setInterpolator(new AccelerateDecelerateInterpolator());
  127. animator.setDuration(500);
  128. return animator;
  129. }
  130.  
  131. }

第二个Activity——DetailActivity:

  1. public class DetailActivity extends Activity {
  2.  
  3. ImageView pic;
  4.  
  5. int position;
  6.  
  7. int picIndex = 0;
  8.  
  9. Actor actor;
  10.  
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. // set Explode enter transition animation for current activity
  15. getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
  16. getWindow().setEnterTransition(new Explode().setDuration(1000));
  17. getWindow().setExitTransition(null);
  18.  
  19. setContentView(R.layout.detail_layout);
  20.  
  21. position = getIntent().getIntExtra("pos", 0);
  22. actor = MyActivity.actors.get(position);
  23. pic = (ImageView) findViewById(R.id.detail_pic);
  24.  
  25. TextView name = (TextView) findViewById(R.id.detail_name);
  26. TextView works = (TextView) findViewById(R.id.detail_works);
  27. TextView role = (TextView) findViewById(R.id.detail_role);
  28. ImageButton btn = (ImageButton) findViewById(R.id.detail_btn);
  29.  
  30. // set detail info
  31. pic.setTransitionName(position + "pic");
  32. pic.setImageDrawable(getDrawable(actor.getImageResourceId(this)));
  33. name.setText("姓名:" + actor.name);
  34. works.setText("代表作:" + actor.works);
  35. role.setText("饰演:" + actor.role);
  36. // set action bar title
  37. getActionBar().setTitle(MyActivity.actors.get(position).name);
  38.  
  39. // floating action button
  40. btn.setImageDrawable(getDrawable(android.R.drawable.ic_menu_gallery));
  41. btn.setOnClickListener(new View.OnClickListener() {
  42. @Override
  43. public void onClick(View v) {
  44. // set first animation
  45. Animator animator = createAnimation(pic, true);
  46. animator.start();
  47. animator.addListener(new Animator.AnimatorListener() {
  48. @Override
  49. public void onAnimationStart(Animator animation) {
  50.  
  51. }
  52.  
  53. @Override
  54. public void onAnimationEnd(Animator animation) {
  55. picIndex++;
  56. if (actor.getPics() != null) {
  57. if (picIndex >= actor.getPics().length) {
  58. picIndex = 0;
  59. }
  60. // set second animation
  61. doSecondAnim();
  62. }
  63. }
  64.  
  65. @Override
  66. public void onAnimationCancel(Animator animation) {
  67.  
  68. }
  69.  
  70. @Override
  71. public void onAnimationRepeat(Animator animation) {
  72.  
  73. }
  74. });
  75. }
  76. });
  77. }
  78.  
  79. /**
  80. * exec second animation for pic view
  81. */
  82. private void doSecondAnim() {
  83. pic.setImageDrawable(getDrawable(actor.getImageResourceId(this, actor.getPics()[picIndex])));
  84. Animator animator = createAnimation(pic, false);
  85. animator.start();
  86. }
  87.  
  88. /**
  89. * create CircularReveal animation with first and second sequence
  90. */
  91. public Animator createAnimation(View v, Boolean isFirst) {
  92.  
  93. Animator animator;
  94.  
  95. if (isFirst) {
  96. animator = ViewAnimationUtils.createCircularReveal(
  97. v,
  98. v.getWidth() / 2,
  99. v.getHeight() / 2,
  100. v.getWidth(),
  101. 0);
  102. } else {
  103. animator = ViewAnimationUtils.createCircularReveal(
  104. v,
  105. v.getWidth() / 2,
  106. v.getHeight() / 2,
  107. 0,
  108. v.getWidth());
  109. }
  110.  
  111. animator.setInterpolator(new DecelerateInterpolator());
  112. animator.setDuration(500);
  113. return animator;
  114. }
  115.  
  116. @Override
  117. public void onBackPressed() {
  118. super.onBackPressed();
  119. pic.setImageDrawable(getDrawable(actor.getImageResourceId(this, actor.picName)));
  120. finishAfterTransition();
  121. }
  122.  
  123. }

RecyclerView的Adapter:

  1. public class MyAdapter
  2. extends RecyclerView.Adapter<MyAdapter.ViewHolder>
  3. {
  4.  
  5. private List<Actor> actors;
  6.  
  7. private Context mContext;
  8.  
  9. public MyAdapter( Context context , List<Actor> actors)
  10. {
  11. this.mContext = context;
  12. this.actors = actors;
  13. }
  14.  
  15. @Override
  16. public ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i )
  17. {
  18. View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view, viewGroup, false);
  19. return new ViewHolder(v);
  20. }
  21.  
  22. @Override
  23. public void onBindViewHolder( ViewHolder viewHolder, int i )
  24. {
  25. Actor p = actors.get(i);
  26. viewHolder.mContext = mContext;
  27. viewHolder.mTextView.setText(p.name);
  28. viewHolder.mImageView.setImageDrawable(mContext.getDrawable(p.getImageResourceId(mContext)));
  29. }
  30.  
  31. @Override
  32. public int getItemCount()
  33. {
  34. return actors == null ? 0 : actors.size();
  35. }
  36.  
  37. public static class ViewHolder
  38. extends RecyclerView.ViewHolder
  39. {
  40. public TextView mTextView;
  41.  
  42. public ImageView mImageView;
  43.  
  44. public Context mContext;
  45.  
  46. public ViewHolder( View v )
  47. {
  48. super(v);
  49. mTextView = (TextView) v.findViewById(R.id.name);
  50. mImageView = (ImageView) v.findViewById(R.id.pic);
  51.  
  52. v.setOnClickListener(new View.OnClickListener() {
  53. @Override
  54. public void onClick(View v) {
  55. ((MyActivity)mContext).startActivity(v, getPosition());
  56. }
  57. });
  58. }
  59. }
  60. }

剩余的Layout文件和一些烂七八糟的东西大家能够通过下方的Github连接找到。

Github下载地址:https://github.com/a396901990/AndroidDemo  (AndroidL_MaterialDesgin_Demo)

写在最后:

代码写的比較搓,仅仅为了高速完毕功能,非常多不规范的大家忽略好了。

而且代码中仅仅有一些简单的注解,并没有具体解说,由于我认为也没什么可讲的,当中内容都是我之前文章中样例的应用。

大家能够对比上面的Demo简单介绍中的知识点去对应的文章中寻找相关的具体信息。

ANDROID L——Material Design综合应用(Demo)的更多相关文章

  1. [转]ANDROID L——Material Design详解(动画篇)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 转自:http://blog.csdn.net/a396901990/article/de ...

  2. ANDROID L——Material Design具体解释(动画篇)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  3. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  4. ANDROID L——Material Design详细解释(UI控制)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  5. ANDROID L——Material Design具体解释(主题和布局)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990).谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  6. Android实现Material Design风格的设置页面(滑动开关控件)

    前言 本文链接 http://blog.csdn.net/never_cxb/article/details/50763271 转载请注明出处 參考了这篇文章 Material Design 风格的设 ...

  7. Android UI Material Design

    Material Design 中文版: http://wiki.jikexueyuan.com/project/material-design/ Material Design开发文章系列1:App ...

  8. Material Design综合实例

    背景知识 drawlayout的使用 recycleView的使用 CardView的使用 一些开源动画库的使用 ImageView的scaleType属性与adjustViewBounds属性 ,参 ...

  9. ANDROID L——RecyclerView,CardView进口和使用(Demo)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 简单介绍: 这篇文章是ANDROID L--Material Design具体解释(UI控 ...

随机推荐

  1. JVM调优总结(十)-调优方法

    JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 ...

  2. scrapy新浪天气

    一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: LX终端(LXTermin ...

  3. Java 生成本文文件的时候,Dos格式转成Unix格式

    仅仅须要在生成文本的最后 加上 sb.append("\n\r");就可以 是/n/r 不是/r/n

  4. Endnote从头开始五:修改output style(转载)

    Endnote从头开始五:修改output style Endnote中虽然有大量的期刊格式,但是并不能囊括所有我们需要的style,所以学会自己制作或编辑已有的期刊格式是很重要的,本节内容是Endn ...

  5. webstorm与phpstorm主题配置

    原创. 更换webstorm的主题的,照着网上的教程试了好多次都发现不行,而且我之前有个同学也是这样的问题,找不到相关的colors文件夹,所以在网上教程的基础上对于更改主题做了细微的修改. 1.下载 ...

  6. Qt4_VS10 程序打包发布

    源地址:http://www.2cto.com/kf/201306/217205.html 目录结构如下: ---------------------------------------------- ...

  7. Javascript跨域请求的几种解决方法

    什么情况下才会出现跨域? 假设域名是:http://www.example.com.cn/ 如果所请求的域名跟这个域名不致,这种情况就是跨域,由于跨域存在漏洞,所以一般来说正常的跨域请求方式是请求不到 ...

  8. Android来电监听

    本文实现来电自动接听,自动录音,自动回拨功能. public class MainActivity extends Activity { @Override protected void onCrea ...

  9. 日本IT工作有感

    不知不觉,在日本关西已经呆了快一个月了. 除了饮食有点不是非常习惯.其他感觉都还好. 日本这边的文化还是非常偏向project师的,project师的社会地位非常高,公司里面也没有国内所谓35岁的焦虑 ...

  10. 【书评】RHCSA/RHCE Red Hat Linux 认证学习指南(第6版)EX200 & EX300

    这次参加 CSDN 举办的读书活动,正赶上项目忙,看得也是断断续续,拖了2周了,才能来写这个书评. ========== 书评的分割线 ========== 首先,我会肯定的告诉你,不论你是一名专业的 ...