1. 全新的 Material Design 新风格
2. 支持多种设备
3. 全新的通知中心设计
4. 支持 64 位 ART 虚拟机(ART:Android runtime)
5. Overview(多任务,就是关后台程序的那个,小米手机上拉)
6. 设备识别解锁
7. Ok Google 语音指令(语音助手)
8. Face unlock 面部解锁
有什么优点?
具有高度的解耦、异常的灵活性和更高的效率,通过设置它提供的不同 LayoutManager、ItemDecoration、ItemAnimator 可实现更加丰富多样的效果
缺点:
分割线需要自定义,另外列表的点击事件需要自己去实现。
现在谷歌有提供默认的分割线
recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
如果是网格布局的话,横着,竖着都画
利用setDrawable方法
首先编写1个样式
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:centerColor="#ff00ff00" //绿色
android:endColor="#ff0000ff" //蓝色
android:startColor="#ffff0000" //红色
android:type="linear" />
<size android:height="3dp" />
</shape>
然后
//添加自定义分割线
DividerItemDecoration divider = new DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
divider.setDrawable(ContextCompat.getDrawable(this,R.drawable.custom_divider));
recyclerView.addItemDecoration(divider);
或者用代码
/**
* Created by Moon on 2015/11/21.
*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
public DividerItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
public void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
public interface OnItemClickListener
{
void onItemClick(View view, int position);
void onItemLongClick(View view,int position);
}
2.这里写的为了调用方法,用到上面的接口回调
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener)
{
this.mOnItemClickListener = mOnItemClickListener;
}
3.在onCreateViewHolder里面设置
view.setOnClickListener(this);
view.setOnLongClickListener(this);
//点击事件
@Override
public void onClick(View view) {
if (mOnItemClickListener != null) {
//回调
mOnItemClickListener.onItemClick(view,(int)view.getTag());
}
}
//长按事件
@Override
public boolean onLongClick(View view) {
if (mOnItemClickListener != null) {
//回调
mOnItemClickListener.onItemLongClick(view,(int)view.getTag());
}
return true;
}
4.在activity中
private void setLister(){
mHomeAdaper.setOnItemClickListener(new HomeAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Toast.makeText(RecyclerViewActivity.this, "点击第" + (position + 1) + "条", Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view, final int position) {
new AlertDialog.Builder(RecyclerViewActivity.this)
.setTitle("确认删除吗?")
.setNegativeButton("取消", null)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mHomeAdaper.removeData(position);
}
})
.show();
}
});
}
5.总的代码Adapter
package com.example.liuwangshu.myrecyclerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import java.util.List;
import android.view.ViewGroup.LayoutParams;
/**
* Created by Moon on 2015/11/21.
*/
class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> implements View.OnClickListener,View.OnLongClickListener
{
private List<String> mList;
private Context mContext;;
private OnItemClickListener mOnItemClickListener;
public HomeAdapter(Context mContext,List<String>mList){
this.mContext=mContext;
this.mList=mList;
}
public interface OnItemClickListener
{
void onItemClick(View view, int position);
void onItemLongClick(View view,int position);
}
public void setOnItemClickListener(OnItemClickListener mOnItemClickListener)
{
this.mOnItemClickListener = mOnItemClickListener;
}
public void removeData(int position) {
mList.remove(position);
notifyItemRemoved(position); //动态效果
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View view=LayoutInflater.from(
mContext).inflate(R.layout.item_recycler, parent,
false);
MyViewHolder holder = new MyViewHolder(view);
view.setOnClickListener(this);
view.setOnLongClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position)
{
holder.itemView.setTag(position);
holder.tv.setText(mList.get(position));
}
@Override
public void onClick(View view) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemClick(view,(int)view.getTag());
}
}
@Override
public boolean onLongClick(View view) {
if (mOnItemClickListener != null) {
mOnItemClickListener.onItemLongClick(view,(int)view.getTag());
}
return true;
}
@Override
public int getItemCount()
{
return mList.size();
}
class MyViewHolder extends RecyclerView.ViewHolder
{
TextView tv;
public MyViewHolder(View view)
{
super(view);
tv = (TextView) view.findViewById(R.id.tv_item);
}
}
}
就是显示在那个状态栏的通知
它有两种状态,一种是普通状态下的视图(如果不是自定义的话和上面普通通知的视图样式一样),一种是展开状态下的视图。
自定义的视图,而这个视图显示的进程和我们创建视图的进程不再一个进程,所以我们需要使用RemoteViews,首先要使用RemoteViews来创建我们的自定义视图:
//用RemoteViews来创建自定义Notification视图
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_fold);
1.展开后的视图的布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="100dp"
android:background="@drawable/fold"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_image"
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/fold"
/>
<TextView
android:id="@+id/tv_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="30dp"
android:layout_marginLeft="150dp"
android:text="展开后的自定义视图"
android:textColor="@color/colorPrimaryDark"/>
</LinearLayout>
2.指定展开的视图
//指定展开时的视图
notification.bigContentView = remoteViews;
3.总的代码
Notification.Builder builder = new Notification.Builder(this);
Intent mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://blog.csdn.net/itachi85/"));
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, mIntent, 0);
builder.setContentIntent(pendingIntent);
builder.setSmallIcon(R.drawable.foldleft);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.lanucher));
builder.setAutoCancel(true);
builder.setContentTitle("折叠式通知");
//用RemoteViews来创建自定义Notification视图
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_fold);
Notification notification = builder.build();
//指定展开时的视图
notification.bigContentView = remoteViews;
notificationManager.notify(1, notification);
4.界面展示
就是不需要下拉状态栏就行了
1.不同的是,需要用
//如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的
PendingIntent hangPendingIntent = PendingIntent.getActivity(this, 0, hangIntent, PendingIntent.FLAG_CANCEL_CURRENT);
//这里需要设置setFullScreenIntent而不是setContentIntent
builder.setFullScreenIntent(hangPendingIntent, true);
其实就是在menu中的item里面
app:actionViewClass=”控件”就行了
这个是什么,其实就是得到图片的色调的
怎么使用?
1.导入包
‘com.android.support:palette-v7:23.0.1
2.先获取图片的Bitmap
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.bitmap);
3.然后在Palette的回调中获取色调
Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
Palette.Swatch swatch=palette.getVibrantSwatch();
//得到他的rgb色
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(swatch.getRgb()));
}
});
4.内置提取颜色的种类
原文:安卓5.0新特性