android毛玻璃
1. 如何评价一加3发布的基于Android 7.0的氢OS
氢OS:离开CM/Color OS后如何用的爽?王建 2015-05-29 一加 氢OS 用的爽 访问:17055分享到 刘作虎说:想了解我个人喜好的可以看一下氢系统,里面都是我喜欢的。 相信对于一个认真做智能手机的品牌来说,系统UI这个占据旗下手机核心竞争力的一部分,是没有谁愿意将其托付于他人之手的。所以在时隔一加手机发布400天之后,刘作虎再次登台发布了一个他喜欢的,也认为将是用户喜欢的自家定制系统——氢OS,简单合理地解决了没有自家系统的尴尬。这也是一加在"手感爽“之后再次提出了一个“用着爽”。 刘作虎认为目前多数安卓定制系统都进入了一个“iOS化”的误区,无论是“四海皆准”的圆角矩形图标,还是毛玻璃效果,再到删除LOGO时的抖动效果,很多厂商都是在安卓的基础上努力构建一个近似iOS的模样。iOS固然出色,但是也背离了安卓系统本身,所以氢OS的设计方向将绝不“iOS化”。 那它是什么样的? 界面设计 也许为了让在场观众能够深刻理解氢OS的设计与高雅艺术是有着何等同源的关系,台上从西班牙归来的产品经理花了大量的时间讲述了氢OS设计的艺术源头。但是就小编个人的感觉而言,在场的观众多数只是感受到了产品经理想要阐述氢OS很漂亮的意思。 氢OS 氢OS的确很漂亮。相对于一些其他的国产安卓定制系统来说,氢OS的设计风格与它所基于的安卓5.0还是有着较高的吻合度的。而对于设计理念而言,一加称之为“氢表达”. 虽然氢OS产品经理在阐述设计理念时表示“单纯地用拟物或是扁平来形容一个手机OS显然是不够的”,从展示的图标上来看,氢OS的图标风格还是比较扁平化的,线条形状颜色比较简洁明亮,近似于原生安卓的感觉。同时作为反抗“iOS化”的一部分,氢OS将图标设计成写实风格,功能表现十分明显。 氢视窗——33%的自由 氢OS 针对虎哥苦恼的,不能用在桌面上看到完整照片的问题,氢OS给出的答案是33%的自由,也就是位于屏幕上方的氢视窗。用户可以在这里使用自己喜欢的图片作为氢视窗的背景,而桌面的整体背景也将会随着这张图片而深化到全局。 氢OS的联系人界面的联系人首字母显示经过设计后呈现出的是一种非常别致的效果,同时每个首字母的显示都有八种配色。而另一个非常贴心的设计是,在通讯录界面点击一位联系人之后,首先是相对主要的信息显示在屏幕下方手指可轻易触及的位置,向上滑动后再显示完整信息。 而要让刘作虎挑选一个他最喜欢的氢OS界面,他一定会选择关机界面。首先是屏幕顶部显示渐变黑色,并只有关机一个按钮。而在下拉将黑色渲染至整个屏幕时,关机图标将逐渐消失,手机关机。而刘作虎为了让整体关机效果有一种近似于关灯睡觉的安静感,甚至去掉了常见的重启按键。 氢OS的时钟界面,三个圆形的表盘分别代表着本地时间和用户设置的世界时间,白与黑则代表着昼与夜。这也是刘作虎特别喜欢的一个界面设计。 交互/功能 氢OS认为滑动是比点击更自然也更优雅的一种操作方式,而这种理念也贯穿在氢OS的设计之中。在下拉通知中心的设计上,氢OS与常规的安卓系统别无二致,不过在此下滑之后没下拉菜单的通知内容就会下滑到拇指可以轻易够到的位置,操作更加直观。奥,对了,双击Home键也能打开下拉通知中心。 作为智能手机的系统,大量的APP在提供方便之余也造成了一定的麻烦,所有有了桌面上的文件夹将它们整理起来。而在氢OS里,文件夹又有了一定的创新。首先氢OS打开的文件夹是出现在屏幕的下半部分,更具创新性的是,在文件夹打开界面左右滑动即可实现文件夹之间的切换。 高效通知 对于无聊短信与轰炸般的APP通知,人们已经经受了太多的折磨,而氢OS又提出了另一种解决方式。卡片式短信和通知降噪。 在氢OS里,枯燥无聊的通知短信可以转化为更加生动直观的卡片式,并继续点击可以实现更多的功能。同时,这些飞机票、火车票、团购券、电影券、代金券、验证码等等,变成“卡片式短信”后都会整合到氢视窗中。但是从发布会的情况来看,这项设计目前还只能支持部分与一加达成合作的服务商,不过可以相信的合作的范围会在将来逐渐扩大。 另一个通知降噪则是将简单的允许关闭逻辑转变为将重要和想看的APP通知设置优先级,优先区域里的App通知会以统一的数字形式提醒,非优先区域App则不会被通知。 最后,氢OS将允许用户进行Root,并且刷机后仍然提供保修。 当然,目前在发布会上展示的氢OS还仅限于基本设计风格和特色功能上,尚不足以对氢OS的整体做任何,但是它不是已经让你很好奇,甚至是很期待了吗?
2. oppo和vivo哪个牌子好用
OPPO的摄像头技术更好,特别适合女孩子,美颜技术也非常不错,拍出的照片更加好看。
极致美颜是一种基于OPPO手机硬件的专属软件技术。当用户在使用OPPO手机自拍时,OPPO手机会自动识别用户的脸部,并智能分析出相应的年龄,给出相应合适的美肤效果。
极致美颜由OPPO于2012年始独自开发,从OPPOU701极致美颜,到OPPON3的极致美颜3.0,再到R9系列的极致美颜4.0,极致美颜已经更新了4个版本,OPPO一直坚持将最好的自拍硬件与最好的自拍软件相结合,手机自拍潮流。
(2)android毛玻璃扩展阅读:
企业文化:
在企业内部强调“本分”的核心价值观,“本分”包括五个层面。
第一层:“隔离外在的压力和诱惑,保持平常心态,回归事物的本源,把握住我们应该做的合理方向”。
第二层:本分要求敢于质疑,敢于挑战,通过批判性思考,抓住事物的本质。
第三层:“本分是要求自己而不是要求别人,当出现问题时,首先求责于己”。
第四层:“本分规范了与人合作的态度,我不赚人便宜”。
第五层:“本分高于诚信,即使没有承诺,本来应该做的事情也要做到。”
CEO陈明永称“我们身处一个充满压力、诱惑与挑战的时代,容易被情绪左右,产生恐惧、烦躁与不安,进而做出错误的判断。如果我们能隔离外力,始终保持本分的心态,回归事物的本源,想想当初我们为什么出发?这样处理问题的方式会变得更清晰。
3. android app开发中常用到哪些开源框架
在前面的课程中,随着对Android体系的了解,已经可以进行正常的Android应用开发了。在Android开发中,同其他工程开发一样,也经常使用一些提高效率的框架,本文我们做一个对比。这些框架,既包括:网络请求框架、也包括图片加载库框架、还包括数据库操作等一些框架,总之,了解和熟悉这些框架,会对自己的开发效率有很大的提升和帮助。
网络请求框架
1、okHttp
在前文的学习中,我们已经了解过okHttp,是一个常用的网络加载库。
2、Retrofit
介绍
Retrofit是一个很不错的网络请求库,该库是square开源的另外一个库,之前的okhttp也是该公司开源的。
Retrofit是基于OkHttp封装的RESTful网络请求框架,使用注解的方式配置请求。优点是速度快,使用注解,callback函数返回结果自动包装成java对象。官方自己的介绍说:
A type-safe REST client for Android and Java
该网络框架在github上的地址如下:https://square.github.io/retrofit/
要求
Retrofit支持的http方式方式包括 GET/POST/PUT/DELETE/HEAD/PATCH,Retrofit要求Java的版本是1.8+,Android应用的API版本应该在21+。
依赖
使用Retrofit库,和其他库一样,首先需要设置依赖,依然是在build.gradle文件中设置依赖:
//添加retrofit库依赖
implementation ‘com.squareup.retrofit2:retrofit:2.1.0’
//添加gson转换器
implementation ‘com.squareup.retrofit2:converter-gson:2.1.0’
使用
通过一个例子,我们可以来演示该框架的使用步骤:
1、定义请求接口,即程序中都需要什么请求操作
public interface HttpServices {
/**
获取头条新闻
@param type 新闻类型
@param key apiKey
@return
*/
@GET(“toutiao/index”)
Call getNewsList(@Query(“type”) String type, @Query(“key”) String key);
}
2、实例化Retrofit对象,使用的Builder的模式创建,如下代码所示:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constants.BASE_API)
.addConverterFactory(GsonConverterFactory.create())
.build();
注意,这里设置结构体转换器,是可以直接把网络请求回来的数据转换为Java结构体,这里设置的Gson解析器,因此要引入相应的转换器支持库。
3、得到接口对象,自己创建的全局的接口对象,并调用相应的接口,得到一个类似于请求Call对象。如下所示:
HttpServices httpServices = retrofit.create(HttpServices.class);
Call newsListCall = httpServices.getNewsList(“top”, Constants.API_KEY);
4、加入到请求队列中,并设置回调方法:
newsListCall.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
//网络请求成功的回调方法
List list = Arrays.asList(response.body().result.data);
Log.i(“TAG”, “请求成功:” + String.valueOf(list.size()));
NewListAdapter adapter = new NewListAdapter(RetrofitActivity.this);
adapter.setmData(list);
mRecyclerView.setAdapter(adapter);
}
@Override
public void onFailure(Call call, Throwable throwable) {
//网络请求失败的回调方法
Log.i(“TAG”, “请求失败:” + throwable.getMessage());
}
});
其他界面操作和之前的Android中的内容一致。
3、RxJava
简单来说,用来处理事件和异步任务,在很多语言上都有实现,RxJava是Rx在Java上的实现。
原理
RxJava最基本的原理是基于观察者模式来实现的。通过Obserable和Observer的机制,实现所谓响应式的编程体验。
特点
RxJava在编程中的实现就是一种链式调用,做了哪些操作,谁在前谁在后非常直观,逻辑清晰,代码维护起来非常轻松。
RxJava也是一个在github上的库,githubhttp://www.xingkongmj.com/news/id/62.html地址如下:https://github.com/ReactiveX/RxJava
基于此,还有一个RxAndroid,github地址如下:https://github.com/ReactiveX/RxAndroid
RxJava和RxAndroid的关系
RxAndroid是RxJava的一个针对Android平台的扩展,主要用于 Android 开发。
基本概念
RxJava 有四个基本概念:
Observable:可观察者,即被观察者Observer:观察者subscribe:订阅事件
这四个概念之间的逻辑关系是:Observable和Observer通过subscribe方法实现订阅关系,从而Observable可以在需要的时候发出事件来通知Observer。
事件
RxJava 的事件回调方法主要包含以下几个:
onNext:普通的事件onCompletedhttp://dachang.net/432717.html:事件队列完结。RxJava 不仅把每个事件单独处理,还会把它们看做一个队列。RxJava 规定,当不会再有新的 onNext 发出时,需要触发 onCompleted 方法作为标志。:事件队列异常。在事件处理过程中出异常时, 会被触发,同时队列自动终止,不再允许再有事件发出。在一个正确运行的事件序列中, onCompleted和 有且只有一个,并且是事件序列中的最后一个。需要注意的是,onCompleted() 和 () 二者也是互斥的,即在队列中调用了其中一个,就不应该再调用另一个。
数据库操作框架
在开发时,本地数据库可以起到缓存数据和存储业务数据的作用,随着技术的成熟,不断推出了有很多关于数据库的操作框架。比较常见的数据库操作框架有诸如:GreenDao,OrmLite 和 ActiveAndroid,DBFlow等。
GreenDAO
GreenDAO是一个开源的 Android ORM(“对象/关系映射”),通过 ORM(称为“对象/关系映射”),在我们数据库开发过程中节省了开发时间!
GreenDao的官方文档地址如下:http://www.xingkongmj.com/news/id/63.html
GreenDao的作用
通过 GreenDao,我们可以更快速的操作数据库,我们可以使用简单的面相对象的API来存储,更新,删除和查询 Java 对象。这款数据库操作框架的特点是:
高性能,在官方的统计数据中,GreenDao在GreenDao,OrmLite 和 ActiveAndroid三个框架中,读、写、更新操作效率均表现第一。易于使用的强大 API,涵盖关系和连接。内存消耗较小。安全:greenDAO 支持 sqlCipherhttp://www.xingkongmj.com/news/id/64.html,以确保用户的数据安全;
核心概念
GreenDao 的核心类有三个:分别是:
DaoMaster:保存数据库对象(SQLiteDatabase)并管理特定模式的 DAO 类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类 OpenHelper 和DevOpenHelper 是 SQLiteOpenHelper 实现,它们在 SQLite 数据库中创建模式。DaoSession:管理特定模式的所有可用 DAO 对象,您可以使用其中一个getter方法获取该对象。DaoSession 还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。XXXDao:数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO 生成DAO。它具有比 DaoSession 更多的持久性方法。Entities:可持久化对象。通常, 实体对象代表一个数据库行使用标准 Java 属性(如一个POJO 或 JavaBean )。
使用
按照官方的文档和github上的说明可以实现green的使用。
首先进行的是依赖,对于greenDao,有两个地方需要设置,分别是项目根目录中的 build.gradle,还有mole中的build.gradle。
classpath ‘org.greenrobot:green-gradle-plugin:3.3.0’ // add plugin
在项目根目录中的build.gradle目录中写这句话的意思是添加greenDao的插件。
在项目mole中的build.gradle中也需要进行配置,有两个地方需要设置,如下图所示:
apply plugin: ‘org.greenrobot.greenhttp://www.xingkongmj.com/news/id/66.html’ //开头加入该代码
dependences{
implementation ‘org.greenrobot:green:3.2.0’
}
然后就可以使用了。
bean实体
可以在项目中创建自己业务需要的实体类,并通过注解来设置是实体类,字段约束等内容。然后点击Android Studio中的Make mole,即可自动生成XXXDao代码,以此来方便开发者的操作。生成的XXXDao类,不可修改和编辑,是自动生成的。
ORMLite
ORMLite框架是另外一款Android开发中可以使用的数据库操作框架。该框架的文档地址如下:https://ormlite.com/sqlite_java_android_orm.shtml
该框架的文档准备的不是特别友好,此处不再赘述。
总结,所有的框架原理几乎都相差不大,只是操作有所差异。
视图注入框架
在Android项目开发过程中,有太多的页面需要布局完成,同时在代码中需要些大量的findviewbyid的操作,来实现控件的解析。于是就有人想能否轻松一些,解放双手节省时间,干一些其他有意义的事情,于是ButterKnife就来了。
ButterKnife是一个专注于Android系统的View注入框架,可以减少大量的findViewById以及setOnClickListener代码,可视化一键生成。
该项目在github上的地址如下:http://www.xingkongmj.com/news/id/65.html
这个框架的优势也非常明显:
强大的View绑定和Click事件处理功能,简化代码,提升开发效率方便的处理Adapter里的ViewHolder绑定问题运行时不会影响APP效率,使用配置方便代码清晰,可读性强
使用
首先是设置依赖,在build.gradlehttp://dachang.net/432714.html中进行依赖设置:
implementation ‘com.jakewharton:butterknife:10.2.1’
annotationProcessor ‘com.jakewharton:butterknife-compiler:10.2.1’
需要注意,该框架要求Java环境1.8版本以上,SDK版本在26以上,因此在使用到的mole中的build.graldle文件中,还必须添加如下代码配置:
apply plugin: ‘com.jakewharton.butterknife’
android{
//…
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
//…
}
另外,还必须在项目根目录中的build.gradle文件中,添加该框架的插件,如下图所示:
dependences{
classpath ‘com.jakewharton:butterknife-gradle-plugin:10.2.1’
}
然后即可在代码中进行使用了。
在使用该框架的页面进行绑定诸如,如下所示代码:
ButterKnife.bind( this) ;
主要的功能
@BindView():控件id 注解,解放双手,不用再每个控件都写一遍findviewById@BindViews():多个控件id 的注解,括号内使用花括号包括多个id即可,中间用,分割开在Fragment中使用,绑定Fragment。@BindString():绑定字符串@BindArray:绑定数组@BindBitmap:绑定bitmap资源@OnClick、@OnLongClick:绑定点击事件和长按事件…还有很多
插件安装
如果是页面很复杂,一个一个写BindView也很费劲,在Android Studio中,可以安装一个ButterKnife的插件,安装该插件后,可以在Studio中直接将对应的布局中的所有控件均给自动生成。
注意,在进行自动生成时,鼠标要放在布局文件上。
注意事项
ButterKnife框架在使用时,要求的版本比较高,包括Java的版本也有限制。因此,如果计划在项目中使用,要提前做好预备工作,以防止对已有项目和业务带来不必要的麻烦,反而影响工作进度。
4. 有谁做过android背景毛玻璃效果(类似小米桌面点开文件夹效果)
嗨!
这个你可以到MIUI论坛跟开发者交流下,
我觉得这个应该是动画效果
而且最新的安卓4.4原生已经支持了
5. 谁说Android没有好的对话框
我,怎么样
6. 如何评价一加3发布的基于Android 7.0的氢OS
氢OS:离开CM/ColorOS后如何用的爽?王建2015-05-29一加氢OS用的爽访问:17055分享到刘作虎说:想了解我个人喜好的可以看一下氢系统,里面都是我喜欢的。相信对于一个认真做智能手机的品牌来说,系统UI这个占据旗下手机核心竞争力的一部分,是没有谁愿意将其托付于他人之手的。所以在时隔一加手机发布400天之后,刘作虎再次登台发布了一个他喜欢的,也认为将是用户喜欢的自家定制系统——氢OS,简单合理地解决了没有自家系统的尴尬。这也是一加在"手感爽“之后再次提出了一个“用着爽”。刘作虎认为目前多数安卓定制系统都进入了一个“iOS化”的误区,无论是“四海皆准”的圆角矩形图标,还是毛玻璃效果,再到删除LOGO时的抖动效果,很多厂商都是在安卓的基础上努力构建一个近似iOS的模样。iOS固然出色,但是也背离了安卓系统本身,所以氢OS的设计方向将绝不“iOS化”。那它是什么样的?界面设计也许为了让在场观众能够深刻理解氢OS的设计与高雅艺术是有着何等同源的关系,台上从西班牙归来的产品经理花了大量的时间讲述了氢OS设计的艺术源头。但是就小编个人的感觉而言,在场的观众多数只是感受到了产品经理想要阐述氢OS很漂亮的意思。氢OS氢OS的确很漂亮。相对于一些其他的国产安卓定制系统来说,氢OS的设计风格与它所基于的安卓5.0还是有着较高的吻合度的。而对于设计理念而言,一加称之为“氢表达”.虽然氢OS产品经理在阐述设计理念时表示“单纯地用拟物或是扁平来形容一个手机OS显然是不够的”,从展示的图标上来看,氢OS的图标风格还是比较扁平化的,线条形状颜色比较简洁明亮,近似于原生安卓的感觉。同时作为反抗“iOS化”的一部分,氢OS将图标设计成写实风格,功能表现十分明显。氢视窗——33%的自由氢OS针对虎哥苦恼的,不能用在桌面上看到完整照片的问题,氢OS给出的答案是33%的自由,也就是位于屏幕上方的氢视窗。用户可以在这里使用自己喜欢的图片作为氢视窗的背景,而桌面的整体背景也将会随着这张图片而深化到全局。氢OS的联系人界面的联系人首字母显示经过设计后呈现出的是一种非常别致的效果,同时每个首字母的显示都有八种配色。而另一个非常贴心的设计是,在通讯录界面点击一位联系人之后,首先是相对主要的信息显示在屏幕下方手指可轻易触及的位置,向上滑动后再显示完整信息。而要让刘作虎挑选一个他最喜欢的氢OS界面,他一定会选择关机界面。首先是屏幕顶部显示渐变黑色,并只有关机一个按钮。而在下拉将黑色渲染至整个屏幕时,关机图标将逐渐消失,手机关机。而刘作虎为了让整体关机效果有一种近似于关灯睡觉的安静感,甚至去掉了常见的重启按键。氢OS的时钟界面,三个圆形的表盘分别代表着本地时间和用户设置的世界时间,白与黑则代表着昼与夜。这也是刘作虎特别喜欢的一个界面设计。交互/功能氢OS认为滑动是比点击更自然也更优雅的一种操作方式,而这种理念也贯穿在氢OS的设计之中。在下拉通知中心的设计上,氢OS与常规的安卓系统别无二致,不过在此下滑之后没下拉菜单的通知内容就会下滑到拇指可以轻易够到的位置,操作更加直观。奥,对了,双击Home键也能打开下拉通知中心。作为智能手机的系统,大量的APP在提供方便之余也造成了一定的麻烦,所有有了桌面上的文件夹将它们整理起来。而在氢OS里,文件夹又有了一定的创新。首先氢OS打开的文件夹是出现在屏幕的下半部分,更具创新性的是,在文件夹打开界面左右滑动即可实现文件夹之间的切换。高效通知对于无聊短信与轰炸般的APP通知,人们已经经受了太多的折磨,而氢OS又提出了另一种解决方式。卡片式短信和通知降噪。在氢OS里,枯燥无聊的通知短信可以转化为更加生动直观的卡片式,并继续点击可以实现的功能。同时,这些飞机票、火车票、团购券、电影券、代金券、验证码等等,变成“卡片式短信”后都会整合到氢视窗中。但是从发布会的情况来看,这项设计目前还只能支持部分与一加达成合作的服务商,不过可以相信的合作的范围会在将来逐渐扩大。另一个通知降噪则是将简单的允许关闭逻辑转变为将重要和想看的APP通知设置优先级,优先区域里的App通知会以统一的数字形式提醒,非优先区域App则不会被通知。最后,氢OS将允许用户进行Root,并且刷机后仍然提供保修。当然,目前在发布会上展示的氢OS还仅限于基本设计风格和特色功能上,尚不足以对氢OS的整体做任何,但是它不是已经让你很好奇,甚至是很期待了吗?
7. android glide 怎么设置只有一个圆角
附录1简单介绍了android开源的图片加载框架。在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide在加载过程中就把矩形图转换成圆形的,则需要在Glide之上引入一个开源项目:glide-transformations
glide-transformations在github上的项目主页是:https://github.com/wasabeef/glide-transformations
写一个例子说明。
[java] view plain
package zhangphil.app;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import jp.wasabeef.glide.transformations.BlurTransformation;
import jp.wasabeef.glide.transformations.CropCircleTransformation;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
public class MainActivity extends AppCompatActivity {
//我csdn博客头像
String url = "http://avatar.csdn.net/9/7/A/1_zhangphil.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//原图,是我博客的头像
ImageView image1 = (ImageView) findViewById(R.id.image1);
Glide.with(this).load(url).crossFade(1000).into(image1);
//原图 -> 圆图
ImageView image2 = (ImageView) findViewById(R.id.image2);
Glide.with(this).load(url).bitmapTransform(new CropCircleTransformation(this)).crossFade(1000).into(image2);
//原图的毛玻璃、高斯模糊效果
ImageView image3 = (ImageView) findViewById(R.id.image3);
Glide.with(this).load(url).bitmapTransform(new BlurTransformation(this, 25)).crossFade(1000).into(image3);
//原图基础上复合变换成圆图 +毛玻璃(高斯模糊)
ImageView image4 = (ImageView) findViewById(R.id.image4);
Glide.with(this).load(url).bitmapTransform(new BlurTransformation(this, 25), new CropCircleTransformation(this)).crossFade(1000).into(image4);
//原图处理成圆角,如果是四周都是圆角则是RoundedCornersTransformation.CornerType.ALL
ImageView image5 = (ImageView) findViewById(R.id.image5);
Glide.with(this).load(url).bitmapTransform(new RoundedCornersTransformation(this, 30, 0, RoundedCornersTransformation.CornerType.BOTTOM)).crossFade(1000).into(image5);
}
}
布局则比较简单,是一个垂直方向的线性布局布局了5个ImageView,不再赘述。
代码运行结果。
附录:
1,《Android图片加载与缓存开源框架:Android Glide》链接:http://blog.csdn.net/zhangphil/article/details/45535693
8. android 实现毛玻璃透明效果有几种方法
1、如果系统的api在16以上,可以使用系统提供的方法直接处理图片
复制代码代码如下:
if (VERSION.SDK_INT > 16) {
Bitmap bitmap = sentBitmap.(sentBitmap.getConfig(), true);
final RenderScript rs = RenderScript.create(context);
final Allocation input = Allocation.createFromBitmap(rs, sentBitmap, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(radius /* e.g. 3.f */);
script.setInput(input);
script.forEach(output);
output.To(bitmap);
return bitmap;
}
2、 如果Api条件不满足,可以使用如下方法
复制代码代码如下:
@SuppressLint("NewApi")
public static Bitmap fastblur(Context context, Bitmap sentBitmap, int radius) {
Bitmap bitmap = sentBitmap.(sentBitmap.getConfig(), true);
if (radius < 1) {
return (null);
}
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int[] pix = new int[w * h];
// Log.e("pix", w + " " + h + " " + pix.length);
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int wm = w - 1;
int hm = h - 1;
int wh = w * h;
int div = radius + radius + 1;
int r[] = new int[wh];
int g[] = new int[wh];
int b[] = new int[wh];
int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
int vmin[] = new int[Math.max(w, h)];
int divsum = (div + 1) >> 1;
divsum *= divsum;
int temp = 256 * divsum;
int dv[] = new int[temp];
for (i = 0; i < temp; i++) {
dv[i] = (i / divsum);
}
yw = yi = 0;
int[][] stack = new int[div][3];
int stackpointer;
int stackstart;
int[] sir;
int rbs;
int r1 = radius + 1;
int routsum, goutsum, boutsum;
int rinsum, ginsum, binsum;
for (y = 0; y < h; y++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
for (i = -radius; i <= radius; i++) {
p = pix[yi + Math.min(wm, Math.max(i, 0))];
sir = stack[i + radius];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rbs = r1 - Math.abs(i);
rsum += sir[0] * rbs;
gsum += sir[1] * rbs;
bsum += sir[2] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
}
stackpointer = radius;
for (x = 0; x < w; x++) {
r[yi] = dv[rsum];
g[yi] = dv[gsum];
b[yi] = dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (y == 0) {
vmin[x] = Math.min(x + radius + 1, wm);
}
p = pix[yw + vmin[x]];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[(stackpointer) % div];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi++;
}
yw += w;
}
for (x = 0; x < w; x++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
yp = -radius * w;
for (i = -radius; i <= radius; i++) {
yi = Math.max(0, yp) + x;
sir = stack[i + radius];
sir[0] = r[yi];
sir[1] = g[yi];
sir[2] = b[yi];
rbs = r1 - Math.abs(i);
rsum += r[yi] * rbs;
gsum += g[yi] * rbs;
bsum += b[yi] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
if (i < hm) {
yp += w;
}
}
yi = x;
stackpointer = radius;
for (y = 0; y < h; y++) {
// Preserve alpha channel: ( 0xff000000 & pix[yi] )
pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (x == 0) {
vmin[y] = Math.min(y + r1, hm) * w;
}
p = x + vmin[y];
sir[0] = r[p];
sir[1] = g[p];
sir[2] = b[p];
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[stackpointer];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi += w;
}
}
// Log.e("pix", w + " " + h + " " + pix.length);
bitmap.setPixels(pix, 0, w, 0, 0, w, h);
return (bitmap);
}