1080ti要用多大的电源源可以带动750ti,2g独显?

在Android上实现模糊视图 - 安卓 - 伯乐在线
& 在Android上实现模糊视图
模糊效果可以生动地表现出内容的层次感,能帮助用户着重关注内容。即便在模糊表面下层发生视差效果或者动态改变,也能够保持当前专题内容。
在iOS上,我们首先构造一个UIVisualEffectView得到一类模糊层:
UIVisualEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
UIVisualEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];UIVisualEffectView *visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
之后添加visualEffectView到视图层,在层上可以对其下层进行动态的模糊。
Android中的表现形式
即使在Android上实现这点并非易事,但我们的确在雅虎天气应用中看到了很好的模糊效果实例。然而,根据,这个应用是通过缓存一张预渲染的背景图片来实现图片虚化的。
虽然这种方法非常有效,但其实不符合我们的需求,在应用中,图像通常是获得焦点的内容,而不仅仅提供背景,这说明即便是在模糊层之下,图像的变化也可能很大而且变化迅速。在中就有一个恰当的例子:当用户滑动至下一页时,整排图片会以相反方向淡出,为了组成所需的模糊效果,合理地管理多个预渲染图是很困难的。
一种绘制模糊视图的方法
我们需要的效果是实时地模糊其下层的视图,最终得到的界面很简单,就像是模糊视图的一个blurred view引用。
blurringView.setBlurredView(blurredView);
blurringView.setBlurredView(blurredView);
之后当blurred view改变时,不管是因为内容改变(比如展示一张新的图片)、视图的变换还是加入动画过程,我们都要刷新模糊视图。
blurringView.invalidate();
blurringView.invalidate();
为了实现模糊视图, 我们需要继承View类并重写onDraw()方法来渲染模糊效果。
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// Use the blurred view’s draw() method to draw on a private canvas.
mBlurredView.draw(mBlurringCanvas);
// Blur the bitmap backing the private canvas into mBlurredBitmap
// Draw mBlurredBitmap with transformations on the blurring view’s main canvas.
canvas.save();
canvas.translate(mBlurredView.getX() - getX(), mBlurredView.getY() - getY());
canvas.scale(DOWNSAMPLE_FACTOR, DOWNSAMPLE_FACTOR);
canvas.drawBitmap(mBlurredBitmap, 0, 0, null);
canvas.restore();
12345678910111213141516
protected void onDraw(Canvas canvas) {&&&&super.onDraw(canvas);&&&&&// Use the blurred view’s draw() method to draw on a private canvas.&&&&mBlurredView.draw(mBlurringCanvas);&&&&&// Blur the bitmap backing the private canvas into mBlurredBitmap&&&&blur();&&&&&// Draw mBlurredBitmap with transformations on the blurring view’s main canvas.&&&&canvas.save();&&&&canvas.translate(mBlurredView.getX() - getX(), mBlurredView.getY() - getY());&&&&canvas.scale(DOWNSAMPLE_FACTOR, DOWNSAMPLE_FACTOR);&&&&canvas.drawBitmap(mBlurredBitmap, 0, 0, null);&&&&canvas.restore();}
这里的关键点在于,当模糊视图重绘时,它使用blurred view的draw()方法。模糊视图保持blurred view的引用,而绘制一个私有的、以bitmap为背景的画布。
mBlurredView.draw(mBlurringCanvas);
mBlurredView.draw(mBlurringCanvas);
这种使用另一个视图的draw()方法,也适用于建立放大或者个性的UI界面。其中的内容是扩大的,而不是模糊的。
根据讨论出的想法,我们使用子采样和进行快速绘制,当初始化模糊视图的私有画布mBlurringCanvas时,子采样也随即完成了。
int scaledWidth = mBlurredView.getWidth() / DOWNSAMPLE_FACTOR;
int scaledHeight = mBlurredView.getHeight() / DOWNSAMPLE_FACTOR;
mBitmapToBlur = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
mBlurringCanvas = new Canvas(mBitmapToBlur);
int scaledWidth = mBlurredView.getWidth() / DOWNSAMPLE_FACTOR;int scaledHeight = mBlurredView.getHeight() / DOWNSAMPLE_FACTOR;&mBitmapToBlur = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);mBlurringCanvas = new Canvas(mBitmapToBlur);
通过mBlurringCanvas的 建立与恰当的渲染脚本初始化,重绘时的blur()方法如下:
mBlurInput.copyFrom(mBitmapToBlur);
mBlurScript.setInput(mBlurInput);
mBlurScript.forEach(mBlurOutput);
mBlurOutput.copyTo(mBlurredBitmap);
mBlurInput.copyFrom(mBitmapToBlur);mBlurScript.setInput(mBlurInput);mBlurScript.forEach(mBlurOutput);mBlurOutput.copyTo(mBlurredBitmap);
此时mBlurredBitmap已准备好,剩下的onDraw()方法要做的就是使用适当的变换和缩放,在模糊视图自己的画布上重绘视图。
完整实现blurring view 时,我们需要注意几个技术点。第一,我们发现缩放因子8,模糊半径15能很好地满足我们的目标,但满足你需求的参数可能是不同的。
第二,在模糊的bitmap边缘会遇到一些渲染脚本效果,我们将缩放的宽度和高度进行了圆角化,直到最近的4的倍数。
// The rounding-off here is for suppressing RenderScript artifacts at the edge.
scaledWidth = scaledWidth - (scaledWidth % 4) + 4;
scaledHeight = scaledHeight - (scaledHeight % 4) + 4;
// The rounding-off here is for suppressing RenderScript artifacts at the edge.scaledWidth = scaledWidth - (scaledWidth % 4) + 4;scaledHeight = scaledHeight - (scaledHeight % 4) + 4;
第三,为了保证更好的表现效果,我们新建两个bitmap对象,mBitmapToBlur和mBlurredBitmap,mBitmapToBlur位于私有画布mBlurringCanvas之下,mBlurredBitmap仅当blurred view的大小变化时才重新建立他们;同样地当blurred view的大小改变时,我们才创建渲染脚本对象mBlurInput和mBlurOutput。
第四,我们以PorterDuff.Mode.OVERLAY模式绘制一个白色半透明的层,它处在被模糊的的图片上层,用来处理设计需求中的淡化。
最后,由于RenderScript(渲染脚本)至少在API 17以上才可用,所以我们需要兼容Android的旧版本。糟糕的是,中提到的Java bitmap的模糊方案,当恰当地预渲染缓存副本时,对于实时渲染不够迅速,我们决定使用一个半透明的view来应对。(更新于日:通过使用库,我的解决方法能在更低版本的API中运行。下面提及的库和Demo都更新了,非常感谢GitHub上的小伙伴告诉我这点)
优点和缺点
我们喜欢这个视图的绘制方法,因为它可以实时模糊并且容易使用,使得blurred view的内容,也在blurring view和blurred view中间保证了灵活性,最重要的是它满足了我们的需求。
然而,这个方法确实使得blurring view与适当协同变换的blurred view保持了私有联系。相应地,模糊视图必须不能是blurred view的子类,否则会因为互相调用造成栈溢出。简单有效处理此限制的方法是要保证模糊视图与blurred view在同一级,并且Z轴上blurred view在blurring view之前。
另一点需要注意的限制是,由于与矢量图形和文本有关,我们使用默认的bitmap削减采样表现效果不是很好。
库文件和示例
你可以在上看到解决方法,我们也把开源的库文件连同一个示例分享到了上,它能够展示内容变换、动画和视图变换。
关于作者:
可能感兴趣的话题
关于安卓频道
安卓频道分享Android开发文章,精选工具和安卓相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线Android如何实现毛玻璃效果之Android高级模糊技术 - loonggg - 博客园
随笔 - 154, 文章 - 0, 评论 - 137, 引用 - 0
自从iOS系统引入了Blur效果,也就是所谓的毛玻璃、模糊化效果,磨砂效果,各大系统就开始竞相模仿,这是怎样的一个效果呢,我们先来看一下,如下面的图片:
效果我们知道了,如何在Android中实现呢,说白了就是对图片进行模糊化处理,小编先给大家讲一下Android高级模糊技术的原理,如下:
·首先我创建了一个空的bitmap,把背景的一部分复制进去,之后我会对这个bitmap进行模糊处理并设置为TextView的背景。
·通过这个bitmap保存Canvas的状态;
·在父布局文件中把Canvas移动到TextView的位置;
·把ImageView的内容绘到bitmap中;
·此时,我们就有了一个和TextView一样大小的bitmap,它包含了ImageView的一部分内容,也就是TextView背后一层布局的内容;
·创建一个Renderscript的实例;
·把bitmap复制一份到Renderscript需要的数据片中;
·创建Renderscript模糊处理的实例;
·设置输入,半径范围然后进行模糊处理;
·把处理后的结果复制回之前的bitmap中;
·好了,我们已经把bitmap惊醒模糊处理了,可以将它设置为TextView背景了;
我最近在做一款App,其中有一个功能需要对图片处理实现毛玻璃的特效,经过一番研究,找到了3中实现方案,其中各有优缺点,如果系统的api在16以上,可以使用系统提供的方法直接处理图片,但是小编认为下边的解决方案是实现效果最好的。
代码如下:
public Bitmap fastblur(Context context, Bitmap sentBitmap, int radius) {
Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
if (radius & 1) {
return (null);
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int wm = w - 1;
int hm = h - 1;
int wh = w *
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,
int vmin[] = new int[Math.max(w, h)];
int divsum = (div + 1) && 1;
int temp = 256 *
int dv[] = new int[temp];
for (i = 0; i & i++) {
dv[i] = (i / divsum);
yw = yi = 0;
int[][] stack = new int[div][3];
int r1 = radius + 1;
int routsum, goutsum,
int rinsum, ginsum,
for (y = 0; y & y++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
for (i = - i &= 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] *
gsum += sir[1] *
bsum += sir[2] *
if (i & 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
stackpointer =
for (x = 0; x & x++) {
r[yi] = dv[rsum];
g[yi] = dv[gsum];
b[yi] = dv[bsum];
stackstart = stackpointer - radius +
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];
stackpointer = (stackpointer + 1) %
sir = stack[(stackpointer) % div];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
for (x = 0; x & x++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
yp = -radius *
for (i = - i &= i++) {
yi = Math.max(0, yp) +
sir = stack[i + radius];
sir[0] = r[yi];
sir[1] = g[yi];
sir[2] = b[yi];
rbs = r1 - Math.abs(i);
rsum += r[yi] *
gsum += g[yi] *
bsum += b[yi] *
if (i & 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
if (i & hm) {
stackpointer =
for (y = 0; y & y++) {
pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] && 16)
| (dv[gsum] && 8) | dv[bsum];
stackstart = stackpointer - radius +
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (x == 0) {
vmin[y] = Math.min(y + r1, hm) *
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];
stackpointer = (stackpointer + 1) %
sir = stack[stackpointer];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
bitmap.setPixels(pix, 0, w, 0, 0, w, h);
return (bitmap);
代码实现的效果图如下:
如果想要源码,请大家多多支持,分享到朋友圈,发送分享到朋友圈后的截屏和邮箱到此公众号,小编会争取第一时间把源码发送给您。
微信号:smart_android&(←长按复制)
介绍:非著名程序员,字耿左直右,号涩郎,爱搞机,爱编程,是爬行在移动互联网中的一名码匠!
个人微信号:loonggg
微博:涩郎
QQ群: 更能资料和源码尽在QQ群文件
今日头条:搜索“非著名程序员”订阅更多信息
工作:专注于移动互联网的开发和研究,本号致力于分享IT技术和程序猿工作心得体会。欢迎大家关注与转载。
众多开发视频教程尽在本公众号,关注此公众号,在菜单中点击干货资料,选择视频教程即可获取下载网址。&nbsp&#8250&nbsp&nbsp&#8250&nbsp
安卓的模糊视图-500px的关于背景模糊的技术分享
原文链接 : 译文链接 &模糊效果可以生动地表现出内容的层次感,当使用者关注重点内容,即便在模糊表面之下发生视差效果或者动态改变,也能够保持当前背景。在IOS设备中,我们首先构造一个UIVisualEffectView,之后添加 visualEffectView 到view层,在view中可以进行动态的模糊。UIVisualEffect&*blurEffect&=&[UIBlurEffect&effectWithStyle:UIBlurEffectStyleLight];
UIVisualEffectView&*visualEffectView&=&[[UIVisualEffectView&alloc]&initWithEffect:blurEffect];安卓中的表现形式我们在雅虎天气APP中确实看到了很好的模糊效果实例,但是根据 ,然而,这个 App 是通过缓存一张预渲染的背景图片来实现图片虚化的。虽然这种方法非常有效,但是确实不符合我们的需求,在
的APP中,图像通常是获得焦点的内容,而不仅仅是提供背景,这说明图像的变化很大且迅速,即便他们是在模糊层之下。在我们的 中即是一个恰当的例子:当用户滑动至下一页时,整排图片会以相反方向淡出,为了组成所需的模糊效果,适当地管理多个预渲染图是困难的。一种绘制模糊视图的方法我们需要的效果是,实时地模糊其下的视图,最终需要给界面的是模糊视图的一个 blurred view 引用。blurringView.setBlurredView(blurredView);之后当blurred view 改变时,不管是因为内容改变(比如呈现新的图片)、view的变换还是处在动画过程,我们都要刷新 blurring view。blurringView.invalidate();为了实现 blurring view, 我们需要继承 view类并重写 onDraw()方法来渲染模糊效果。protected&void&onDraw(Canvas&canvas)&{
&&&&super.onDraw(canvas);
&&&&//&Use&the&blurred&view’s&draw()&method&to&draw&on&a&private&canvas.
&&&&mBlurredView.draw(mBlurringCanvas);
&&&&//&Blur&the&bitmap&backing&the&private&canvas&into&mBlurredBitmap
&&&&blur();
&&&&//&Draw&mBlurredBitmap&with&transformations&on&the&blurring&view’s&main&canvas.
&&&&canvas.save();
&&&&canvas.translate(mBlurredView.getX()&-&getX(),&mBlurredView.getY()&-&getY());
&&&&canvas.scale(DOWNSAMPLE_FACTOR,&DOWNSAMPLE_FACTOR);
&&&&canvas.drawBitmap(mBlurredBitmap,&0,&0,&null);
&&&&canvas.restore();}这里的关键点在于,当模糊视图重绘时,它使用blurred view 的draw()方法,模糊视图保持blurred view的引用,它绘制一个私有的,以bitmap作为背景的画布。mBlurredView.draw(mBlurringCanvas);这种使用另一个视图的 draw()方法,也适用于建立放大或者个性的UI界面,在其中,放大区域的内容是扩大的,而不是模糊的。根据
的想法,我们使用子采样和
进行快速绘制,当初始化blurring view的私有画布mBlurringCanvas 后,子采样就已经完成了。int&scaledWidth&=&mBlurredView.getWidth()&/&DOWNSAMPLE_FACTOR;int&scaledHeight&=&mBlurredView.getHeight()&/&DOWNSAMPLE_FACTOR;mBitmapToBlur&=&Bitmap.createBitmap(scaledWidth,&scaledHeight,&Bitmap.Config.ARGB_8888);mBlurringCanvas&=&new&Canvas(mBitmapToBlur);通过mBlurringCanvas的 建立与恰当的渲染脚本初始化,重绘时的blur()方法如下:mBlurInput.copyFrom(mBitmapToBlur);mBlurScript.setInput(mBlurInput);mBlurScript.forEach(mBlurOutput);mBlurOutput.copyTo(mBlurredBitmap);此时 mBlurredBitmap 已准备好,剩下的就是使用适当的变换和缩放,在blurring view自己的画布上重绘视图。实现细节完整实现blurring view 时,我们需要注意几个技术点:一:我们发现缩放因子8,模糊半径15 很好地满足我们的目标,但满足你需求的参数可能是不同的。二:在模糊的bitmap边缘会遇到一些渲染脚本效果,我们将缩放的宽度和高度进行了圆角化,直到最近的4的倍数。//&The&rounding-off&here&is&for&suppressing&RenderScript&artifacts&at&the&edge.scaledWidth&=&scaledWidth&-&(scaledWidth&%&4)&+&4;scaledHeight&=&scaledHeight&-&(scaledHeight&%&4)&+&4;三:为了保证更好的表现效果,我们新建两个bitmap对象――mBitmapToBlur 和 mBlurredBitmap ,
mBitmapToBlur 位于私有画布mBlurringCanvas 之下, mBlurredBitmap 仅当blurred view的大小变化时才重新建立他们;
同样地当blurred view的大小改变时,我们才创建渲染脚本对象mBlurInput 和 mBlurOutput。四:我们以with PorterDuff.Mode.OVERLAY 模式绘制一个白色半透明的层,它处在被模糊的的图片上层。用来处理设计需求中的淡化。最后,因为RenderScript(渲染脚本)至少在API 17 上才可用,我们需要降低旧版本的安卓,糟糕的是, 中提到的Java bitmap的模糊方法,当恰当地预渲染缓存副本时,对于实时渲染不够迅速,我们所做的是使用一个半透明的view作为回调。(更新于日:通过使用 ,我的解决方法能在更低版本的 API 中运行。下面提及的库和 Demo 都更新了,非常感谢 GitHub 上的小伙伴
告诉我这一点)优点和缺点我们喜欢这个view的绘制方法,因为它可以实时模糊并且容易使用,使得blurred view 的内容,也在blurring view 和blurred view中间保证了灵活性,最重要的是,它满足了我们的需求这个方法确实使得blurring view 与适当协同变换的 blurred view
保持了私有联系,相关地,模糊视图必须不能是blurred
view的子类,否则会因为互相调用造成堆栈溢出。简单有效处理此限制的方法是要保证模糊视图与blurred view 在同级,并且Z轴次序上
blurred view 在blurring view 之前。另一点需要注意的限制是,由于与 矢量图形和文本 有关,我们默认的bitmap削减采样表现效果不是很好。库文件和示例你可以在我们的安卓
上看到解决方法,我们也把开源的库文件连同一个示例分享到了 ,它能够展示内容变换、动画和视图变换。有关这个效果在
中的讨论相关的项目&
上一篇: 本文转载自 技术博客greenrobot ,不过,话说json简单,比较短的话,还是直接用java原生的支持最好,没必要用Gson之类的工具。 引言 本文来自于 Foursquare的团队技术博客 。Foursquare团队最近发现自家的Androidapp在使用过程中并没有传说当中的“如黄油般
下一篇: Android 科学院专栏地址: /andlib 定期更新安卓的各种最新研究成果,与安卓周报之类不同的是,该作者侧重对新知识的分析与点评,更深刻实用,虽然每期的内容不多,但是都称得上精华。这得益于作者的功力,他们是来自豌豆荚的一撮匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 750ti需要多大电源 的文章

 

随机推荐