Android 5.0新特性

移动端 0 756
小小草
小小草 2020年9月13日 21:17 发表
摘要:1. 全新的 Material Design 新风格 2. 支持多种设备 3. 全新的通知中心设计

1.1 安卓5.0新特性

1.1.1 Android 5.0 主要新特性

1. 全新的 Material Design 新风格

2. 支持多种设备

3. 全新的通知中心设计

4. 支持 64 位 ART 虚拟机(ART:Android runtime)

5. Overview(多任务,就是关后台程序的那个,小米手机上拉)

6. 设备识别解锁

7. Ok Google 语音指令(语音助手)

8. Face unlock 面部解锁

1.1.2 替换 ListView 和 GridView 的 RecyclerView

有什么优点?

具有高度的解耦、异常的灵活性和更高的效率,通过设置它提供的不同 LayoutManager、ItemDecoration、ItemAnimator 可实现更加丰富多样的效果

缺点:

分割线需要自定义,另外列表的点击事件需要自己去实现。

1.设置分割线

现在谷歌有提供默认的分割线

  recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));

如果是网格布局的话,横着,竖着都画

2.自定义分割线

利用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);
        }
    }
}

3.自定义点击事件

  1. 定义接口
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);
        }
    }
}

1.1.4 3种通知

1.普通通知

就是显示在那个状态栏的通知

2.折叠式

它有两种状态,一种是普通状态下的视图(如果不是自定义的话和上面普通通知的视图样式一样),一种是展开状态下的视图。

自定义的视图,而这个视图显示的进程和我们创建视图的进程不再一个进程,所以我们需要使用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.界面展示

3.悬挂式

就是不需要下拉状态栏就行了

1.不同的是,需要用

//如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的
        PendingIntent hangPendingIntent = PendingIntent.getActivity(this, 0, hangIntent, PendingIntent.FLAG_CANCEL_CURRENT);
//这里需要设置setFullScreenIntent而不是setContentIntent
        builder.setFullScreenIntent(hangPendingIntent, true);

1.1.5 ToolBar和Palette

1.怎么在ToolBar中的按钮中指定控件呢

其实就是在menu中的item里面

app:actionViewClass=”控件”就行了

2.Palette的应用

这个是什么,其实就是得到图片的色调的

怎么使用?

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.内置提取颜色的种类

  • Vibrant 充满活力的
  • Vibrant dark充满活力的黑
  • Vibrant light 充满活力的亮
  • Muted 柔和


原文:安卓5.0新特性


点赞 0 收藏(0)    分享
相关标签: andriod
问题没解决?让chatGPT帮你作答 智能助手
0 个评论
  • 消灭零评论