Android实现毛玻璃效果(高斯模糊)

在项目开发过程,有时候为了界面效果美观,需要在背景处用到毛玻璃效果,但是在 Android 上也能实现毛玻璃效果?性能如何?

在网上看到这篇文章,大家可以参考一下

一种快速毛玻璃虚化效果实现

主要思想就是,

  1. 对要进行模糊的图片和界面(需要获取屏幕截图)进行压缩。
  2. 对压缩后的图片进行模糊处理。主要采用 StackBlur 模糊算法,这种算法应用非常广泛,能得到非常良好的毛玻璃效果。在这里,使用是它的 Java 实现代码FastBlur.java
    
1
public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap)

可以看出,使用方法非常简单,传入待虚化的 bitmap、虚化程序(一般为 8)、和是否重用 flag。

相关资料

Android WebView实现全屏播放的一种方法

用过WebView的开发者们肯定都知道这里面的坑数不胜数,加载缓慢,内存泄露,文件选择…… 最近在项目中遇到了对接小鱼易联直播的情况,因为小鱼本身提供了直播功能,采用的是网页方式,所以在手机端直接进行对接网页,然后在进行全屏播放视频,又遇到了一个大坑。一个没有修饰过的原生WebView几乎不可能在某一个主流视频网站实现全屏播放,倘若在客户端自己实现简单的播放器,链接拿过来,摆个VideoView,想怎么全屏怎么全屏,放在WebView上,一切就悲剧了,大多数情况下点击“全屏按钮”是没有反应的,或者无法实现横屏全屏。今天来介绍一种简单易行粗暴的方式来实现WebView的视频全屏播放。

当你无从下手的时候,照例先看一下官方文档,很多常见的问题官方文档都给我们提供思路。你会发现下面这样一段话,发现官方已经提供了实现全屏展示html content的方式。

应用如果需要支持HTML5的video标签,必须打开硬件加速。我们只需要在Application标签或者相应Activity标签下添加android:hardwareAccelerated=”true”即可。接着为了支持全屏,需要重写WebChromeClient的onShowCustomView()和onHideCustomView()方法,这两个方法缺一不可。先来看一下onShowCustomView():

查看更多

港岛妹妹的西班牙馅饼长什么样

作者:西班牙馅饼
链接:https://www.zhihu.com/question/26876220/answer/102255551
来源:知乎

志说他不后悔做过的这些事情,但有点后悔把它写出来。不是因为怕暴露自己的品行,而是因为可能对文中人物带来困扰。我不知道我把它贴出来是否也是一种不道德。

港岛妹妹 你献给我的西班牙馅饼

甜蜜地融化了我 天空之城在哭泣

港岛妹妹 我们曾拥有的甜蜜的爱情

疯狂地撕裂了我 天空之城在哭泣

逼哥在夜话里回答过关于港岛妹妹,是一个朋友从西班牙寄来一张贺卡,贺卡上是个馅饼。

李志曾经在逼逼的艺术人生里写的事情是这样的:上个世纪我在西祠鬼混的时候认识了I,原因是I要找一首歌,正好我手头有,于是I就和我有了联系,夏日炎炎的某天中午I戴着蓝色头巾顶着炙热的风穿过稻田和小卖部找到我的住处,咦,“蓝色头巾”这个词好熟悉啊……后来在我的房间,我们做了一些装逼的交流,主要是我在装逼。因为事先在西祠我已经见识了I小姐的才华和学识。不瞒您说,就我认识的无数女性中,要说才华和学识,还真没有一个能超越I小姐的——尽管I把超男和肥皂电视剧当心头肉。那天短暂的见面I小姐保持她一贯的典雅作风,笑不露齿,不笑也不露齿。

这是开头,结尾是前些天我刚把一个月的工资打入I指定账户,从而结束了我们之间长达一年的债务关系。说来惭愧,这欠款是为我侄子买钢琴而借的。完事之后我给I发去短信说,以后在你面前我终于可以抬头了。I则用一贯的语气回我:在我面前你什么时候低过头啊。

和I的再次联系是在去年。再往前就是某年我路过汉口路,看见一个女性面容熟悉。我色迷迷的盯着她从身前到身后,绞尽脑汁想名字,终于在一分钟之后我快步追上,对伊说:我想起来了,我认识你。I一贯的语气说:认识就认识呗,认识我的人可多了。后来I承认当天她没有认出我来。因为我实在是太胖了,同时那天距我们之前的一次联系大约已经过了七八年。

再回到上个世纪吧,I在G大学历史系,我在鬼混。操,烦的一笔。我直接说了,G大学就是南京大学!!!是我较鄙视的大学之一。

在早期的交往中我对I没什么要死要活的心仪,更多的是仰慕其才华和学识。尤其是有一次我用麻袋装着几块在我村随处可见的石头送给I做学术研究之用之后。我发现I的领域实在是我全然陌生之地。鄙人有个特点,就是对于那些擅长我不擅长同时我又有兴趣的事务的人非常有兴趣。I是一个很好的例子。但是如果让I看到我说她是例子,她一定会用一贯的口气对我说:你才是例子,你全家都是例子。

这短短的一段我居然用了三次“才华和学识”。诶,书到用时方恨少啊。要是I写,她肯定可以用不同词句来描述。这就是I的才华和学识!

刚认识那会我对I说,十年后鄙人会是中国最好的吉他手。对此I不置可否的典雅着微笑,这种微笑让我感到紧张和害臊。你看,时间很快就过去了,现在大家知道李逼是个蹩脚的吉他手。他把原本属于练琴的时间投入到了伟大的射精事业中。当然,就算他是天阉之人,就算他一日廿小时的不停练习也成不了伟大的吉他手。因为他没有天赋。

现在我已经想不起来和I是怎么失去联系的了。但十年后再次收到I的邮件时,我一眼就看了出来。我们用邮件聊了不少天。I在这十年里行走正常:念完本科念硕士,念完硕士念博士。虽然江湖都称女博士为灭绝师太,但I肯定是个例外。十年前I是典雅清纯的,十年后I是典雅知性的。

一个长期和古典文学打交道的人和一个长期和泡妞射精打交道的人搅合在一起,这感觉很奇妙。我们之所以有交集是因为在骨子里I有奔放的一面,我有文艺的一面。

我在I的宿舍里住过三天。她有一个面朝大海的阳台,飞机不停的从校园上空飞过,黄昏时经常下雨。回来后我写了一首歌。我们还去过一个岛屿,我们吃过芒果冰,我们做爱很少戴套。我一直怀疑她偷偷的流产过,但I坚决否认。我们冲动的决定谈恋爱,然后很快我又冲动的终止了恋爱。她去意大利帮我看了圣西罗球场,她在普林斯顿给我拍了很多照片,她从罗浮宫给我寄来彩色的明星片,她跑到天河城只为了和我喝杯咖啡,她做了我喜欢吃的红烧肉,结束的时候她又一个人默默承受。

我呢,除了精液似乎什么都没留下。

对于I我是忏悔的。对于I我的内心非常纠葛。我曾经幻想着我在沙发上看书,她在做家务,有个孩子在弹钢琴。我曾经幻想过婚姻,我曾经幻想过郊游,而这一些在今天看来只是可笑和卑鄙的故事。

我和I的父亲通过电话,这是唯一一次和女性朋友的家人说话。电话的缘由是他写了首歌,和我探讨一下编曲录音。事后I和我说她父亲对我印象不错,我也对他印象也挺好。

我和I之间断断续续的若即若离的关系导致我找不到一个书写I的好办法。时间错综复杂,事件隐隐约约。I用藏珠于渊来表达她的心情。

我呢?我相信如果以后的生活或者人们说的来世存在报应的话,那里面一定有I的一份——就算我再次对神明的娜姐发誓我爱过I。

如何提高Android Studio构建速度

Tips:
自从切换到AS开发安卓应用以来,一直被AS蜗牛般的构建速度困扰着,特别是在构建大型项目的时候如果构建变种很多的话,速度更是慢的够呛,所以最近研究一下如何提高编译速度,在网上找到这样一篇文章,供大家参考。

文章来源:

  1. 优化您的构建速度 | Android Developers
  2. 几个小改动,将Android 构建速度提升10倍以上!

下面提取文章重点,以做备忘。
在我们谈论优化措施之前,我们先来看看优化之前项目的build性能

1
2
gradlew clean //执行干净构建
gradlew --profile --recompile-scripts --offline --rerun-tasks assembleFlavorDebug

  • profile:启用分析。
  • recompile-scripts:在绕过缓存时强制重新编译脚本。
  • offline:禁止 Gradle 提取在线依赖项。这样可以确保 Gradle 在尝试更新依赖项时引起的任何延迟都不会干扰您的分析数据。您应当已将项目构建一次,以便确保 Gradle 已经下载和缓存您的依赖项。
  • rerun-tasks:强制 Gradle 重新运行所有任务并忽略任何任务优化。
    我们使用这个命令执行full-build(从头创建)的过程,来衡量build的性能。

    优化您的构建配置

    按照下面的提示操作,提升您的 Android Studio 项目的构建速度。

    保持工具处于最新状态

    Android 工具几乎在每一次更新中都会获得构建优化和新功能,本页介绍的一些提示假设您正在使用最新版本。要充分利用最新优化,请保持以下工具处于最新状态.

    避免Legacy Multidex

    Google针对64k方法数的问题推出了MultiDex的解决方法,但是不同的api版本上,multidex的做法是不一样的,在api21以上,因为Android采用了新的运行时ART,会在安装的时候将所有的classesN.dex合并成一个.oat包。你需要做的就是在编译脚本中加一行 multiDexEnabled true。但是在api以下,你需要引入multidex support library. 而且在编译过程中,编译脚本要话很长时间决定哪些class要放入primary dex中,哪些放入secondary dex中。在api21以下,这叫做legacy multidex。

查看更多

Linux常用命令整理

Yum

  1. 如何配置Yum代理
    1
    2
    3
    vim /etc/yum.conf
    # 添加如下:
    proxy=http://10.1.65.6:1080/

lftp

1
lftp -u username,password -p 21 -e "mirror --only-newer --delete lydj /data/file/;quit;" ftpadmin@ip

作用介绍:
从文件服务器lydj目录中递归下载文件到本地/data/file目录中,并且只下载最新的,对于服务器不存在的问题在本地也删除。

ntpdate

1
2
安装ntpdate
yum install ntpdate -y

作用介绍:
用于linux时钟同步。

1
2
3
4
5
6
# 同步网络时间
ntpdate 172.31.1.1
# 同步时间成功后调整硬件时间
hwclock -w//
#date 查看当前系统时间
#hwclock 查看硬件时间

1
2
# 没间隔1个小时同步一下网络时间
* */1 * * * root ntpdate 172.31.1.1;hwclock -w

timedatectl

1
2
# 修改时区为东八区
timedatectl set-timezone Asia/Shanghai

在Centos7上安装docker

安装docker

参照官方网址:
https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-ce

docker支持多种安装方式,我这里是用了最常见的安装方式yum进行安装。
Install using the repository

SET UP THE REPOSITORY(配置)
  1. 安装所需依赖Install required packages

    1
    2
    3
    sudo yum install -y yum-utils \
    device-mapper-persistent-data \
    lvm2
  2. 使用稳定的docker yum 源

    1
    2
    3
    sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
安装docker
  1. 安装最新版本的docker

    1
    sudo yum install docker-ce
  2. 启动docker

    1
    sudo systemctl start docker
  3. 检测docker是否正确安装

    1
    sudo docker run hello-world
使用docker加载本地镜像

如果你的镜像没有发不到仓库上,可以通过docker的加载本地镜像来加载。

1
docker load --input docker_image_ezb_20180302.tar

导出镜像
1
sudo docker save -o xxx.tar xxx ## xxx 镜像名称
通过已有镜像创建新的镜像
  1. 编写Dockerfile

    1
    2
    3
    4
    5
    #使用 # 来注释
    # FROM 指令告诉 Docker 使用哪个镜像作为基础
    FROM xxx ## 镜像名称
    COPY catalina.sh /tomcat/bin/ ## 拷贝本地文件到容器文件
    CMD ["/run.sh"] ## 容器启动的时候运行的脚本
  2. 通过名称生成镜像文件

    1
    docker build -t tomcat . ## tomcat是镜像的名称

完成生成镜像。

通过容器生成镜像
1
2
docker commit 58bdddf92a57 spdk/jdk8
docker commit 容器id 新生成的镜像名称
查看容器日志
1
docker logs --tail 0 -f xxx(容器名称)

星云链Nas开发笔记

学习资料

  • 官方教程

手把手教你星云DApp开发(第一部分)

手把手教你星云DApp开发(第二部分)

nebPay 介绍

NAS星云链DAPP开发之宠物养成游戏

  • 开源成熟网站
  1. 面试经历网
    网站地址: https://duanyugit.github.io/interview/index.html
    github地址:
    https://github.com/duanyuGit/interview
    合约地址:
    https://explorer.nebulas.io/#/address/n1uqMB4GSXudXCp5KuMo3LxbgvoNTHJSYiw

我的星云

查看gate io 钱包nas数量
https://explorer.nebulas.io/#/address/n1dnerPW8iQRgu5mCcwHeJVaQaxdigaCyAX

查看本地钱包 nas数量
https://explorer.nebulas.io/#/address/n1Z1WRfKxRV3Hae4emF43m8J3GgDKn51PUZ

使用bitnami-gitlab一体包搭建git代码服务器

最近git代码服务器IP变了,需要修改git远程地址的访问ip,以前用gitlab搭建过git服务器,不过时间有点久远了,也没记录下来,这里在这里整理一下gitlab的使用方法,以备后续查找使用。

修改gitlab项目的ip地址
1
2
3
4
vim /etc/gitlab/gitlab.rb

修改为如下:
external_url 'https://192.168.1.113'

重启Gitlab

1
gitlab-ctl restart

完成。

Android Studio 3.0 Annotation processors Error

升级到Android Studio 3.0之后,当编译项目的时候,如果项目使饮用了Lombok和Butterknifeh这两个开源项目,你就会发现在编译过程中发生以下错误:

1
2
3
4
5
Error:Execution failed for task ':Base:javaPreCompileDebug'.
> Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration.
- butterknife-7.0.1.jar (com.jakewharton:butterknife:7.0.1)
Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior. Note that this option is deprecated and will be removed in the future.
See https://developer.android.com/r/tools/annotation-processor-error-message.html for more details.

错误日志已经告诉我们了,在Android Studio 3.0 之后 annotationProcessor必须由我们开发者显示声明了,添加annotationProcessor之后即可解决此问题。

1
2
compile 'com.jakewharton:butterknife:7.0.1'
annotationProcessor 'com.jakewharton:butterknife:7.0.1'

参考链接:

Android开发中如何匹配各种layout资源(layout-sw480dp layout-sw600dp)

在做安卓开发过程中,经常会遇到需要适配各种奇形怪状的屏幕的情况,例如下面这位大哥:


宽:67.5cm
高:120cm
但是他的实际像素才1080(w)x1872(h),density:1.0,densityDpi:160。
在这种情况下我们知道应该用values-sw600dp这种类型的文件夹存放这种屏幕的资源,但是如何确认屏幕应该用什么样尺寸的文件夹呢,也就是应该如何确认是600,还是700,还是480呢?
这里有一个算法:

sw-xxxx-dp的计算公式是 xxxx = sw *160/dpi

其中sw为屏幕分辨率中最小的那个值。在这里就是1080
dpi为屏幕密度,在这里就是160 。 也可以用如下方式获取:

1
adb shell getprop ro.sf.lcd_density

所以这个屏幕所使用的最小宽度应该为:1080 * 160 / 160 = 1080,也就是sw-1080dp。

提供一个获取安卓设备信息的开源项目:

https://github.com/menny/android-device-info

下面是一些常用范例:

参考资料: