背景知识

  1. drawlayout的使用
  2. recycleView的使用
  3. CardView的使用
  4. 一些开源动画库的使用

ImageView的scaleType属性与adjustViewBounds属性 ,参考链接:

ImageView的android:adjustViewBounds属性 - - ITeye技术网站

Android ImageView的scaleType属性与adjustViewBounds属性 - Android移动开发技术文章_手机开发 - 红黑联盟

效果如下





程序开始动画实现

第一步:使用开源库

gzu-liyujiang/ViewAnimator: A fluent Android animation library。安卓动画库

在depencies中加入

  1. compile 'com.github.florent37:viewanimator:1.0.2@aar'
  2. compile 'com.nineoldandroids:library:2.4.0'

java代码

  1. package com.zj.materialfood;
  2. import android.content.Intent;
  3. import android.graphics.Color;
  4. import android.os.Bundle;
  5. import android.os.Message;
  6. import android.support.v7.app.AppCompatActivity;
  7. import android.view.animation.AccelerateDecelerateInterpolator;
  8. import android.widget.ImageView;
  9. import android.widget.TextView;
  10. import com.github.florent37.viewanimator.AnimationListener;
  11. import com.github.florent37.viewanimator.ViewAnimator;
  12. import java.util.Locale;
  13. /**
  14. * Created by jjx on 2016/4/9.
  15. */
  16. public class StartActivity extends AppCompatActivity{
  17. ImageView image;
  18. ImageView mountain;
  19. TextView text;
  20. TextView percent;
  21. android.os.Handler handler=new android.os.Handler()
  22. {
  23. @Override
  24. public void handleMessage(Message msg) {
  25. super.handleMessage(msg);
  26. }
  27. };
  28. @Override
  29. protected void onCreate(Bundle savedInstanceState) {
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.activity_start);
  32. image = (ImageView) findViewById(R.id.image1);
  33. mountain = (ImageView) findViewById(R.id.mountain);
  34. text = (TextView) findViewById(R.id.text1);
  35. percent = (TextView) findViewById(R.id.percent);
  36. animateParallel();
  37. /*handler.postDelayed(new Runnable() {
  38. @Override
  39. public void run() {
  40. // TODO Auto-generated method stub
  41. //进入主页面
  42. Intent intent = new Intent(StartActivity.this, MainActivity.class);
  43. startActivity(intent);
  44. }
  45. }, 6000);*/
  46. }
  47. private void animateParallel() {
  48. ViewAnimator.animate(mountain, image)
  49. .dp().translationY(-1000, 0)
  50. .alpha(0, 1)
  51. .andAnimate(percent)
  52. .scale(0, 1)
  53. .andAnimate(text)
  54. .dp().translationY(1000, 0)
  55. .textColor(Color.BLACK, Color.WHITE)
  56. .backgroundColor(Color.WHITE, Color.BLACK)
  57. .waitForHeight()
  58. .interpolator(new AccelerateDecelerateInterpolator())
  59. .duration(1000)
  60. .thenAnimate(percent)
  61. .custom(new AnimationListener.Update<TextView>() {
  62. @Override
  63. public void update(TextView view, float value) {
  64. value = value * 100;
  65. view.setText(String.format(Locale.US, "%.0f%%", value));
  66. }
  67. }, 0, 1)
  68. .andAnimate(image)
  69. .rotation(0, 360)
  70. .onStop(new AnimationListener.Stop() {
  71. @Override
  72. public void onStop() {
  73. Intent intent = new Intent(StartActivity.this, MainActivity.class);
  74. startActivity(intent);
  75. }
  76. })
  77. .duration(1000)
  78. .start();
  79. }
  80. }

主界面效果实现

使用开源库

gabrielemariotti/RecyclerViewItemAnimators: An Android library which provides simple Item animations to RecyclerView items

添加依赖

  1. dependencies {
  2. compile 'com.github.gabrielemariotti.recyclerview:recyclerview-animators:0.3.0-SNAPSHOT@aar'
  3. }

添加仓库

  1. repositories {
  2. maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
  3. }

实现

  1. package com.zj.materialfood;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.os.Message;
  5. import android.support.design.widget.NavigationView;
  6. import android.support.v4.widget.DrawerLayout;
  7. import android.support.v7.app.ActionBarDrawerToggle;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.support.v7.widget.GridLayoutManager;
  10. import android.support.v7.widget.RecyclerView;
  11. import android.support.v7.widget.Toolbar;
  12. import android.view.LayoutInflater;
  13. import android.view.View;
  14. import android.view.ViewGroup;
  15. import android.widget.ImageView;
  16. import java.util.List;
  17. import it.gmariotti.recyclerview.adapter.SlideInBottomAnimatorAdapter;
  18. import it.gmariotti.recyclerview.adapter.SlideInRightAnimatorAdapter;
  19. public class MainActivity extends AppCompatActivity {
  20. RecyclerView recyclerView;
  21. private List<String> mDatas;
  22. private HomeAdapter mAdapter;
  23. int ids[]=new int[]{R.drawable.food1,R.drawable.food2,R.drawable.food3,R.drawable.food4,R.drawable.food5,R.drawable.food6,R.drawable.food7,R.drawable.food8};
  24. Toolbar toolbar;
  25. SlideInBottomAnimatorAdapter slideInBottomAnimatorAdapter;
  26. SlideInRightAnimatorAdapter slideInRightAnimatorAdapter;
  27. DrawerLayout mDrawerLayout;
  28. ActionBarDrawerToggle mDrawerToggle;
  29. NavigationView mNavigationView;
  30. android.os.Handler handler=new android.os.Handler()
  31. {
  32. @Override
  33. public void handleMessage(Message msg) {
  34. super.handleMessage(msg);
  35. }
  36. };
  37. @Override
  38. protected void onCreate(Bundle savedInstanceState) {
  39. super.onCreate(savedInstanceState);
  40. setContentView(R.layout.activity_main);
  41. toolbar= (Toolbar) findViewById(R.id.toolbar);
  42. setSupportActionBar(toolbar);
  43. setTitle("天天美食");
  44. //设置DrawerLayout
  45. mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
  46. mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar,
  47. R.string.drawer_open, R.string.drawer_close)
  48. {
  49. //关闭侧边栏时响应
  50. @Override
  51. public void onDrawerClosed(View drawerView) {
  52. super.onDrawerClosed(drawerView);
  53. }
  54. //打开侧边栏时响应
  55. @Override
  56. public void onDrawerOpened(View drawerView) {
  57. super.onDrawerOpened(drawerView);
  58. }
  59. };
  60. mDrawerToggle.syncState();
  61. mDrawerLayout.setDrawerListener(mDrawerToggle);
  62. //设置NavigationView点击事件
  63. mNavigationView = (NavigationView) findViewById(R.id.navigation_view);
  64. setupDrawerContent(mNavigationView);
  65. //设置NavigationView点击事件
  66. recyclerView= (RecyclerView) findViewById(R.id.id_recyclerview);
  67. recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
  68. mAdapter=new HomeAdapter();
  69. slideInBottomAnimatorAdapter=new SlideInBottomAnimatorAdapter(mAdapter,recyclerView);
  70. //recyclerView.setAdapter(slideInRightAnimatorAdapter);
  71. handler.postDelayed(new Runnable() {
  72. @Override
  73. public void run() {
  74. // TODO Auto-generated method stub
  75. //进入主页面
  76. recyclerView.setAdapter(slideInBottomAnimatorAdapter);
  77. }
  78. }, 1000);
  79. //recyclerView.setAdapter(mAdapter);
  80. }
  81. private void setupDrawerContent(NavigationView mNavigationView) {
  82. }
  83. class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
  84. {
  85. @Override
  86. public HomeAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  87. MyViewHolder holder=new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(R.layout.item_main,parent,false));
  88. return holder;
  89. }
  90. @Override
  91. public void onBindViewHolder(HomeAdapter.MyViewHolder holder, int position) {
  92. holder.iv.setBackgroundResource(ids[position]);
  93. }
  94. @Override
  95. public int getItemCount() {
  96. return 8;
  97. }
  98. class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
  99. {
  100. ImageView iv;
  101. public MyViewHolder(View view)
  102. {
  103. super(view);
  104. iv = (ImageView) view.findViewById(R.id.iv_food);
  105. view.setOnClickListener(this);
  106. }
  107. @Override
  108. public void onClick(View view) {
  109. Intent intent=new Intent(MainActivity.this,FoodCardActivity.class);
  110. startActivity(intent);
  111. }
  112. }
  113. }
  114. }

食物列表界面

注意,笔者在这里碰到了很大的坑

老是报空指针异常,后来发现问题出在设置TextView时,setTextView时总是出错,搞了很久都不明白,后来才发现是在 public ViewHolder(View v) 方法中,绑定View与ViewHolder时,findViewById没有用 v.findViewById(R.id.iv_food_item),而是直接findViewById(R.id.iv_food_item)了。

总体页面布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent">
  6. <android.support.v7.widget.Toolbar
  7. android:id="@+id/food_toolbar"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:layout_alignParentTop="true"
  11. android:title="天天美食"
  12. android:background="?attr/colorPrimary"
  13. >
  14. </android.support.v7.widget.Toolbar>
  15. <android.support.v7.widget.RecyclerView
  16. android:id="@+id/food_recyclerview"
  17. android:layout_width="match_parent"
  18. android:layout_height="match_parent"
  19. android:layout_below="@+id/food_toolbar"
  20. android:scrollbars="none" />
  21. </RelativeLayout>

recyView的item布局

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. android:layout_marginBottom="@dimen/card_margin"
  7. android:layout_marginLeft="@dimen/card_margin"
  8. android:layout_marginRight="@dimen/card_margin"
  9. android:clickable="true"
  10. app:cardCornerRadius="10dp"
  11. app:cardElevation="10dp">
  12. <LinearLayout
  13. style="@style/CardView.Content"
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:orientation="horizontal">
  17. <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
  18. android:id="@+id/iv_food_item"
  19. android:layout_width="109dp"
  20. android:layout_height="135dp"
  21. android:adjustViewBounds="true"
  22. android:background="@drawable/food6"
  23. android:gravity="center"
  24. android:layout_margin="4dp"
  25. />
  26. <LinearLayout
  27. android:layout_width="match_parent"
  28. android:layout_height="wrap_content"
  29. android:layout_marginLeft="10dp"
  30. android:orientation="vertical">
  31. <TextView
  32. android:id="@+id/tvTitle"
  33. android:layout_width="match_parent"
  34. android:layout_height="wrap_content"
  35. android:textAppearance="@style/TextAppearance.AppCompat.Title"
  36. android:text="麻婆豆腐"
  37. android:textColor="@color/primary_text" />
  38. <TextView
  39. android:id="@+id/tvDesc"
  40. android:layout_width="match_parent"
  41. android:layout_height="wrap_content"
  42. android:layout_marginTop="2dp"
  43. android:text="@string/book_description_1"
  44. android:textColor="@color/secondary_text" />
  45. </LinearLayout>
  46. </LinearLayout>
  47. </android.support.v7.widget.CardView>

java代码实现

  1. package com.zj.materialfood;
  2. import android.content.Intent;
  3. import android.os.Bundle;
  4. import android.support.design.widget.Snackbar;
  5. import android.support.v4.app.NavUtils;
  6. import android.support.v4.app.TaskStackBuilder;
  7. import android.support.v7.app.ActionBar;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.support.v7.widget.DefaultItemAnimator;
  10. import android.support.v7.widget.LinearLayoutManager;
  11. import android.support.v7.widget.RecyclerView;
  12. import android.support.v7.widget.Toolbar;
  13. import android.util.TypedValue;
  14. import android.view.LayoutInflater;
  15. import android.view.MenuItem;
  16. import android.view.View;
  17. import android.view.ViewGroup;
  18. import android.widget.ImageView;
  19. import android.widget.TextView;
  20. /**
  21. * Created by jjx on 2016/4/10.
  22. */
  23. public class FoodCardActivity extends AppCompatActivity{
  24. Toolbar toolbar;
  25. RecyclerView recyclerView;
  26. MyAdapter mAdapter;
  27. int img_ids[]=new int[]{R.drawable.lvfood1,R.drawable.lvfood2,R.drawable.lvfood3,R.drawable.lvfood4,R.drawable.lvfood5,R.drawable.lvfood6,R.drawable.lvfood7,R.drawable.lvfood8,R.drawable.lvfood9,R.drawable.lvfood10};
  28. String titles[]=new String[]{"麻婆豆腐","灯影牛肉","夫妻肺片","蒜泥白肉","白油豆腐","鱼香肉丝","泉水豆花","宫保鸡丁 ","东坡墨鱼 ","麻辣香锅"};
  29. @Override
  30. protected void onCreate(Bundle savedInstanceState) {
  31. super.onCreate(savedInstanceState);
  32. setContentView(R.layout.activity_foodcard);
  33. toolbar= (Toolbar) findViewById(R.id.food_toolbar);
  34. setSupportActionBar(toolbar);
  35. setTitle("美食菜单");
  36. ActionBar actionBar=getSupportActionBar();
  37. actionBar.setDisplayHomeAsUpEnabled(true);
  38. recyclerView= (RecyclerView) findViewById(R.id.food_recyclerview);
  39. recyclerView.setHasFixedSize(true);
  40. LinearLayoutManager linearLayoutManager=new LinearLayoutManager(FoodCardActivity.this);
  41. recyclerView.setLayoutManager(linearLayoutManager);
  42. recyclerView.setItemAnimator(new DefaultItemAnimator());
  43. mAdapter = new MyAdapter();
  44. recyclerView.setAdapter(mAdapter);
  45. }
  46. public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
  47. private final TypedValue mTypedValue = new TypedValue();
  48. // Provide a reference to the views for each data item
  49. // Complex data items may need more than one view per item, and
  50. // you provide access to all the views for a data item in a view holder
  51. public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
  52. // each data item is just a string in this case
  53. public TextView mTextView;
  54. public ImageView iv_food;
  55. public TextView textDesc;
  56. public ViewHolder(View v) {
  57. super(v);
  58. mTextView = (TextView) v.findViewById(R.id.tvTitle);
  59. iv_food= (ImageView) v.findViewById(R.id.iv_food_item);
  60. textDesc= (TextView) v.findViewById(R.id.tvDesc);
  61. v.setOnClickListener(this);
  62. }
  63. @Override
  64. public void onClick(View view) {
  65. String text = "I Love " + mTextView.getText() + ".";
  66. Snackbar.make(view, text, Snackbar.LENGTH_SHORT).show();
  67. }
  68. }
  69. // Provide a suitable constructor (depends on the kind of dataset)
  70. @Override
  71. public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
  72. int viewType) {
  73. // create a new view
  74. View v = LayoutInflater.from(parent.getContext())
  75. .inflate(R.layout.food_item, parent, false);
  76. // set the view's size, margins, paddings and layout parameters
  77. ViewHolder vh = new ViewHolder(v);
  78. return vh;
  79. }
  80. // Replace the contents of a view (invoked by the layout manager)
  81. @Override
  82. public void onBindViewHolder(ViewHolder holder, int position) {
  83. // - get element from your dataset at this position
  84. // - replace the contents of the view with that element
  85. //holder.mTextView.setText(mDataset[position]);
  86. holder.mTextView.setText(titles[position]);
  87. holder.iv_food.setBackgroundResource(img_ids[position]);
  88. holder.textDesc.setText("很好吃的一道菜 \n东南第一佳味,天下之至美 \n地址:武珞路30号 \n234人吃过 \n价格: 88.00元");
  89. }
  90. // Return the size of your dataset (invoked by the layout manager)
  91. @Override
  92. public int getItemCount() {
  93. return 10;
  94. }
  95. }
  96. @Override
  97. public boolean onOptionsItemSelected(MenuItem item) {
  98. switch(item.getItemId())
  99. {
  100. case android.R.id.home:
  101. Intent upIntent = NavUtils.getParentActivityIntent(this);
  102. if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
  103. TaskStackBuilder.create(this)
  104. .addNextIntentWithParentStack(upIntent)
  105. .startActivities();
  106. } else {
  107. upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  108. NavUtils.navigateUpTo(this, upIntent);
  109. }
  110. return true;
  111. default:
  112. return super.onOptionsItemSelected(item);
  113. }
  114. }
  115. }

完成

Material Design综合实例的更多相关文章

  1. ANDROID L——Material Design综合应用(Demo)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Material Design: Material Design是Google推出的一个全 ...

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

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

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

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

  4. 拟物设计和Angular的实现 - Material Design(持续更新)

    Material Design是Google最新发布的跨平台统一视觉设计语言.直接翻译是物质设计,但是我更倾向于使用"拟物设计"更为准确. 据谷歌介绍,Material Desig ...

  5. Android学习之基础知识十五 — 最佳UI体验(Material Design实战)

    一.前言 长久以来,大多数人都认为Android系统的UI并不美观,至少没有iOS系统的美观.以至于很多IT公司在进行应用界面设计的时候,为了保证双平台的统一性,强制要求Android端的界面风格必须 ...

  6. 拟物设计和Angular的实现 - Material Design

    Material Design是Google最新发布的跨平台统一视觉设计语言.直接翻译是物质设计,但是我更倾向于使用"拟物设计"更为准确. 据谷歌介绍,Material Desig ...

  7. Android Material Design 兼容库的使用

    Android Material Design 兼容库的使用 mecury 前言:近来学习了Android Material Design 兼容库,为了把这个弄懂,才有了这篇博客,这里先推荐两篇博客: ...

  8. Android Material Design控件学习(一)——TabLayout的用法

    前言 Google官方在14年Google I/O上推出了全新的设计语言--Material Design.一并推出了一系列实现Material Design效果的控件库--Android Desig ...

  9. Android5.0新特性——Material Design简介

    Material Design Material Design简介 Material Design是谷歌新的设计语言,谷歌希望寄由此来统一各种平台上的用户体验,Material Design的特点是干 ...

随机推荐

  1. Longest Increasing Common Subsequence (LICS)

    最长上升公共子序列(Longest Increasing Common Subsequence,LICS)也是经典DP问题,是LCS与LIS的混合. Problem 求数列 a[1..n], b[1. ...

  2. ubuntu使用ssh登入不执行.bashrc解决方法

    解决方法,可以直接输入 bash即可. 理解 bashrc 和 profile linux bashrc profile SEP 30TH, 2011 BY SUNTEYA 在一般的 linux 或者 ...

  3. Hacker's guide to Neural Networks

    Hacker's guide to Neural Networks Hi there, I'm a CS PhD student at Stanford. I've worked on Deep Le ...

  4. ios 图片尺寸

  5. iOS欢迎界面Launch Screen动态加载广告

    有许多应用程序在打开的时候,欢迎界面会加载一张连网获取的广告图片或者显示一组动画,这样的效果是如何做到的呢?下面给大家介绍一种简单的实现加载广告的方式. 程序运行起来,欢迎界面之后,会进入AppDel ...

  6. apache 配置多个虚拟主机

    修改文件:httd.conf 文件地址:D:\wamp\bin\apache\Apache2.2.21\conf #配置虚拟主机<VirtualHost 127.0.0.3:80>Serv ...

  7. 错误 1 未知的服务器标记“asp:ScriptManager”。

    如题 ... 解决方案 :将 <%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=ne ...

  8. Spring常用的接口和类(二)

    七.BeanPostProcessor接口 当需要对受管bean进行预处理时,可以新建一个实现BeanPostProcessor接口的类,并将该类配置到Spring容器中. 实现BeanPostPro ...

  9. ruby代码重构第二课

    (文章都是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 在第一课里提取出了相通的代码,第二课里就把常量提取出来吧 一般把常量的定义写的对应的app/mo ...

  10. js检测是否安装了flash插件

    function flashChecker() { var hasFlash = 0; //是否安装了flash var flashVersion = 0; //flash版本 var isIE = ...