Material Design现在有三种默认的主题可以设置。
@android:style/Theme.Material(dark version)
@android:style/Theme.Material.Light(light version)
@android:style/Theme.Material.Light.DarkActionBar
通过如下代码,可以通过使用自定义Style的方式来创建自己的Color Paltette颜色主题,从而实现不同的颜色风格。
<resources>
<style name="AppTheme" parent="android:Theme.Material">
<item name="android:colorPrimary">#BEBEBE</item>
<item name="android:colorPrimaryDark">#FF5AEBFF</item>
<item name="android:navigationBarColor">#FFFF4130</item>
</style>
</resources>
Android内置了几种提取色调的种类:
Vibrant(充满活力的)
Vibrant dark(充满活力的黑)
Virbrant light(充满活力的亮)
Muted(柔和的)
Muted dark(柔和的黑)
Muted light(柔和的亮)
使用Palette的API,能够让我们从Bitmap中获取对应的色调,修改当前的主题色调。
如何使用?
在项目的Module Setting的Dependencies选项卡中添加com.android.support:plette-v7:21.0.2引用,重新Sync项目即可。
通过传递一个Bitmap对象给Palette,并调用它的Palette.generate()静态方法或者Palette.generateAsync()方法来创建一个Palette。接下来,就可以使用getter方法来检索相应的色调。
Palette.generateAsync(bitmap,new Palette.PaletteAsyncListener(){
@Override
public void onGenerated(Palette palette){
//通过Palette来获取对应的色调
Palette.Swatch vibrant = palette.getDarkVibrantSwatch();
//将颜色设置给相应的组件
getActionBar().setBackgroundDrawable(new ColorDrawable(vibrant.getRgb()));
Window window = getWindow();
window.setStatusBarColor(vibrant.getRgb());
}
});
通过以下方法来提取不同色调的颜色:
palette.getVibrantSwatch();
palette.getDarkVibrantSwatch();
palette.getLightVibrantSwatch();
palette.getMutedSwatch();
palette.getDarkMutedSwatch();
palette.getLightMutedSwatch();
以往的Android View通常具有两个属性——X和Y,在Android 5.X中,Google为其增加了一个新的属性——Z,对应垂直方向上的高度变化。
View的Z值由两部分组成,elevation和translationZ(它们都是Android5.X新引入的属性)。elevation是静态的成员,translationZ可以在代码中使用来实现动画效果。
Z = elevation + translationZ
通过在XML布局中使用如下代码来静态设置View的视图高度。
android:elevation="XXdp"
在程序中,同样可以使用如下代码来动态改变视图高度。
view.setTranslationZ(XXX);
通常也会使用属性动画来为视图高度改变的时候增加一个动画效果,如下:
view.animate().translationZ(int);
Tinting的使用如下:
只要在XML中配置好tint和tintMode就可以了。
Tint通过修改图像的Alpha遮罩来修改图像的颜色,从而达到重新着色的目的。
Clipping可以改变一个视图的外形。要使用Clipping,首先需要使用ViewOutlineProvider来修改outline,然后再通过setOutlineProvider将outline作用给视图。
//获取Outline
ViewOutlineProvider viewOutlineProvider = new ViewOutlineProvider(){
@Override
public void getOutline(View view,Outline outline){
outline.setRoundRect(0,0,view.getWidth(),view.getHeight(),30);
}
};
//重新设置形状
v1.setOutlineProvider(viewOutlineProvider);
在Android5.X中对ListView做了升级,增加了一个使用更方便、效率更高
的控件——RecyclerView。与ListView相比,它同样拥有item回收复用的功能,但是RecyclerView可以直接把ViewHolder的实现封装起来。用户只要实现自己的ViewHolder就可以了,改组件会自动帮你回收复用每一个item。
CardView是一个容器类布局,只是提供了卡片这样一种形式。可以定义卡片的大小与视图高度,并设置圆角的角度。首先要在项目中引入com.android.support:cardview-v7:21的依赖。在布局文件中使用CardView的时候需要引入一个新的名字空间——在Android Studio中使用xmlns:card_view=http://schemas.android.com/apk/res-auto来添加。这样才可以通过自定义的名字空间来引入它的两个属性:
//设置背景颜色
card_view:cardBackgroundColor="@color/cardview_background"
//设置圆角的角度
card_view:cardCornerRadius="8dp"
在以前,想要给Activity切换设置动画,通过overridePendingtransition(int inId.int outId)。在Android 5.0中,为Activity的转场效果设计了更加丰富的动画效果。
提供了三种Transition类型:
进入:一个进入的过渡动画决定Activity中所有的视图怎么进入屏幕。
退出:一个退出的过渡动画决定一个Activity中的所有视图怎么退出屏幕。
共享元素:一个共享元素过渡动画决定两个Activities之间的过渡,怎么共享它们的视图。
其中,进入和退出效果包括:
explode(分解)——从屏幕中间进或出,移动视图
slide(滑出)——从屏幕边缘进入或出,移动视图
fade(淡出)——通过改变屏幕上视图的不透明度达到添加或者移除视图。
共享元素包括:
changeBounds——改变目标视图的布局边界
changeClipBounds——裁剪目标视图边界
changeTransform——改变目标视图的缩放比例和旋转角度
changeImageTransform——改变目标图片的大小和缩放比例
首先来看看普通的三种Activity过渡动画,从ActivityA跳转到ActivityB,只需要在ActivityA中将基本的startActivity(intent)方法改为:
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());
在ActivityB中,只需要设置如下:
getWindow().requestFeature(Window.FEATURE.CONTENT_TRANSITIONS)
;
或者在样式文件中设置如下所示代码:
<item name="android:windowContentTransitions">true</item>
接下来就可以设置进入ActivityB的具体动画效果。
getWindow().setEnterTransition(new Explode());
或者设置离开ActivityB的动画效果:
getWindow().setExitTransition(new Fade());
共享元素:比如ActivityA中拥有的元素,B中也拥有。那么在跳转的时候,其他元素消失,而共享元素通过动画效果直接显示到ActivityB中。
如何使用呢?
首先在ActivityA的布局文件中设置共享的元素,给它增加相应的属性,代码如下:
android:transitionName="XXX"
同时在ActivityB的布局文件中,给要实现共享效果的元素也增加相同的属性,代码如下:
android:transitionName="XXX"
保证命名相同,这样系统才能找到共享元素。
如果只要一个共享元素,那么在Activity中只需要使用如下代码:
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,view,"share").toBundle());
使用的参数就是在前面普通动画的基础上增加了共享View和前面取得名字。
如果有多个共享的元素,那么可以通过Pair.create()来创建多个共享元素,代码如下:
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,Pair.create(view,”share”),Pair.create(fab,”fab”)).toBundle());
在Android 5.X中,Material Design大量使用了Ripple效果,即点击后的波纹效果。
//波纹有边界
android:background="?android:attr/selectableItemBackground"
//波纹超出边界
android:background="?android:attr/selectableItemBackgroundBorderless"
同样,也可以在XML文件中来创建一个具有Ripple效果的XML文件,代码如下:
<ripple
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@android:color/holo_blue_bright"
>
<item>
<shape
android:shape="oval"
>
<solid android:color="?android:colorAccent"/>
</shape>
</item>
</ripple>
一个View以圆形的形式展开、揭示出来。通过ViewAnimationUtils.createCircularReveal()方法可以创建一个RevealAnimator动画。
public static Animator createCircularReveal(
View view,
int centerX,
int centerY,
float startRadius,
float endRadius
){
return new RevealAnimator(view,centerX,centerY,startRadius,endRadius);
}
centerX 动画开始的中心点X
centerY 动画开始的中心点Y
startRadius 动画开始半径
endRadius 动画结束半径
在Android 5.X中,系统提供了视图状态改变来设置一个视图的状态切换动画。
####StateListAnimator
StateListAnimator作为视图改变时的动画效果,通常会使用Selector来
进行设置。以前设置Selector的时候,通常是修改背景来达到反馈的效果。现在,在Android 5.X中,可以使用动画作为视图改变的效果。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<set>
<objectAnimator ****>
</set>
</item>
...
</selector>
在一般的xml布局中,使用如下代码来将StateListAnimator添加给一个View。
android:stateListAnimator="@drawable/***"
同样,在代码中也可以调用AnimationInflater.loadStateListAnimator()方法,通过View.setStateListAnimator()方法分配动画到视图上。
这一点类似于帧动画。
Toobar与ActionBar最大的区别就是Toolbar更加自由,可控。要使用Toobar必须引入appcompat-v7支持,并设置主题为NoActionBar,因此在styles.xml文件中,使用如下所示的代码进行设置。
<?xml version="1.0" encoding="utf-8">
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!--toobar颜色-->
<item name="colorPrimary">#4876FF</item>
<!--状态栏颜色-->
<item name="colorPrimaryDark">#3A5FCD</item>
<!--窗口的背景颜色-->
<item name="android:windowBackground">@android:color/white</item>
<!--add SeachView-->
<item name="searchViewStyle">@style/MySearchView</item>
</style>
<style name="MySearchView" parent="Widget.AppCompat.SearchView"/>
</resources>
在Gradle配置文件中增加对appcompat-v7的引用,代码如下:
dependencies{
compile fileTree(dir:'libs',include:['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
}
通过Notification.Builder创建一个Notification的builder,代码如下:
Notification.Builder builder = new Notification.Builder(this);
给点击Notification后要执行的操作增进一个Intent,由于这个Intent不是马上就执行,而是由用户触发的,所以Android给这样的Intent提供了一个PendingIntent来帮助我们完成这样的延迟操作。
PendingIntent的使用如下:
Intent intent = new Intent(Intent.ACTION_VIEW,Uil.parse("http://www.baidu.com"));
//构造PendingIntent
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,0);
有了builder对象,可以给它增加各种属性:
builder.setSmallIcon();
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);
builder.setLargeIcon();
builder.setContentTitle("Basic Notifications");
builder.setContentText("I am a basic notification");
builder.setSubText("it is really basic");
Android系统通过NotificationManager系统服务来帮助我们管理Notification,并通过调用notify方法来发出Notification。
//通过NotificationManager来发出Notification
NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(NOTIFICATION_ID_BASIC,builder.build());
是一种自定义的Notification,常常用于显示长文本。
//通过RemoteViews来创建自定义的Notification视图
RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.***);
content.setTextViewText(R.id.***,"*****");
通过如下代码,就可以将一个视图指定为Notification正常状态下的视图。
notification.contentView = contentView;
将另一个展开的布局通过如下代码指定为展开时的视图。
notification.bigContentView = expandedView;
builder.setContentText("***".setFullScreenIntent(pendingIntent,true));
VISIBILITY_PRIVATE——表明只有当没有锁屏的时候才显示
VISIBILITY_PUBLIC——表明在任何情况下都会显示
VISIBILITY_PRIVATE——表明在pin,password等安全锁和没有锁屏的情况下才能够显示
builder.setVisibility(Notification.VISIBILITY_PUBLIC);