转载请注明本文出自大苞米的博客(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:

public class MyActivity extends Activity {private RecyclerView mRecyclerView;private MyAdapter myAdapter;ImageButton button;Context context;public static List<Actor> actors = new ArrayList<Actor>();private static String[] names = {"朱茵", "张柏芝", "张敏", "莫文蔚", "黄圣依", "赵薇", "如花"};private static String[] pics = {"p1", "p2", "p3", "p4", "p5", "p6", "p7"};private static String[] works = {"大话西游", "喜剧之王", "p3", "p4", "p5", "p6", "p7"};private static String[] role = {"紫霞仙子", "柳飘飘", "p3", "p4", "p5", "p6", "p7"};private static String[][] picGroups = {{"p1","p1_1", "p1_2", "p1_3"},{"p2","p2_1", "p2_2", "p2_3"},{"p3"},{"p4"},{"p5"},{"p6"},{"p7"}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// set Explode enter transition animation for current activitygetWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);getWindow().setEnterTransition(new Explode().setDuration(1000));setContentView(R.layout.main_layout);// init datathis.context = this;actors.add(new Actor(names[0], pics[0], works[0], role[0], picGroups[0]));getActionBar().setTitle("那些年我们追的星女郎");// init RecyclerViewmRecyclerView = (RecyclerView) findViewById(R.id.list);mRecyclerView.setLayoutManager(new LinearLayoutManager(this));mRecyclerView.setItemAnimator(new DefaultItemAnimator());// set adaptermyAdapter = new MyAdapter(this, actors);mRecyclerView.setAdapter(myAdapter);// set outline and listener for floating action buttonbutton = (ImageButton) this.findViewById(R.id.add_button);button.setOutlineProvider(new ViewOutlineProvider() {@Overridepublic void getOutline(View view, Outline outline) {int shapeSize = (int) getResources().getDimension(R.dimen.shape_size);outline.setRoundRect(0, 0, shapeSize, shapeSize, shapeSize / 2);}});button.setClipToOutline(true);button.setOnClickListener(new MyOnClickListener());}public class MyOnClickListener implements View.OnClickListener {boolean isAdd = true;@Overridepublic void onClick(View v) {// start animationAnimator animator = createAnimation(v);animator.start();// add itemif (myAdapter.getItemCount() != names.length && isAdd) {actors.add(new Actor(names[myAdapter.getItemCount()], pics[myAdapter.getItemCount()], works[myAdapter.getItemCount()], role[myAdapter.getItemCount()], picGroups[myAdapter.getItemCount()]));mRecyclerView.scrollToPosition(myAdapter.getItemCount() - 1);myAdapter.notifyDataSetChanged();}// delete itemelse {actors.remove(myAdapter.getItemCount() - 1);mRecyclerView.scrollToPosition(myAdapter.getItemCount() - 1);myAdapter.notifyDataSetChanged();}if (myAdapter.getItemCount() == 0) {button.setImageDrawable(getDrawable(android.R.drawable.ic_input_add));isAdd = true;}if (myAdapter.getItemCount() == names.length) {button.setImageDrawable(getDrawable(android.R.drawable.ic_delete));isAdd = false;}}}/*** start detail activity*/public void startActivity(final View v, final int position) {View pic = v.findViewById(R.id.pic);View add_btn = this.findViewById(R.id.add_button);// set share element transition animation for current activityTransition ts = new ChangeTransform();ts.setDuration(3000);getWindow().setExitTransition(ts);Bundle bundle = ActivityOptions.makeSceneTransitionAnimation((Activity) context,Pair.create(pic, position + "pic"),Pair.create(add_btn, "ShareBtn")).toBundle();// start activity with share element transitionIntent intent = new Intent(context, DetailActivity.class);intent.putExtra("pos", position);startActivity(intent, bundle);}/*** create CircularReveal animation*/public Animator createAnimation(View v) {// create a CircularReveal animationAnimator animator = ViewAnimationUtils.createCircularReveal(v,v.getWidth() / 2,v.getHeight() / 2,0,v.getWidth());animator.setInterpolator(new AccelerateDecelerateInterpolator());animator.setDuration(500);return animator;}}

第二个Activity——DetailActivity:

public class DetailActivity extends Activity {ImageView pic;int position;int picIndex = 0;Actor actor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// set Explode enter transition animation for current activitygetWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);getWindow().setEnterTransition(new Explode().setDuration(1000));getWindow().setExitTransition(null);setContentView(R.layout.detail_layout);position = getIntent().getIntExtra("pos", 0);actor = MyActivity.actors.get(position);pic = (ImageView) findViewById(R.id.detail_pic);TextView name = (TextView) findViewById(R.id.detail_name);TextView works = (TextView) findViewById(R.id.detail_works);TextView role = (TextView) findViewById(R.id.detail_role);ImageButton btn = (ImageButton) findViewById(R.id.detail_btn);// set detail infopic.setTransitionName(position + "pic");pic.setImageDrawable(getDrawable(actor.getImageResourceId(this)));name.setText("姓名:" + actor.name);works.setText("代表作:" + actor.works);role.setText("饰演:" + actor.role);// set action bar titlegetActionBar().setTitle(MyActivity.actors.get(position).name);// floating action buttonbtn.setImageDrawable(getDrawable(android.R.drawable.ic_menu_gallery));btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// set first animationAnimator animator = createAnimation(pic, true);animator.start();animator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {picIndex++;if (actor.getPics() != null) {if (picIndex >= actor.getPics().length) {picIndex = 0;}// set second animationdoSecondAnim();}}@Overridepublic void onAnimationCancel(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}});}});}/*** exec second animation for pic view*/private void doSecondAnim() {pic.setImageDrawable(getDrawable(actor.getImageResourceId(this, actor.getPics()[picIndex])));Animator animator = createAnimation(pic, false);animator.start();}/*** create CircularReveal animation with first and second sequence*/public Animator createAnimation(View v, Boolean isFirst) {Animator animator;if (isFirst) {animator = ViewAnimationUtils.createCircularReveal(v,v.getWidth() / 2,v.getHeight() / 2,v.getWidth(),0);} else {animator = ViewAnimationUtils.createCircularReveal(v,v.getWidth() / 2,v.getHeight() / 2,0,v.getWidth());}animator.setInterpolator(new DecelerateInterpolator());animator.setDuration(500);return animator;}@Overridepublic void onBackPressed() {super.onBackPressed();pic.setImageDrawable(getDrawable(actor.getImageResourceId(this, actor.picName)));finishAfterTransition();}}

RecyclerView的Adapter:

public class MyAdapterextends RecyclerView.Adapter<MyAdapter.ViewHolder>
{private List<Actor> actors;private Context mContext;public MyAdapter( Context context , List<Actor> actors){this.mContext = context;this.actors = actors;}@Overridepublic ViewHolder onCreateViewHolder( ViewGroup viewGroup, int i ){View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_view, viewGroup, false);return new ViewHolder(v);}@Overridepublic void onBindViewHolder( ViewHolder viewHolder, int i ){Actor p = actors.get(i);viewHolder.mContext = mContext;viewHolder.mTextView.setText(p.name);viewHolder.mImageView.setImageDrawable(mContext.getDrawable(p.getImageResourceId(mContext)));}@Overridepublic int getItemCount(){return actors == null ? 0 : actors.size();}public static class ViewHolderextends RecyclerView.ViewHolder{public TextView mTextView;public ImageView mImageView;public Context mContext;public ViewHolder( View v ){super(v);mTextView = (TextView) v.findViewById(R.id.name);mImageView = (ImageView) v.findViewById(R.id.pic);v.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {((MyActivity)mContext).startActivity(v, getPosition());}});}}
}

剩余的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),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  2. ANDROID L——Material Design详解(视图和阴影)

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

  3. ANDROID L——Material Design详解(主题和布局)

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

  4. Android L Material Design 初探 (基于AppCompat v21)

    学习 Android Developer Blog 上面的两篇文章--"Implementing Material Design in Your Android app"和&quo ...

  5. android 布局收缩成球,Android使用Material Design实现悬浮按钮

    前言 ​ 本文是对<Android第一行代码>第十二章<最佳UI体验--Material Design实战>中关于悬浮按钮实现的学习和记录,主要内容包括-- FloatingA ...

  6. 说说 Android 的 Material Design 设计(四)——卡片式布局

    我们使用 CardView 与 RecyclerView 来·实现一个各种猫的卡片式展示列表吧O(∩_∩)O~ 1 CardView 控件 1.1 引入依赖库 打开 app/build.gradle, ...

  7. android 自定义 snackbar,Android Study Material Design 五 之:自定义Toast以及玩转SnackBar...

    > LZ-Says:有时候真的不需要让自己在意太多,在意的太多,反而有些累,计较太多,反而让自己患得患失,随心随性就好,愿各位伙计能开心撸码~ > LZ-Says:有时候真的不需要让自己在 ...

  8. Android Study Material Design 十 再探沉浸式

    LZ-Says: 这些年,身边的"兄弟"越来越多, 真正的兄弟越来越少... 前言 今天,我们不讲美女,不讲三国,那么我们一起来聊聊有关Android中沉浸式实现. 关于写这篇文章 ...

  9. Android学习 - Material Design设计规范

    作为技术开发者需不需要了解设计规范?个人认为非常需要,一个交流的需要,另一就是了解相关的设计才能储备相应地知识,知道UI开发的方向.这问题非常希望读者能留言讨论.Android的设计风格变迁可以划分到 ...

最新文章

  1. matlab rbf函数_基于径向基函数(RBF)的无网格伪谱法与程序实现(2)——微分矩阵...
  2. python环境变量的运用_Windows下python环境变量配置
  3. CDN行业“三足鼎立”格局已定,谁能代表未来?
  4. xcode 插件安装路径
  5. kali怎么进入root用户_linux中怎么进入root用户
  6. 利用itext包实现java报表打印_利用iText包实现Java报表打印
  7. Javascript 笔记与总结(2-1)Javascript 与 DOM
  8. C# 从类库中获取资源图片,把图片资源保存到类库中
  9. DCGAN训练人脸照片,pytorch
  10. python can通信_Python中的高级/抽象Canbus接口
  11. 14周:设计会员登录页面
  12. html表格可视化设计器,基于vue-element-ui的一款表格设计器table-making
  13. python编程用什么软件-python用什么软件编写
  14. vc写的工程源代码打包工具
  15. 王者荣耀模型制作曝光
  16. 苍穹插件常用事件与方法
  17. 网络安全的魔法——社会工程学
  18. 《Linux内核情景分析》阅读笔记
  19. 了解并总结软件工程与计算机科学的关系及区别,你的观点?
  20. (转)MultipleOutputFormat和MultipleOutputs

热门文章

  1. 【Pandas】apply,applymap和map的区别
  2. 8-1日复习 模板函数 模板类
  3. linux中facl有什么作用,在Linux中使用setfacl后权限被拒绝
  4. 美开发数据自毁技术适用云计算架构
  5. 解决Linux系统没有/etc/sysconfig/iptables文件
  6. 存储IOPS参数结合实例详解
  7. 实战部署MySQL用户认证的Postfix邮件系统(3)
  8. 要活多久才能赚回你交的养老金
  9. colab如何通过<>来直接加入相对应的代码段呢?模块化代码操作,真好
  10. counterfactual