Android应用的Material设计的布局兼容性的一些要点总结

Define Alternative Styles  定义替代样式
让你的app,使用Material Design的主题运行在支持它的设备上,并在早期版本的设备上可以运行较早的主题:
1. 在res/values/styles.xml 定义一个主题继承较早的主题
2. 在res/values-v21/styles.xml 定义一个相同名字的继承自Material主题 的主题
3. 在manifest中应用定义的主题
注:如果你的app使用了Material 主题,而不提供较早的主题,那么将不能运行在早期版本的设备上

Provide Alternative Layouts  提供替代布局
如果你设计的layout不引用任何的5.0中的xml属性,那么可以运行在早期版本的Android设备上。否则,你可提供一个替代布局。
替代布局建立在res/layout-v21/
为了避免重复代码,可以在res/values/  定义你的styles,新风格的在res/values-21/ 中定义,并使用style的继承,在res/values中定义一个baseStyle,在res/values-21中继承它。

Use the Support Library  使用支持库
v7 support library 包括以下的一些特性:

  • 在应用了一个Theme.AppCompat 主题后,系统的一些组件就有了Material Design 的风格
  • 在Theme.AppCompat 主题中,有调色主题
  • RecyclerView 组件显示数据集
  • CardView 组件创建卡片
  • 从图像中取色

System widgets  系统组件

Theme.AppCompat 主题提供的Material Design 风格的组件有:

  • EditText
  • Spinner
  • CheckBox
  • Radiobutton
  • SwitchCompat
  • CheckedTextView

Color Palette

使用v7支持库,获得Material Design 风格定义颜色板,应用一个Theme.AppCompat 主题:

<!-- extend one of the Theme.AppCompat themes -->
<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">
  <!-- customize the color palette -->
  <item name="colorPrimary">@color/material_blue_500</item>
  <item name="colorPrimaryDark">@color/material_blue_700</item>
  <item name="colorAccent">@color/material_green_A200</item>
</style>

Lists and Cards

使用v7支持库后,在早期的Android版本上也可运行。

Dependencies

gradle 依赖:

dependencies {
  compile 'com.android.support:appcompat-v7:21.0.+'
  compile 'com.android.support:cardview-v7:21.0.+'
  compile 'com.android.support:recyclerview-v7:21.0.+'
}

Check the System Version  检查系统版本

以下特性只能在Android 5.0(API级别21)及以上:

  • Activity transitions  活动转换
  • Touch feedback    触觉反馈
  • Reveal animations  显示动画
  • Path-based animations  基于路径动画
  • Vector drawables  矢量图片
  • Drawable tinting  图片染色

检查代码:

// Check if we're running on Android 5.0 or higher
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  // Call some material design APIs here
} else {
  // Implement this feature without material design
}

注:要让app支持5.0,需要在manifest中Android:targetSdkVersion=21。

PS:RecyclerView
附RecyclerView的例子:

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.LayoutParams;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.TextView; 

public class RecyclerViewActivity extends Activity {
  /*
   * recyclerview提供这些内置的布局管理器:
   * linearlayoutmanager       显示垂直滚动列表或水平的项目。
   * gridlayoutmanager        显示在一个网格项目。
   * staggeredgridlayoutmanager    显示在交错网格项目。
   * 自定义的布局管理器,需要继承recyclerview.layoutmanager类。
   *
   * add/remove items时的动画是默认启用的。
   * 自定义这些动画需要继承RecyclerView.ItemAnimator,并实现RecyclerView.setItemAnimator()
   */
   private RecyclerView mRecyclerView;
   private RecyclerView.Adapter mAdapter;
   private RecyclerView.LayoutManager mLayoutManager;
   private String[] myDataset; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.recycler_view);
    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 

    // use this setting to improve performance if you know that changes
    // in content do not change the layout size of the RecyclerView
    mRecyclerView.setHasFixedSize(true); 

    // use a linear layout manager
//    mLayoutManager = new LinearLayoutManager(this); 

//    mLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, true);
    //true 表示,将layout内容反转
    mLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.VERTICAL, false);
    //HORIZONTAL 横向滚动显示内容  VERTICAL纵向
//    mLayoutManager = new GridLayoutManager(this, 3, GridLayoutManager.HORIZONTAL, false); 

    //方向也是指示滚动方向,例子中横向开头的数据交错了一点, 纵向的无交错
//    mLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL);
//    mLayoutManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL); 

    mRecyclerView.setLayoutManager(mLayoutManager);
//    mRecyclerView.setLayoutManager(new MyLayoutMnager()); //数据不显示,可能还需要重写什么东西。。 

    // specify an adapter (see also next example) 

    setDatas();
    mAdapter = new MyAdapter(myDataset);
    mRecyclerView.setAdapter(mAdapter);
  } 

  private void setDatas() {
    int len = 200;
    myDataset = new String[len];
    for (int i = 0; i < len; i++) {
      switch (i%3) {
      case 0:
        myDataset[i] = "中国" + i;
        break;
      case 1:
        myDataset[i] = "美国" + i;
        break;
      case 2:
        myDataset[i] = "澳大利亚" + i;
        break;
      }
    }
  } 

  class MyLayoutMnager extends RecyclerView.LayoutManager { 

    @Override
    public LayoutParams generateDefaultLayoutParams() {
      LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
      params.topMargin = 5;
      return params;
    }
  } 

  class MyAdapter extends RecyclerView.Adapter<ViewHolder> {
    private String[] mDataset; 

    // 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 holder 

    // Provide a suitable constructor (depends on the kind of dataset)
    public MyAdapter(String[] myDataset) {
      mDataset = myDataset;
    } 

    // Create new views (invoked by the layout manager)
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      // create a new view
      TextView tv = (TextView) LayoutInflater.from(parent.getContext())
          .inflate(R.layout.my_text_view, parent, false);
      // set the view's size, margins, paddings and layout parameters
      //...
      ViewHolder vh = new ViewHolder(tv); //构建一个ViewHolder
      return vh;
    } 

    // Replace the contents of a view (invoked by the layout manager)
    @Override
    public 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]); 

    } 

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
      return mDataset.length;
    }
  } 

  static class ViewHolder extends RecyclerView.ViewHolder {
    // each data item is just a string in this case
    public TextView mTextView;
    public ViewHolder(TextView v) {
      super(v);
      mTextView = v;
    }
  }
}
(0)

相关推荐

  • Android SDK中的Support兼容包详解

    背景 来自于知乎上邀请回答的一个问题Android中AppCompat和Holo的一个问题?, 看来很多人还是对这些兼容包搞不清楚,那么干脆写篇博客吧. Support Library 我们都知道Android一些SDK比较分裂,为此google官方提供了Android Support Library package 系列的包来保证高版本sdk开发的向下兼容性, 所以你可能经常看到v4,v7,v13这些数字,首先我们就来理清楚这些数字的含义,以及它们之间的区别. support-v4 用在API

  • Android实现兼容的水波纹效果

    先看看效果图 其实,要实现这一效果很简单,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的selector: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@c

  • Android仿水波纹流量球进度条控制器

    仿水波纹流球进度条控制器,Android实现高端大气的主流特效,供大家参考,具体内容如下 效果图: CircleView 这里主要是实现中心圆以及水波特效 package com.lgl.circleview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.gra

  • Android程序退出完美解决方案兼容所有SDK

    上网学了好多方法,关于Android的Activity如何退出.好多方法都不行啦,试了各种方法,下面这种方法就是我最喜欢的,简单又容易懂. 使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,并且容易理解.易于操作,非常不错! MyApplication类(储存每一个Activity,并实现关闭所有Activity的操作 复制代码 代码如下: public class MyAp

  • Android实现点击Button产生水波纹效果

    先上图,看看接下来我要向大家介绍的是个什么东西,如下图: 接下来要介绍的就是如何实现上述图中的波纹效果,这种效果如果大家没有体验过的话,可以看看百度手机卫士或者360手机卫士,里面的按钮点击效果都是这样的,另外Android 5.0以上的版本也出现了这种效果.不多说,下面聊聊具体的怎么实现. 首先大家看到的是三个button,水波纹的出现给我们的错觉是直接将波纹绘制在button上面的,但是这样能做到吗?首先button自己有background和src,如果把半透明的水波纹当作backgrou

  • js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS

    绝对值得看的来篇,哈哈.本人亲自完成,有错误请大家指出: 现在的手机完美支持html5,所以如果手机端想要做个抽奖模块的话,用刮刮卡抽奖效果,相信这个互动体验是非常棒的 ​ps:由于本人没有wp8系统的手机,所以没法兼容wp8系统的,目前完美兼容android,IOS 如果要在pc浏览的话,得改下js,目前支持谷歌,火狐,ie>=10,如果网友想要的话我就去写个 代码如下: 复制代码 代码如下: <!DOCTYPE html> <html lang="en"&g

  • Android项目实战手把手教你画圆形水波纹loadingview

    本文实例讲解的是如何画一个满满圆形水波纹loadingview,这类效果应用场景很多,比如内存占用百分比之类的,分享给大家供大家参考,具体内容如下 效果图如下: 预备的知识: 1.贝塞尔曲线    如果你不了解,可以来这里进行基础知识储备:神奇的贝塞尔曲线 2.Paint.setXfermode()  以及PorterDuffXfermode 千万不要被这个b的名字吓到,不熟悉看到可能会认为很难记,其实 只要站在巨人的丁丁上 还是很简单的. 好了 废话不多说 ,跟我一步步来做一个炫酷的view吧

  • Android特效之水波纹的实现

    前言 水波纹特效,想必大家或多或少见过,在我的印象中,大致有如下几种: 支付宝 "咻咻咻" 式 流量球 "荡漾" 式 真实的水波纹效果,基于Bitmap处理式 话不多说,先来看看效果: 填充式水波纹,间距相等 非填充式水波纹,间距相等 非填充式水波纹,间距不断变大 填充式水波纹,间距不断变小 想必大家已经知道基本的原理了,就是用Canvas来画嘛,但可不是简单的画哦,请往下看. 分析 这种类型的水波纹,其实无非就是画圆而已,在给定的矩形中,一个个圆由最小半径扩大到最

  • Android应用的Material设计的布局兼容性的一些要点总结

    Define Alternative Styles  定义替代样式 让你的app,使用Material Design的主题运行在支持它的设备上,并在早期版本的设备上可以运行较早的主题: 1. 在res/values/styles.xml 定义一个主题继承较早的主题 2. 在res/values-v21/styles.xml 定义一个相同名字的继承自Material主题 的主题 3. 在manifest中应用定义的主题 注:如果你的app使用了Material 主题,而不提供较早的主题,那么将不能

  • Android应用的Material设计中图片的相关处理指南

    可伸缩的矢量图片不会丢失清晰度,并且单一颜色的app-icon是完美的 可定义一个bitmap作为透明度(alpha)和运行时的颜色 可对一个bitmap image取色,会取出它比较显眼的颜色 官网地址:https://developer.android.com/training/material/drawables.html 以下图片的功能能帮助你在app中实现Material设计: 图片着色 颜色提取 矢量图片 Tint Drawable Resources  为图片资源染色 在Andro

  • Android用户注册界面简单设计

    本文实例为大家分享了Android用户注册界面的设计,供大家参考,具体内容如下 I. 实例目标 设计一个用户注册界面,在其中要使用到一些基础控件,如 文本框.编辑框.按钮.复选框等控件 II. 技术分析 首先在布局文件中使用控件的标记来配置所需要的各个控件,然后在 主Activity中获取到该控件,给其添加监听器来监听其操作,最后在控制台输出所操作的内容. III. 实现步骤 在Eclipse中创建 Android项目,名称为 TestUserRegister .设计一个用户注册界面,在其中要使

  • Android控件CardView实现卡片布局

    CardView介绍 CardView是Android 5.0系统引入的控件,相当于FragmentLayout布局控件然后添加圆角及阴影的效果:CardView被包装为一种布局,并且经常在ListView和RecyclerView的Item布局中,作为一种容器使用.CardView应该被使用在显示层次性的内容时:在显示列表或网格时更应该被选择,因为这些边缘可以使得用户更容易去区分这些内容. 使用 先看效果 首先在build.gradle文件添加依赖库 dependencies { compil

  • Android编程重写ViewGroup实现卡片布局的方法

    本文实例讲述了Android编程重写ViewGroup实现卡片布局的方法.分享给大家供大家参考,具体如下: 实现效果如图: 实现思路 1. 重写onMeasure(int widthMeasureSpec, int heightMeasureSpec)设置每个子View的大小 2. 重写onLayout(boolean changed, int l, int t, int r, int b) 设置每个子View的位置 第一步:新建FlowLayout继承ViewGroup package com

  • Android App中的GridView网格布局使用指南

    零.常用属性 首先我们来看看GridView的一些常用的属性吧 1.android:numColumns="auto_fit" //GridView的列数设置为自动 2.android:columnWidth="90dp " //每列的宽度,也就是Item的宽度 3.android:stretchMode="columnWidth"//缩放与列宽大小同步 4.android:verticalSpacing="10dp" //两

  • Android简单实现自定义流式布局的方法

    本文实例讲述了Android简单实现自定义流式布局的方法.分享给大家供大家参考,具体如下: 首先来看一下 手淘HD - 商品详情 - 选择商品属性 页面的UI 商品有很多尺码,而且展现每个尺码所需要的View的大小也不同(主要是宽度),所以在从服务器端拉到数据之前,展现所有尺码所需要的行数和每一行的个数都无法确定,因此不能直接使用GridView或ListView. 如果使用LinearLayout呢? 一个LinearLayout只能显示一行,如果要展示多行,则每一行都要new一个Linear

  • Android开发高仿课程表的布局实例详解

    先说下这个demo,这是一个模仿课程表的布局文件,虽然我是个菜鸟,但我还是想留给学习的人一些例子,先看下效果 然后再来看一下我们学校的app 布局分析 先上一张划分好了的布局图 首先整个页面放在一个LinearLayout布局下面,分为上面和下面两个部分,下面一个是显示课程表的详细信息 1:这个没什么好讲的,就是直接一个LinearLayout布局,然后将控件一个TextView用来显示年份,一个View用来当作竖线,一个Spinner用来显示选择周数 2:这个是显示星期几的部件,是我自定义的V

  • Android 简单实现一个流式布局的示例

    本篇文章主要介绍了Android 简单实现一个流式布局的示例,分享给大家,具体如下: 流式布局应该是我们很常见的一种布局了,在很多场景下都会遇到它,例如:标签之类的功能等.用轮子不如造轮子来的爽,这里自己简单的实现下流式布局: onMeasure onLayout 通过以上两个方法我们就可以完成对流式布局的基本操作: onMeasure @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

  • android商品详情页面设计详解

    本文实例为大家分享了android商品详情展示的具体代码,供大家参考,具体内容如下 首先看下效果图(样式,布局可以根据产品要求改变), 先大致说一下,整体结构使用的是LinearLayout实现,分上下两部分,上边就是我们能滑动的自定义布局,下面就是"进入店铺","立即购买"这两个无关紧要的布局: 下面是根据产品的要求更改的,每个APP几乎都不一样,所以说是无关紧要: 布局文件骨架: <LinearLayout xmlns:android="http

随机推荐