本文主要包括以下内容

  1. 侧滑菜单DrawerLayout实现
  2. CardView实现

DrawerLayout介绍

drawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说drawerLayout是因为第三方控件如MenuDrawer等的出现之后,google借鉴而出现的产物。drawerLayout分为侧边菜单和主内容区两部分,侧边菜单可以根据手势展开与隐藏(drawerLayout自身特性),主内容区的内容可以随着菜单的点击而变化(这需要使用者自己实现)

drawlayout实现

main布局文件

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:id="@+id/drawer_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="?attr/colorPrimary"app:layout_collapseMode="pin"app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /></LinearLayout><android.support.design.widget.NavigationViewandroid:id="@+id/navigation_view"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="start"app:headerLayout="@layout/navigation_header"app:menu="@menu/drawer" /></android.support.v4.widget.DrawerLayout>

其中侧滑菜单位置是start,并且包括了headerLayout与menu

headerLayout实现

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/lib/com.zj.material3navigation"android:layout_width="match_parent"android:layout_height="192dp"android:background="?attr/colorPrimaryDark"android:gravity="center"android:orientation="vertical"android:padding="16dp"android:theme="@style/ThemeOverlay.AppCompat.Dark"><de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/profile_image"android:layout_width="72dp"android:layout_height="72dp"android:layout_marginTop="20dp"android:src="@mipmap/profile"app:border_color="@color/primary_light"app:border_width="2dp" /><TextView
        android:layout_marginTop="10dp"android:textSize="18sp"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="APP开发者"android:gravity="center"android:textAppearance="@style/TextAppearance.AppCompat.Body1"/></LinearLayout>

注意,由于使用了CircleImageView,要在depencyies中加入

compile 'de.hdodenhof:circleimageview:1.3.0'

并且由于jcenter中库有限,可能还要加入


allprojects {repositories {jcenter()maven { url "https://jitpack.io" }}
}

menu菜单实现

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><group android:checkableBehavior="single"><item
            android:id="@+id/navigation_item_example"android:icon="@drawable/ic_favorite"android:title="@string/navigation_example" /><item
            android:id="@+id/navigation_item_blog"android:icon="@drawable/ic_favorite"android:title="@string/navigation_my_blog" /><item
            android:id="@+id/navigation_item_about"android:icon="@drawable/ic_favorite"android:title="@string/navigation_about" /></group></menu>

menu也可以设置子menu,下面是一个例子

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"><group
        android:checkableBehavior="single"><item
            android:id="@+id/drawer_home"android:checked="true"android:icon="@drawable/ic_home_black_24dp"android:title="@string/home"/><item
            android:id="@+id/section"android:icon="@drawable/ic_more_horiz_black_24dp"android:title="分组1"><menu><item
                    android:id="@+id/drawer_favourite"android:icon="@drawable/ic_favorite_black_24dp"android:title="@string/favourite"/><item
                    android:id="@+id/drawer_downloaded"android:icon="@drawable/ic_file_download_black_24dp"android:title="@string/downloaded"/></menu></item><item
            android:id="@+id/section2"android:title="分组2"><menu><item
                    android:id="@+id/drawer_more"android:icon="@drawable/ic_more_horiz_black_24dp"android:title="@string/more"/><item
                    android:id="@+id/drawer_settings"android:icon="@drawable/ic_settings_black_24dp"android:title="@string/settings"/></menu></item></group>
</menu>

效果如下

java代码的实现

package com.zj.material3navigation;import android.os.Bundle;
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.Toolbar;
import android.view.MenuItem;
import android.view.View;public class MainActivity extends AppCompatActivity {Toolbar mToolbar;DrawerLayout mDrawerLayout;ActionBarDrawerToggle mDrawerToggle;NavigationView mNavigationView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//设置ToolbarmToolbar = (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(mToolbar);setTitle("startNow");//设置DrawerLayoutmDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar,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点击事件}//点击侧边栏菜单的响应事件private void setupDrawerContent(NavigationView navigationView) {navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {@Overridepublic boolean onNavigationItemSelected(MenuItem menuItem) {switch (menuItem.getItemId()) {case R.id.navigation_item_example://switchToExample();break;case R.id.navigation_item_blog://switchToBlog();break;case R.id.navigation_item_about://switchToAbout();break;}menuItem.setChecked(true);mDrawerLayout.closeDrawers();return true;}});}}

实现了打开与关闭侧边栏的响应事件,点击侧边栏按钮的响应事件等

参考链接:

Design Support Library (I): Navigation View的使用 - 泡在网上的日子

android官方侧滑菜单DrawerLayout详解 - 泡在网上的日子

效果如下:

CardView实现

首先加入依赖库

dependencies {....compile 'com.android.support:cardview-v7:22.2.0'
}

layout布局

<LinearLayout 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:orientation="vertical"><android.support.v7.widget.Toolbarandroid: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><android.support.v4.widget.NestedScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:scrollbars="none"xmlns:android="http://schemas.android.com/apk/res/android">
<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:paddingTop="5dp"xmlns:android="http://schemas.android.com/apk/res/android">
<android.support.v7.widget.CardViewandroid:layout_width="match_parent"android:layout_height="wrap_content"app:cardCornerRadius="10dp"app:cardElevation="10dp"android:layout_marginBottom="@dimen/card_margin"android:layout_marginLeft="@dimen/card_margin"android:layout_marginRight="@dimen/card_margin"xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:clickable="true"android:foreground="?android:attr/selectableItemBackground"><LinearLayoutstyle="@style/CardView.Content"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/book1" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/book_title_1"android:textAppearance="@style/TextAppearance.AppCompat.Title"android:textColor="@color/primary_text" /><TextViewandroid: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><android.support.v7.widget.CardViewxmlns: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:layout_marginTop="@dimen/card_margin"android:onClick="goDetail"app:cardCornerRadius="10dp"app:cardElevation="10dp"><LinearLayoutstyle="@style/CardView.Content"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/book2" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/book_title_2"android:textAppearance="@style/TextAppearance.AppCompat.Title"android:textColor="@color/primary_text" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:text="@string/book_description_2"android:textColor="@color/secondary_text" /></LinearLayout></LinearLayout></android.support.v7.widget.CardView><android.support.v7.widget.CardViewxmlns: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:layout_marginTop="@dimen/card_margin"android:onClick="goDetail"app:cardCornerRadius="10dp"app:cardElevation="10dp"><LinearLayoutstyle="@style/CardView.Content"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@drawable/book3" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/book_title_3"android:textAppearance="@style/TextAppearance.AppCompat.Title"android:textColor="@color/primary_text" /><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:text="@string/book_description_3"android:textColor="@color/secondary_text" /></LinearLayout></LinearLayout></android.support.v7.widget.CardView>
</LinearLayout></android.support.v4.widget.NestedScrollView></LinearLayout>
  • app:cardBackgroundColor 设置CardView背景颜色
  • app:cardCornerRadius 设置CardView圆角大小
  • app:cardElevation 设置CardView阴影高度

添加波纹点击效果

默认情况,CardView是不可点击的,并且没有任何的触摸反馈效果。触摸反馈动画在用户点击CardView时可以给用户以视觉上的反馈。为了实现这种行为,你必须提供一下属性:

<android.support.v7.widget.CardView...android:clickable="true"android:foreground="?android:attr/selectableItemBackground">...
</android.support.v7.widget.CardView>

在加载图片时可能会遇到图上尺寸的问题

(1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)

(2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)

(3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

ldpi:240x320

mdpi:320x480

hdpi:480x800、480x854

xhdpi:至少960*720

xxhdpi:1280×720

从上表可以得出如下结论

  1. 图片放在drawable中,等同于放在drawable-mdpi中,原因为:drawable目录不具有屏幕密度特性,所以采用基准值,即mdpi

  2. 图片放在某个特定drawable中,比如drawable-hdpi,如果设备的屏幕密度高于当前drawable目录所代表的密度,则图片会被放大,否则会被缩小

      放大或缩小比例 = 设备屏幕密度 / drawable目录所代表的屏幕密度

  3. 为了更全面的适配所有设备,我们应该提供一套针对主流屏幕密度的图片(目前为hdpi或xhdpi),其他密度通过系统自动缩放得到图片

参考链接:

Android开发–CardView使用-爱编程
Android中屏幕密度和图片大小的关系分析 - Android移动开发技术文章_手机开发 - 红黑联盟
res里面的drawable(ldpi、mdpi、hdpi、xhdpi、xxhdpi) - xfyn - 博客园

效果如下

Material Design入门(二)相关推荐

  1. 『Material Design 入门学习笔记』前言

    写在最前面的话 最开始我在毕业的时候做Android,当时还没到Android5.0,没有Material Design,当时的设计都是以立体仿3d效果为主.后来有了扁平化设计,我却开始了SDK各种功 ...

  2. Material Design入门

    本文主要包括以下内容 ToolBar的使用 RecyclerView的定义与使用 ToolBar 风格 (style) 界面 (layout) 程序 (java) 首先自定义一个theme,并将App ...

  3. Material Design入门(三)

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

  4. flutter学习之二Material Design设计规范

    前言: 最近在自学flutter跨平台开发,从学习的过程来看真心感觉不是那么一件特别容易的事.不但要了解语法规则, 还要知晓常用控件,和一些扩展性的外延知识,所以套一句古人的话"路漫漫其修远 ...

  5. Material Design控件使用(二)

    本篇接着之前的Material Design控件总结(一)往下学习support design包下其余控件,如果对Material Design不太熟悉的同学最好把第一篇看完再来看第二篇效果更好 本篇 ...

  6. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  7. Android 学习之《第一行代码》第二版 笔记(二十三)Material Design 实战 —— 卡片式布局

    实现基础: Android 学习之<第一行代码>第二版 笔记(二十二)Material Design 实战 -- 悬浮按钮和可交互提示 卡片式布局 卡片式布局是 Materials Des ...

  8. 开启Fluter基础之旅二-------Future再论、常用组件、Material Design风格组件学习

    Future再论: 这里在继续往下学习之前,先来看一下Dart语言关于Event-Queue和Microtask Queue需要注意的一个小点,这个在之前https://www.cnblogs.com ...

  9. Flutter 入门学习(五)— Material Design风格组件

    文章目录 1. 概述 2. App结构和导航组件 2.1 MaterialApp(应用组件) 2.1.1 设置主页 2.1.2 路由处理 2.1.3 自定义主题 2.2 Scaffold(脚手架组件) ...

最新文章

  1. Android自定义组件之简单组合
  2. 为什么用Object.prototype.toString.call(obj)检测对象类型?
  3. Java structured lock vs unstructured lock
  4. 强化学习 求解迷宫问题_使用天真强化学习的迷宫求解器
  5. springboot 参数校验详解
  6. jdk11 后用的指定编码格式,读取文件
  7. 【LeetCode笔记】207. 课程表(Java、图、BFS、队列)
  8. 页面显示其他php,php – 分页在所有其他页面上显示来自第1页的相同帖子
  9. mysql5.0 mac_Mac OS X下MySQL 5.0的默认连接数
  10. 正在考虑微服务架构的松耦合?小心这些陷阱
  11. php和composer关系_使用Composer管理PHP依赖关系
  12. 控制教程 —— 介绍篇:6.状态空间控制器设计
  13. c++避坑指南-除数为0
  14. Split过程源码分析
  15. 苹果手机上网很慢_手机的信号满格,为什么上网速度却很慢?一招教你解除限制...
  16. 老板说“把系统升级到https”,我用一个脚本实现了,而且永久免费!​
  17. CCF CSP 201809-1 卖菜 题解
  18. 断链在平曲线计算中的处理——短链篇
  19. 聚类分析(K-means、系统聚类和二阶聚类)的原理、实例及在SPSS中的实现(一)
  20. mp4视频分片生成m3u8流文件并加密

热门文章

  1. Facebook提出生成式实体链接、文档检索,大幅刷新SOTA!
  2. Shield——开源的移动端页面模块化开发框架
  3. BAT Java面试笔试33题:JavaList、Java Map等经典面试题!答案汇总!
  4. 论文浅尝 - IJCAI2020 | KGNN:基于知识图谱的图神经网络预测药物与药物相互作用...
  5. Python的多行输入与多行输出
  6. BIO,NIO,AIO
  7. 工业大数据全景解读和应用案例
  8. 国科大高级人工智能9-模糊数学和遗传算法
  9. 基于改进YOLO v3网络的夜间环境柑橘识别方法
  10. 第二阶段团队冲刺(十)