Material Design 概述# 这是标题

一、关于Material Desingn

从Android5.0开始引入的,是一种全新的设计语言(翻译为“原材料设计”),其实谷歌提倡的是一种设计风格。
层次感:View(Z)轴

详细可以参考:Material Design中文版

1、对于美工:遵循MD的界面设计、图标合集
2、对于产品经理:遵循MD界面设计、页面的跳转、动画效果、交互设计
3、对于开发人员:参与原型设计、知道美工原型设计的素材准备
开发实现MD的设计——-界面、动画、转场动画等等

二、MD的使用和开发

1、利用Material Design的API来实现
2、利用自定义控件来实现
3、SDK里面的一些包的情况

D:\compress\AndroidStudio\sdk\extras\android\m2repository\com\android

Preference : 设置页面,通过配置文件达到界面设计的效果。
precent:界面的百分比
design :material design 需要的依赖

1、谷歌开放以及收了一些最新的开源项目(很多事自己开发的),汇集到最新的support支持包以及最新的5.X API里面去
2、android-support-v4:兼容包 最低兼容到Android1.6系统,里面有类似ViewPager等控件
3、android-support-v7:

appcompat、cardview、gridlayout、mediarouter、palette、preference、recycleView(最低兼容到3.0)

最低兼容到2.1的系统,但是其他的有些控件兼容到3.0,这个工程可以让开发人员统一开发标准,在任何的系统版本下保证兼容性。
比如:Theme主题、value、布局、新的控件、新的动画特效实现。

所以现在ADT、AndroidStudio一般都会创建项目的时候就直接帮你新建或者引入了appcompat的项目(这里可能会碰到很多问题,

1、appcompat-v7项目本身就存在问题,什么原因?

build的版本太低了,要么是SDK太久了,要么SDK很新,但是兼容包没有更新。)

2、appcompat-v7好不容易没报错,但是项目报错,一看控制台,报appcompat里面的某个res/values/theme/xxx属性不存在等等

因为你引入的是appcompat-v7很新,但是要求很高的版本编译。但是Eclipse在引入该项目的主项目编译的时候也必须要得到这个很高的版本。–直接使用最高版本编译

4、SDK升级:API升级、兼容包的升级、工具的升级。

————————————1、Material Design控制项目全局样式———————–
1、为什么要用appcompat项目,因为里面是谷歌精心准备的—解决android碎片化开发蛋疼的问题,让我们的app编译出来在各种高低版本之间、不同的厂商生产的ROM之间显示出来的效果UI控件等有较一致的体验

2、SDK在更新的版本上,几个重要的版本是14(4.0),19(4.4),21(5.0)

————————————2、Material Design兼容性控件的使用———————–
尤其是在appcompat-v7里面有很多为兼容而生的控件
这样就可以做到高低版本和不同的ROM之间体验一致,还可以配合appcompat的主题使用达到一致性
1、android.support.v7.app.AlertDialog
2、进度条样式的设置

1
style="@style/Widget.AppCompat.ProgressBar.Horizontal"

3、SwipeRefreshLayout 下拉刷新

4、PopupWinow
ListPopupWindow
PopupMenu
LinearLayoutCompat–给包裹在里面的所以子控件添加间隔线

————————————V7 RecycleView———————–
特点:谷歌在高级版本提出一个新的替代ListView,GradView的控件。
高度解耦 是通过LayoutManager来解耦
软件:低耦合,高内聚(但是比listView更加复杂一些,而且没有条目点击事件)

Adapter里面种的泛型RecyclerView.ViewHolder 自带性能优化

报错:NollPointException
分析源码
MyViewHolder myViewHolder=new MyViewHolder(View.inflate(parent.getContext(),android.R.layout.simple_list_item_1,null));
最终会调用
inflate(resource,root,root!=null)
–> inflate(resource,null,false);

经过修改,还是报错
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child’s parent first.

分析LinerLayoutCompat源码,分析实现的原理,是如何做到给里面的child之间添加间隔线的

先看了构造函数

View的绘制会经过三个方法onMeasure(测量自身和里面的所有的子控件) onLayout(摆放里面的所有子控件),onDraw(进行绘制)
猜想:1)measureWidth和measureHeight会变大(加上间隔线)。2)摆放子控件的位置会有一定的体现(childView中的:top/left/right/bottom)
3)绘制的时候也会有体现(childView中的:top/left/right/bottom)

RecycleView天生没有自己的点击事件

————————————RecycleView设置分割线———————–
1、RecycleView没有默认的分割线,需要自己绘制
RecyclieView.ItemDecoration
1)线型的分割线
2)网格的分割线

绘制分发
绘制RecycleView的时候回分发Canvas到ItemDecoration里面

listview.addView()
listview.addfooter();
RecycleView没有这样的方法,所以我们通过看ListView的源码,如何解决这个问题
ListView.addHeaderView();

1
2
3
if (!(mAdapter instanceof HeaderViewListAdapter)) {
wrapHeaderListAdapterInternal();
}

ListView.setAdapter()

1
2
3
4
5
if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {
mAdapter = wrapHeaderListAdapterInternal(mHeaderViewInfos, mFooterViewInfos, adapter);
} else {
mAdapter = adapter;
}

通过上面的代码,可以看到实际上就是包裹了一层

ListView.setAdapter(new SimpleAdapter(xxx))

坚持原创技术分享,您的支持将鼓励我继续创作!