1,首先看一下我们今天实现的效果,效果图如下:

2,首先说一下大体的实现思路,首先这个视图一共分为三层,最外层是一个RecyclerView,第二层是一个被虚化的ImageView,第三层是一个正常的ImageView。当用户滑动RecyclerView,监听滑动的高度而动态的改变第二层ImageView的透明度,当RecyclerView滑动高度超过某个特定的高度的时候,透明度达到最大值即第二层虚化的ImageView完全展现。当RecyclerView滑动到起始位置的时候,透明度达到最小值即第二层虚化的ImageView完全隐藏从而展示的是第一层的ImageView。,下面看一下具体的实现步骤:

  第一步:了解Renderscript

  这是它的官方文档,我们只需要了解它的使用就行了,大致分为一下几个步骤:

① 首先需要通过 Context 创建一个 Renderscript ;
② 其次通过创建的 Renderscript 来创建一个自己需要的脚本( ScriptIntrinsic ),比如这里③ 需要模糊,那就是 ScriptIntrinsicBlur ;
④ 然后至少创建一个 Allocation 类来创建、分配内存空间;
⑤ 接着就是对图像进行一些处理,比如说模糊处理;
⑥ 处理完成后,需要刚才的 Allocation 类来填充分配好的内存空间;
⑦ 最后可以选择性的对一些资源进行回收。

  这里我们创建一个BlurBitmapUtil来简单的封装一下,注释很详细,就不废话了,代码如下:

  BlurBitmapUtil.java

package com.qianmo.xiaomiblue.utils;import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;/*** Created by wangjitao on 2017/3/6 0006.* E-Mail:543441727@qq.com* <p>* 模糊图片工具类*/public class BlurBitmapUtil {/*** Renderscript 的简单的使用步骤* 下面简单说一下使用的步骤,这也是官方文档中的说明:* 首先需要通过 Context 创建一个 Renderscript ;* 其次通过创建的 Renderscript 来创建一个自己需要的脚本( ScriptIntrinsic ),比如这里需要模糊,那就是 ScriptIntrinsicBlur ;* 然后至少创建一个 Allocation 类来创建、分配内存空间;* 接着就是对图像进行一些处理,比如说模糊处理;* 处理完成后,需要刚才的 Allocation 类来填充分配好的内存空间;* 最后可以选择性的对一些资源进行回收。*///图片等比缩放private static final float BITMAP_SCALE = 0.4f;/*** 模糊图片工具类** @param context* @param image* @param blurRadius* @return*/public static Bitmap blurBitmap(Context context, Bitmap image, float blurRadius) {//设置渲染模糊程度,25f是最大的模糊化度if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {//计算等比缩小的长宽度int width = Math.round(image.getWidth() * BITMAP_SCALE);int height = Math.round(image.getHeight() * BITMAP_SCALE);//将缩小后的图片作为预渲染的图片Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);//创建一张渲染后的输出图片Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);//创建RenderScript内核对象RenderScript rs = RenderScript.create(context);//创建模糊效果的RenderScript工具对象ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));//由于RenderScript并没有使用VM分配内存,所以需要使用Allocation来创建和分配内存空间//创建Allocation对象的时候其实内存使用的,需要使用copyto将数据填充Allocation allocationInput = Allocation.createFromBitmap(rs, inputBitmap);Allocation allocationOutput = Allocation.createFromBitmap(rs, outputBitmap);blurScript.setRadius(blurRadius);//设置blurscript对象的输入内存blurScript.setInput(allocationInput);//将输出数据保存到输入内存中blurScript.forEach(allocationOutput);//将数据填充到allocation中allocationOutput.copyTo(outputBitmap);return outputBitmap;} else {return null;}}
}

  第二步:自定义BlurredView,具体实现是实现原ImageView和虚化ImageView的组合,继承自Relativelayout,注释很详细,就直接贴代码了,只要是由setBlurredLevel()方法来控制透明度的改变

  自定义的属性:

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="BlurredView"><attr name="src" format="reference"/><attr name="disableBlurred" format="boolean"/></declare-styleable>
</resources>

  对应的布局文件blurredview.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/blurredview_blurred_img"android:scaleType="fitXY"android:visibility="gone"android:layout_width="match_parent"android:layout_height="match_parent"/><ImageViewandroid:id="@+id/blurredview_origin_img"android:scaleType="fitXY"android:layout_width="match_parent"android:layout_height="match_parent"/></FrameLayout>

  BlurredView.java

package com.qianmo.xiaomiblue.view;import android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.RelativeLayout;import com.qianmo.xiaomiblue.R;
import com.qianmo.xiaomiblue.utils.BitmapUtil;
import com.qianmo.xiaomiblue.utils.BlurBitmapUtil;import static android.R.attr.level;/*** Created by wangjitao on 2017/3/6 0006.* E-Mail:543441727@qq.com*/public class BlurredView extends RelativeLayout {private Context mContext;//最大透明值private static final int ALPHA_MAX_VALUE = 255;//最大模糊度private static final float BLUR_RADIUS = 25f;//原图片private ImageView mOriginalImg;//模糊化后private ImageView mBlurredImg;private Bitmap mOriginalBitmap;private Bitmap mBlurredBitmap;//是否禁止使用高斯模糊private boolean isDisableBlurred;public BlurredView(Context context) {super(context);initView(context);}public BlurredView(Context context, AttributeSet attrs) {super(context, attrs);initView(context);initAttr(context, attrs);}public BlurredView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView(context);initAttr(context, attrs);}@TargetApi(Build.VERSION_CODES.LOLLIPOP)public BlurredView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);initView(context);initAttr(context, attrs);}/*** 当所有子View出现后 设置相关内容*/@Overrideprotected void onFinishInflate() {super.onFinishInflate();setImageView();}/*** 初始化View** @param context*/private void initView(Context context) {mContext = context;LayoutInflater.from(mContext).inflate(R.layout.blurredview, this);mOriginalImg = (ImageView) findViewById(R.id.blurredview_origin_img);mBlurredImg = (ImageView) findViewById(R.id.blurredview_blurred_img);}/*** 初始化属性** @param context* @param attrs*/private void initAttr(Context context, AttributeSet attrs) {TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BlurredView);Drawable drawable = typedArray.getDrawable(R.styleable.BlurredView_src);isDisableBlurred = typedArray.getBoolean(R.styleable.BlurredView_disableBlurred, false);typedArray.recycle();//虚化照片if (null != drawable) {mOriginalBitmap = BitmapUtil.drawableToBitmap(drawable);mBlurredBitmap = BlurBitmapUtil.blurBitmap(context, mOriginalBitmap, BLUR_RADIUS);}//是否可见if (!isDisableBlurred) {mBlurredImg.setVisibility(VISIBLE);}}/*** 以代码的方式添加待模糊的图片** @param blurredBitmap 待模糊的图片*/public void setBlurredImg(Bitmap blurredBitmap) {if (null != blurredBitmap) {mOriginalBitmap = blurredBitmap;mBlurredBitmap = BlurBitmapUtil.blurBitmap(mContext, blurredBitmap, BLUR_RADIUS);setImageView();}}/*** 以代码的方式添加待模糊的图片** @param blurDrawable 待模糊的图片*/public void setBlurredImg(Drawable blurDrawable) {if (null != blurDrawable) {mOriginalBitmap = BitmapUtil.drawableToBitmap(blurDrawable);mBlurredBitmap = BlurBitmapUtil.blurBitmap(mContext, mOriginalBitmap, BLUR_RADIUS);setImageView();}}/*** 填充ImageView*/private void setImageView() {mBlurredImg.setImageBitmap(mBlurredBitmap);mOriginalImg.setImageBitmap(mOriginalBitmap);}/*** 设置模糊程度** @param level 模糊程度, 数值在 0~100 之间.*/@SuppressWarnings("deprecation")public void setBlurredLevel(int level) {//超过模糊级别范围 直接抛异常if (level < 0 || level > 100) {throw new IllegalStateException("No validate level, the value must be 0~100");}//禁用模糊直接返回if (isDisableBlurred) {return;}//设置透明度mOriginalImg.setAlpha((int) (ALPHA_MAX_VALUE - level * 2.55));}/*** 显示模糊图片*/public void showBlurredView() {mBlurredImg.setVisibility(VISIBLE);}/*** 选择是否启动/禁止模糊效果** @param isDisableBlurred 是否禁用模糊效果*/@SuppressWarnings("deprecation")public void setBlurredable(boolean isDisableBlurred) {if (isDisableBlurred) {mOriginalImg.setAlpha(ALPHA_MAX_VALUE);mBlurredImg.setVisibility(INVISIBLE);} else {mBlurredImg.setVisibility(VISIBLE);}}/*** 禁用模糊效果*/@SuppressWarnings("deprecation")public void disableBlurredView() {isDisableBlurred = true;mOriginalImg.setAlpha(ALPHA_MAX_VALUE);mBlurredImg.setVisibility(INVISIBLE);}/*** 启用模糊效果*/public void enableBlurredView() {isDisableBlurred = false;mBlurredImg.setVisibility(VISIBLE);}
}

  第三步:设置RecyclerView,并监听滑动,改变虚化图片的透明度

  MyAdapter

package com.qianmo.xiaomiblue.adapter;import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import com.qianmo.xiaomiblue.R;/*** Created by Administrator on 2017/3/6 0006.* E-Mail:543441727@qq.com*/public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {private Context context;private static final int ITEM_COUNT = 10;private static final int TYPE_HEAD = 0;private static final int TYPE_ITEM = 1;public MyAdapter(Context context) {this.context = context;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {if (viewType == TYPE_HEAD) {return new HeadViewHolder(LayoutInflater.from(context).inflate(R.layout.recyclerview_head, parent, false));}return new ItemViewHolder(LayoutInflater.from(context).inflate(R.layout.recyclerview_item, parent, false));}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {}@Overridepublic int getItemViewType(int position) {if (position == 0) {return TYPE_HEAD;} else {return TYPE_ITEM;}}@Overridepublic int getItemCount() {return ITEM_COUNT;}public class ItemViewHolder extends RecyclerView.ViewHolder {public ItemViewHolder(View itemView) {super(itemView);}}public class HeadViewHolder extends RecyclerView.ViewHolder {public HeadViewHolder(View itemView) {super(itemView);}}
}

  在MainActivity中设置

 recyclerView.setLayoutManager(new LinearLayoutManager(this));recyclerView.setAdapter(new MyAdapter(this));recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);mScrollerY += dy;//根据滚动距离控制模糊程度 滚动距离是模糊程度的十倍if (Math.abs(mScrollerY) > 1000) {mAlpha = 100;} else {mAlpha = Math.abs(mScrollerY) / 10;}//设置透明度等级blurredView.setBlurredLevel(mAlpha);}});

  ok,这样我们的功能就实现了  ,很简单有没有,主要是Rederscript的掌握

  github项目地址

转载于:https://www.cnblogs.com/wjtaigwh/p/6510693.html

Android -- 仿小米锁屏画报相关推荐

  1. Android 仿小米锁屏实现九宫格解锁

    最近公司要求做个九宫格解锁,本人用的是小米手机,看着他那个设置锁屏九宫格很好看,就做了该组件,不使用图片资源,纯代码实现. 尊重每个辛苦的博主,在http://blog.csdn.net/mu399/ ...

  2. android 锁屏画报,小米手机锁屏画报一直换怎么办?小米锁屏画报设置技巧

    小米手机的锁屏海报是可以实施自动更换的.毫无疑问这是相当费流量的.当小米手机没有wifi环境了,小编建议将这项功能进行关闭.下面小编来介绍下小米锁屏画报怎么关闭? 小米锁屏一直更换怎么关? 小米锁屏画 ...

  3. Android仿QQ锁屏状态下消息提醒(震动+提示音)

    导读: 最近在开发一个定时提醒业务,类似于闹钟,然后遇到了一个问题,当APP应用在后台运行时,用户关闭了手机屏幕(手机进入灭屏休眠状态),这个时候使用系统震动和闹钟没有起到作用.why? 同样是灭屏休 ...

  4. android 锁屏壁纸 保存,小米手机锁屏画报壁纸怎么保存?

    标小米锁屏壁纸画报中提供了很多重要的功能,其中不乏很多精美的壁纸图片,那么这些壁纸图片该怎么进行保存呢?接下来欢迎大家速来围观我的经验啦. 一.利用锁屏壁纸收藏功能来保存图片 1.当然,除了分享功能, ...

  5. android h5控制锁屏,WebView播放H5课件时,锁屏解锁后,页面重新绘制的问题

    难题描述:H5页面播放 ,锁屏,解锁后,重新加载了页面,三星不会出现(onpause onstop ,onresume),但在小米.魅族会调用 onpause onstop ondestroy,onr ...

  6. android微信电话锁屏,解决 Android 7.0 系统中,微信无法在锁屏画面显示

    文章版块:HTC One A9 在 Android 7.0 系统中htc手机微信怎么截屏htc手机微信怎么截屏,会出现微信无法在锁屏画面显示的状况.建议您进行下面修改就可以解决: 进入"HT ...

  7. android可以有一个悬浮窗口在进入屏保状态显示,点击进入应用,Android如何实现锁屏状态下弹窗...

    前言 想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager设置 Window的 Flag,通过设置 Flag的显示优先级来让窗口显示在锁屏的上面. 接下来就是试验可能相关的 Windo ...

  8. 仿QQ锁屏界面消息提示

    唤醒屏幕: 1 PowerManager pm = (PowerManager) context 2 .getSystemService(Context.POWER_SERVICE); 3 WakeL ...

  9. Android端恶意锁屏勒索应用分析

    一.前言 5月12日,一场全球性互联网灾难悄然而至,一款名为WannaCRY的PC端恶意勒索软件利用NSA泄漏的危险漏洞"永恒之蓝",给100多个国家和地区10万台电脑造成了巨大的 ...

最新文章

  1. 如何优雅的编写 JavaScript 代码
  2. 手把手教你用Python爬虫煎蛋妹纸海量图片
  3. 如何将本地代码上传到GitHub
  4. 苹果电脑无法用普通域用户加入域,用域管理员却可以,怎么破!?
  5. 将一个数字划分成树状
  6. python绘制散点图的函数_python matplotlib更新函数的散点图
  7. python sqlite3写入内存_Python SQLite内存缓存
  8. 改caffe 里面的contrsitve_loss
  9. 大选期间完成25亿推送:美国移动push平台Urban Airship架构解密
  10. 前端学java还是python_零基础小白 选择学习 java、php、前端 还是 python?
  11. 阿里云CentOs 6.4 yum报错Couldn't resolve host'xx
  12. 利用运动学实现导弹仿真飞行
  13. 【已解决】您的PHP似乎没有安装运行WordPress所必需的MySQL扩展
  14. php自测试卷2,PHP试题网
  15. 计算机无法装补丁,Win7系统无法安装补丁提示缺少Service Pack系统组件的原因及解决方法...
  16. Android市场-开发者账号注册等-移动开放平台网址收藏
  17. Backtrader(十二)- 订单 Order -buy、sell、close
  18. 从软件到硬件,2017 我GET到的15条产品心得总结
  19. centos 7的firewalld防火墙配置IP伪装和端口转发(内附配置案例)
  20. 东方通 启动服务访问不到_东方通 部署项目 中文乱码 问题解决

热门文章

  1. 从EXIF JPEG图片中提取GPS位置信息
  2. 修正Strut2 自带上传拦截器功能
  3. AndroidsetBackground和setbackgroundColor不显示颜色问题
  4. 【QNX Hypervisor 2.2 用户手册】4.1 构建QNX Hypervisor系统的方法
  5. Microsoft Office Word已停止工作”解决方法
  6. iOS的各种开源项目集合
  7. 【数据结构 C语言版】第六篇 栈、队列经典必刷面试考研题
  8. 无牌宝马打人事件大致经过,有记者称是李双江之子
  9. 网络原理考点之HDLC协议、计算及异步传输
  10. 百度AI攻略:车辆属性识别