A. 怎么用shader实现UI的毛玻璃效果
Shader "Custom/WaterBlur" {
Properties {
_blurSizeXY("BlurSizeXY", Range(0,10)) = 2
}
SubShader {
// Draw ourselves after all opaque geometry
Tags { "Queue" = "Transparent" }
// Grab the screen behind the object into _GrabTexture
GrabPass { }
// Render the object with the texture generated above
Pass {
CGPROGRAM
#pragma debug
#pragma vertex vert
#pragma fragment frag
#pragma target 3.0
sampler2D _GrabTexture : register(s0);
float _blurSizeXY;
struct data {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 position : POSITION;
float4 screenPos : TEXCOORD0;
};
v2f vert(data i){
v2f o;
o.position = mul(UNITY_MATRIX_MVP, i.vertex);
o.screenPos = o.position;
return o;
}
half4 frag( v2f i ) : COLOR
{
float2 screenPos = i.screenPos.xy / i.screenPos.w;
float depth= _blurSizeXY*0.0005;
screenPos.x = (screenPos.x + 1) * 0.5;
screenPos.y = 1-(screenPos.y + 1) * 0.5;
half4 sum = half4(0.0h,0.0h,0.0h,0.0h);
sum += tex2D( _GrabTexture, float2(screenPos.x-5.0 * depth, screenPos.y+5.0 * depth)) * 0.025;
sum += tex2D( _GrabTexture, float2(screenPos.x+5.0 * depth, screenPos.y-5.0 * depth)) * 0.025;
sum += tex2D( _GrabTexture, float2(screenPos.x-4.0 * depth, screenPos.y+4.0 * depth)) * 0.05;
sum += tex2D( _GrabTexture, float2(screenPos.x+4.0 * depth, screenPos.y-4.0 * depth)) * 0.05;
sum += tex2D( _GrabTexture, float2(screenPos.x-3.0 * depth, screenPos.y+3.0 * depth)) * 0.09;
sum += tex2D( _GrabTexture, float2(screenPos.x+3.0 * depth, screenPos.y-3.0 * depth)) * 0.09;
sum += tex2D( _GrabTexture, float2(screenPos.x-2.0 * depth, screenPos.y+2.0 * depth)) * 0.12;
sum += tex2D( _GrabTexture, float2(screenPos.x+2.0 * depth, screenPos.y-2.0 * depth)) * 0.12;
sum += tex2D( _GrabTexture, float2(screenPos.x-1.0 * depth, screenPos.y+1.0 * depth)) * 0.15;
sum += tex2D( _GrabTexture, float2(screenPos.x+1.0 * depth, screenPos.y-1.0 * depth)) * 0.15;
sum += tex2D( _GrabTexture, screenPos-5.0 * depth) * 0.025;
sum += tex2D( _GrabTexture, screenPos-4.0 * depth) * 0.05;
sum += tex2D( _GrabTexture, screenPos-3.0 * depth) * 0.09;
sum += tex2D( _GrabTexture, screenPos-2.0 * depth) * 0.12;
sum += tex2D( _GrabTexture, screenPos-1.0 * depth) * 0.15;
sum += tex2D( _GrabTexture, screenPos) * 0.16;
sum += tex2D( _GrabTexture, screenPos+5.0 * depth) * 0.15;
sum += tex2D( _GrabTexture, screenPos+4.0 * depth) * 0.12;
sum += tex2D( _GrabTexture, screenPos+3.0 * depth) * 0.09;
sum += tex2D( _GrabTexture, screenPos+2.0 * depth) * 0.05;
sum += tex2D( _GrabTexture, screenPos+1.0 * depth) * 0.025;
return sum/2;
}
ENDCG
}
}
Fallback Off
}
B. ios开发中怎么实现毛玻璃效果
所谓的毛玻璃效果其实是半透明+模糊,可以用CSSfilter实现。时间不多,就抛个砖,题主可以自己找一下文档和案例。filter-CSSdiv{-moz-filter:blur(5px);-webkit-filter:blur(5px);-o-filter:blur(5px);-ms-filter:blur(5px);filter:blur(5px);}大体思路是,当出现弹出层的时候,对背景层增加blurfilter,再给弹出层的一定透明度就可以了。
C. 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的版本也有限制。因此,如果计划在项目中使用,要提前做好预备工作,以防止对已有项目和业务带来不必要的麻烦,反而影响工作进度。
D. 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);
}
E. 如何评价一加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的整体做任何,但是它不是已经让你很好奇,甚至是很期待了吗?
F. iOS和安卓的UI设计有什么区别
iOS与安卓设计上的差异主要从系统差异、成本考虑、用户习惯3个方面来阐述。
一. 系统差异
1. 物理按键对返回的影响
安卓的物理按键以及屏幕导航按键的差异是安卓的返回键更加方便,
iOS只有home键,随着全屏的出现,可能会打破这种差异。
因此在设计返回操作的时候需要考虑平台的差异性。
安卓比iOS增加了物理返回键、底部导航,有些设备可以隐藏底部导航。
全面屏的普及会慢慢打破这种因为物理按键造成的交互及设计差别,全面屏设计适配是要考虑底部按键的差异。
华为全面屏的几种手势:
安卓全面屏出现后,并没有完全舍弃内置导航按键,还有纯手势、悬浮按钮、内置导航条3种方式。随着硬件的发展,安卓和iOS的交互操作会更加趋同,改变这种差异。
返回浮窗的UI表现:
iOS 手机只有一个“Home ”键,为方便用户退出浮层需要增加了“取消”入口。
而 Android 手机本来就有“返回”虚拟键,所以多做一个“取消”的意义性不大。
2. 屏幕分辨率造成的色调选择
Material Design作为谷歌推出的全新的设计语言,和iOS对比,Material Design更加沉稳,iOS更加鲜艳。原因是因为iOS的屏幕分辨率更高,对鲜艳颜色的还原度更好,安卓适应的机型比较多,颜色还原度没有那么好。
深色模式下考虑到用户长期使用的体验,因iOS的还原度高,背景使用#000000,安卓分辨率的限制,文字颜色较浅,谷歌推荐背景色为#121212。有些平台护眼模式和深色模式用两套,比如网易云音乐。
. 软件更新方式的不同
Android :由于安卓的开源特性,当有新版本时都会提示用户更新,且每个产品内部都带有“版本更新”入口。
更新的方式可分2种:
引导更新:弹出提示让用户更新 APP ,用户点击“更新”按钮前往应用商店更新、或者在当前页面更新并显示下载进度。
强制更新:也是先提示用户更新,只不过用户点击“更新”按钮,即调起软件安装页面。
iOS :而 iOS 端出于对用户体验的考虑,UI设计中IOS和安卓的设计差异是禁止向用户提示版本更新信息的。这也是为什么绝大部分的 iOS 产品,都是没有“版本更新”入口的原因,即使有,点击了也直接跳转到 App Store 查看版本情况。
4. 切图标注
XHDPI对应的是安卓2倍图,XXHDPI对应的是安卓3倍图,iOS的3倍图和安卓的XXHDPI是一样的。
iOS用375*667px做设计,有些也用750*1334px,原因有3点:
①开发同学不用换算,直接采用1倍图就可以
②sketch切图时导出更加方便
③极大提高了视觉还原和其他机型的适配
安卓用1080*1920px做设计,原因有3点:
①从中间尺寸向上和向下适配的时,调整幅度最小,最方便适配
②大屏幕时代依然以小尺寸作为设计尺寸,会限制设计师的设计视角
③用主流尺寸做设计,极大提高视觉还原和机型适配
5. 键盘差异引发的搜索框样式
安卓键盘有些是系统自带的,也有第三方的,例如搜狗输入法,iOS更多是系统自带的键盘。
很多输入法在键盘的右侧加入了更加明显的搜索按键,但为了照顾一些用户的操作习惯,安卓还是把搜索放在了搜索框后面。
二. 成本考虑
1. 开发成本
loading
iOS的loading自定义更加常见、个性化强,安卓很多都是用系统自带的(转圈的那种),主要是考虑开发成本。
TAB样式
2个平台会有特有的控件样式。
安卓系统本身全局actionbar,若去实现其他的样式,会破坏整体的封装,开发成本更高。
iOS系统有自定义的tab切换样式,开发人员只需要更改颜色、圆角,更加方便。
高斯模糊
毛玻璃在iOS比较常见,安卓开发成本高,建议不做这种效果。
2. 商业成本
一般iOS会让用户承担30%的抽成,例如优酷、腾讯的VIP会员价格。
三. 用户习惯
1. 长按侧滑删除
信息列表的侧滑,在iOS中是很常见的操作,但是在安卓更习惯长按,如果改成侧滑删除,会增加用户的理解成本。
2. 图标设计
返回按钮:一般iOS返回不带横线“<”,安卓喜欢带有横线,例如下图,不过有些app会统一用一种。
分享按钮:一把iOS会采用苹果自带的向上的形式,安卓喜欢用三个圈圈(看下图)。
弹窗按钮:有些安卓弹窗上的按钮会遵循系统规则,在右侧这种形式,iOS更喜欢居中。
bar标题位置:安卓上的标题跟随着“返回”,在bar的左侧,iOS会喜欢放在中间。
G. 有谁做过android背景毛玻璃效果(类似小米桌面点开文件夹效果)
嗨!
这个你可以到MIUI论坛跟开发者交流下,
我觉得这个应该是动画效果
而且最新的安卓4.4原生已经支持了
H. 如何实现软件毛玻璃效果
windowsblinds里面有一款毛玻璃的主题,装WIN7前我就用的这个。