Material Design综合实例

背景知识

  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中加入

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

java代码

package com.zj.materialfood;import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.ImageView;
import android.widget.TextView;import com.github.florent37.viewanimator.AnimationListener;
import com.github.florent37.viewanimator.ViewAnimator;import java.util.Locale;/*** Created by jjx on 2016/4/9.*/
public class StartActivity extends AppCompatActivity{ImageView image;ImageView mountain;TextView text;TextView percent;android.os.Handler handler=new android.os.Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_start);image = (ImageView) findViewById(R.id.image1);mountain = (ImageView) findViewById(R.id.mountain);text = (TextView) findViewById(R.id.text1);percent = (TextView) findViewById(R.id.percent);animateParallel();/*handler.postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub//进入主页面Intent intent = new Intent(StartActivity.this, MainActivity.class);startActivity(intent);}}, 6000);*/}private void animateParallel() {ViewAnimator.animate(mountain, image).dp().translationY(-1000, 0).alpha(0, 1).andAnimate(percent).scale(0, 1).andAnimate(text).dp().translationY(1000, 0).textColor(Color.BLACK, Color.WHITE).backgroundColor(Color.WHITE, Color.BLACK).waitForHeight().interpolator(new AccelerateDecelerateInterpolator()).duration(1000).thenAnimate(percent).custom(new AnimationListener.Update<TextView>() {@Overridepublic void update(TextView view, float value) {value = value * 100;view.setText(String.format(Locale.US, "%.0f%%", value));}}, 0, 1).andAnimate(image).rotation(0, 360).onStop(new AnimationListener.Stop() {@Overridepublic void onStop() {Intent intent = new Intent(StartActivity.this, MainActivity.class);startActivity(intent);}}).duration(1000).start();}}

主界面效果实现

使用开源库

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

添加依赖

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

添加仓库

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

实现

package com.zj.materialfood;import android.content.Intent;
import android.os.Bundle;
import android.os.Message;
import android.support.design.widget.NavigationView;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;import java.util.List;import it.gmariotti.recyclerview.adapter.SlideInBottomAnimatorAdapter;
import it.gmariotti.recyclerview.adapter.SlideInRightAnimatorAdapter;public class MainActivity extends AppCompatActivity {RecyclerView recyclerView;private List<String> mDatas;private HomeAdapter mAdapter;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};Toolbar toolbar;SlideInBottomAnimatorAdapter slideInBottomAnimatorAdapter;SlideInRightAnimatorAdapter slideInRightAnimatorAdapter;DrawerLayout mDrawerLayout;ActionBarDrawerToggle mDrawerToggle;NavigationView mNavigationView;android.os.Handler handler=new android.os.Handler(){@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);toolbar= (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(toolbar);setTitle("天天美食");//设置DrawerLayoutmDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar,R.string.drawer_open, R.string.drawer_close){//关闭侧边栏时响应@Overridepublic void onDrawerClosed(View drawerView) {super.onDrawerClosed(drawerView);}//打开侧边栏时响应@Overridepublic void onDrawerOpened(View drawerView) {super.onDrawerOpened(drawerView);}};mDrawerToggle.syncState();mDrawerLayout.setDrawerListener(mDrawerToggle);//设置NavigationView点击事件mNavigationView = (NavigationView) findViewById(R.id.navigation_view);setupDrawerContent(mNavigationView);//设置NavigationView点击事件recyclerView= (RecyclerView) findViewById(R.id.id_recyclerview);recyclerView.setLayoutManager(new GridLayoutManager(this, 4));mAdapter=new HomeAdapter();slideInBottomAnimatorAdapter=new SlideInBottomAnimatorAdapter(mAdapter,recyclerView);//recyclerView.setAdapter(slideInRightAnimatorAdapter);handler.postDelayed(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stub//进入主页面recyclerView.setAdapter(slideInBottomAnimatorAdapter);}}, 1000);//recyclerView.setAdapter(mAdapter);}private void setupDrawerContent(NavigationView mNavigationView) {}class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>{@Overridepublic HomeAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {MyViewHolder holder=new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(R.layout.item_main,parent,false));return holder;}@Overridepublic void onBindViewHolder(HomeAdapter.MyViewHolder holder, int position) {holder.iv.setBackgroundResource(ids[position]);}@Overridepublic int getItemCount() {return 8;}class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ImageView iv;public MyViewHolder(View view){super(view);iv = (ImageView) view.findViewById(R.id.iv_food);view.setOnClickListener(this);}@Overridepublic void onClick(View view) {Intent intent=new Intent(MainActivity.this,FoodCardActivity.class);startActivity(intent);}}}
}

食物列表界面

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

老是报空指针异常,后来发现问题出在设置TextView时,setTextView时总是出错,搞了很久都不明白,后来才发现是在 public ViewHolder(View v) 方法中,绑定View与ViewHolder时,findViewById没有用 v.findViewById(R.id.iv_food_item),而是直接findViewById(R.id.iv_food_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/food_toolbar"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:title="天天美食"android:background="?attr/colorPrimary"></android.support.v7.widget.Toolbar><android.support.v7.widget.RecyclerView
            android:id="@+id/food_recyclerview"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@+id/food_toolbar"android:scrollbars="none" /></RelativeLayout>

recyView的item布局

<?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="wrap_content"android:layout_marginBottom="@dimen/card_margin"android:layout_marginLeft="@dimen/card_margin"android:layout_marginRight="@dimen/card_margin"android:clickable="true"app:cardCornerRadius="10dp"app:cardElevation="10dp"><LinearLayout
        style="@style/CardView.Content"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/iv_food_item"android:layout_width="109dp"android:layout_height="135dp"android:adjustViewBounds="true"android:background="@drawable/food6"android:gravity="center"android:layout_margin="4dp"/><LinearLayout
            android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:orientation="vertical"><TextView
                android:id="@+id/tvTitle"android:layout_width="match_parent"android:layout_height="wrap_content"android:textAppearance="@style/TextAppearance.AppCompat.Title"android:text="麻婆豆腐"android:textColor="@color/primary_text" /><TextView
                android:id="@+id/tvDesc"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:text="@string/book_description_1"android:textColor="@color/secondary_text" /></LinearLayout></LinearLayout>
</android.support.v7.widget.CardView>

java代码实现

package com.zj.materialfood;import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v4.app.NavUtils;
import android.support.v4.app.TaskStackBuilder;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;/*** Created by jjx on 2016/4/10.*/
public class FoodCardActivity extends AppCompatActivity{Toolbar toolbar;RecyclerView recyclerView;MyAdapter mAdapter;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};String titles[]=new String[]{"麻婆豆腐","灯影牛肉","夫妻肺片","蒜泥白肉","白油豆腐","鱼香肉丝","泉水豆花","宫保鸡丁 ","东坡墨鱼 ","麻辣香锅"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_foodcard);toolbar= (Toolbar) findViewById(R.id.food_toolbar);setSupportActionBar(toolbar);setTitle("美食菜单");ActionBar actionBar=getSupportActionBar();actionBar.setDisplayHomeAsUpEnabled(true);recyclerView= (RecyclerView) findViewById(R.id.food_recyclerview);recyclerView.setHasFixedSize(true);LinearLayoutManager linearLayoutManager=new LinearLayoutManager(FoodCardActivity.this);recyclerView.setLayoutManager(linearLayoutManager);recyclerView.setItemAnimator(new DefaultItemAnimator());mAdapter = new MyAdapter();recyclerView.setAdapter(mAdapter);}public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {private final TypedValue mTypedValue = new TypedValue();// Provide a reference to the views for each data item// Complex data items may need more than one view per item, and// you provide access to all the views for a data item in a view holderpublic class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {// each data item is just a string in this casepublic TextView mTextView;public ImageView iv_food;public TextView textDesc;public ViewHolder(View v) {super(v);mTextView = (TextView) v.findViewById(R.id.tvTitle);iv_food= (ImageView) v.findViewById(R.id.iv_food_item);textDesc= (TextView) v.findViewById(R.id.tvDesc);v.setOnClickListener(this);}@Overridepublic void onClick(View view) {String text = "I Love " + mTextView.getText() + ".";Snackbar.make(view, text, Snackbar.LENGTH_SHORT).show();}}// Provide a suitable constructor (depends on the kind of dataset)@Overridepublic MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {// create a new viewView v = LayoutInflater.from(parent.getContext()).inflate(R.layout.food_item, parent, false);// set the view's size, margins, paddings and layout parametersViewHolder vh = new ViewHolder(v);return vh;}// Replace the contents of a view (invoked by the layout manager)@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {// - get element from your dataset at this position// - replace the contents of the view with that element//holder.mTextView.setText(mDataset[position]);holder.mTextView.setText(titles[position]);holder.iv_food.setBackgroundResource(img_ids[position]);holder.textDesc.setText("很好吃的一道菜 \n东南第一佳味,天下之至美 \n地址:武珞路30号 \n234人吃过 \n价格: 88.00元");}// Return the size of your dataset (invoked by the layout manager)@Overridepublic int getItemCount() {return 10;}}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch(item.getItemId()){case android.R.id.home:Intent upIntent = NavUtils.getParentActivityIntent(this);if (NavUtils.shouldUpRecreateTask(this, upIntent)) {TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();} else {upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);NavUtils.navigateUpTo(this, upIntent);}return true;default:return super.onOptionsItemSelected(item);}}
}

完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DARPA将开发无需手术的神经技术,实现脑机接口

来源&#xff1a;IEEE电气电子工程师学会到目前为止&#xff0c;DARPA&#xff08;美国国防部高级研究计划局&#xff09;的神经科学项目部&#xff08;也称为国防部疯狂科学部门&#xff09;一直专注于可服务于那些因身体或大脑残疾回国的士兵的技术&#xff0c;例如&#xff…

2018年全球自动驾驶法律政策研究 | 附报告下载

来源&#xff1a;腾讯研究院摘要&#xff1a;2018年9月13日&#xff0c;在中国法学会研究部、腾讯研究院联合举办的“‘法律人的互联网思维’系列研修会第二期——自动驾驶汽车的技术、产业和法律维度”上&#xff0c;腾讯研究院发布《2018年全球自动驾驶法律政策研究报告》。0…

全球最具影响力AI机构TOP100排名:中国5所高校1所研究院入围

来源&#xff1a;学术头条&#xff08;SciTouTiao&#xff09;现在“人工智能”&#xff08;ArtificialIntelligence&#xff09;一词时常“做客”各大媒体平台&#xff0c;成为人们所关注的热点话题&#xff0c;而在学术圈&#xff0c;AI技术同样也是最具活力与吸引力的研究课…

安卓开源库之动画篇

本文主要介绍收集了笔者所用过的开源动画库&#xff0c;达到一些比较好看的效果。 一个富有动感的 Sheet 链接&#xff1a; zzz40500/AndroidSweetSheet: 一个富有动感的Sheet(选择器) 效果如下 示例代码 package com.zj.testsheet;import android.os.Bundle; import andr…

《Python 黑科技》代理ip奇技淫巧

点赞 ➕ 评论 ➕ 收藏 三连再看你最帅 目录 &#x1f41b; 1、什么是住宅动态ip&#xff1f; &#x1f98b; 1.1 动态ip优点是什么&#xff1f; &#x1f40c; 1.2 环境准备 &#x1f41e; 1.3 获取代理ip &#x1f41c; 2、使用代理IP &#x1f424; 2.1 浏览器使用代理…

MIT发布2018年全球10大突破性技术!

来源&#xff1a; 数字化企业作为全球最为著名的技术榜单之一&#xff0c;《麻省理工科技评论》全球十大突破性技术具备极大的全球影响力和权威性&#xff0c;至今已经举办了18年。每年上榜的技术突破&#xff0c;有的已经在现实中得以应用&#xff0c;有的还尚需时日&#xff…

Android实现监测网络状态

本文主要用到了安卓监测网络状态变化功能&#xff0c;实现了WIFI,3G,无网络状态切换时发出通知的功能。 主要知识点 servicebroadcast接口回调实现 service的基本知识 service可分为 按运行地点分类 本地服务 远程服务 按按运行类型分类&#xff1a; 前台服务后台服务按…

jni 步骤

这是我转的文章&#xff0c;是篇外文翻译&#xff0c;将介绍如何学习安装 Android NDK 并开始使用它。在这一教程结束后&#xff0c;将创建你自己的项目&#xff0c;从 Java 代码简单地调用原生C 语言代码。教程细节技术&#xff1a;Android SDK、NDK、C 语言难度&#xff1a;进…

德勤:2025年汽车行业价值链的四个合理情境

来源&#xff1a;亿欧摘要&#xff1a;近日&#xff0c;德勤发布《未来汽车行业价值链&#xff1a;2025年以后》&#xff0c;假设在大部分整车企业都有变革意愿的情境下&#xff0c;识别出四个2025年整车企业价值链可能具有的合理设定。随着自动驾驶、共享经济等新技术以及新商…

盘点英特尔、苹果、高通、AMD 处理器重大 Bug,硬件的坑软件能填?

来源&#xff1a;21ic电子网英特尔的CPU存在两大漏洞 ——Meltdown 和 Spectre&#xff0c;波及自 1995 年以来所有使用英特尔芯片的硬件设备。不止 Linux、Android、Windows、苹果 OS X 等操作系统&#xff0c;AWS、Azure、谷歌云等云计算提供商均受到影响&#xff0c;其威胁范…

java读写html文件时出现中文乱码问题的解决方法

最近在做HTML静态生成&#xff0c;需要从硬盘上把模版文件的内容读出来。然后&#xff0c;替换相关标签写到指定的文件中。无论是读写&#xff0c;都遇到了中文乱码问题。试过多种方法&#xff0c;发现下面一种可以避免中文乱码。&#xff08;无论读取还是写入一定要进行编码转…

Android实现网络音乐播放器

本文是一个简单的音乐播放器 布局代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layo…

【干货51页PPT】深度学习理论理解探索

来源&#xff1a;专知普林斯顿大学计算机科学系教授Sanjeev Arora做了深度学习理论理解探索的报告&#xff0c;包括三个部分&#xff1a;Why overparametrization and or overprovisioning?Optimization in deep learningTheory for Generative Models and Generative Adversa…

新星计划·第三季【博文流量密码公开课】

一、优质的内容 刚开始写博客的小伙伴&#xff0c;其不可漫无目的的写&#xff0c;到头来对自己的技术沉淀毫无帮助&#xff0c;升职加薪跳槽也不加分&#xff0c;更无法通过付费专栏等方式进行变现&#xff0c;到头来一无所获&#xff01; 强烈建议大家提前规划写什么方向的…

百度地图开发之定位

本文主要讲述利用百度地图API实现定位功能 第一步:下载SDK与申请KEY 参考链接&#xff1a;Android 百度地图 SDK v3.0.0 &#xff08;一&#xff09; - Hongyang - 博客频道 - CSDN.NET 注意 百度地图SDK与百度定位SDK已经分开了&#xff0c;如果在工程中同时导入这两个包…

Java与Http协议

Java与Http协议 引言 http&#xff08;超文本传输协议&#xff09;是一个基于请求与响应模式的、无状态的、应用层的协议&#xff0c;常基于TCP的连接方式。HTTP协议的主要特点是&#xff1a; 1.支持客户/服务器模式。 2.简…

《Python 黑科技》一键分析评论关键词,制作精美词云

本文重点&#xff1a; 学会抓取文章评论 学会文本分词、制作词云 目录 &#x1f351; 一、抓取全部评论 &#x1f35e; 1、找到评论接口 &#x1f34f; 2、Python 获取评论 &#x1f3c8; 二、文本分词、词云制作 &#x1f34b; 1、文本分析 &#x1f350; 2、生成词云…

PANS最新脑神经科学研究:激活一种新语言并不费力气

来源&#xff1a;中国生物技术网美国纽约大学的一项新研究发现&#xff0c;我们在不同语言之间切换时的大脑工作模式&#xff0c;这使我们对双语现象有了新的理解。纽约大学博士生Esti Blanco-Elorrieta是这项研究的第一作者&#xff0c;他解释说&#xff1a;“多语言能力者的一…

百度地图之添加覆盖物

本文主要讲解如何实现在百度地图上添加覆盖物 1.承载数据的实体 我们从服务器返回的数据部分&#xff0c;最终可能是个Json数组&#xff0c;我们需要转换为实体集合&#xff0c;即下面的Info.java 我直接在实体类中声明了一个静态列表集合&#xff0c;模拟从服务器返回的数据…

能力认证计划 -- 名企内推保 offer 直通车

CSDN 能力认证的目的&#xff1a;清晰定义工程师能力模型&#xff0c;面向开发者、技术爱好者、在校大学生等群体&#xff0c;通过机试&#xff08;真人露脸、全程录屏、限时提交&#xff09;测出应试者的真能力&#xff0c;筛选合格软件人才&#xff0c;建立应聘者与企业之间的…