2011-02-03 92 views
3

是否有可能以编程方式,或通过xml配置(而不是通过9patch PNG),以达到效果上的Springpad小部件看到:渐变和阴影的按钮

enter image description here

如果你仔细观察,上(较亮)和较低(较暗)渐变之间存在明显的边界/线条。此外,右侧的压花区域有内部和外部阴影。

我知道如何在按钮上设置渐变背景,但该渐变是恒定的,没有中间那条尖锐的线条。另外,我找不到任何有关阴影创建和操作的参考。

谢谢。

+0

我不确定这是他们在链接的屏幕截图中使用的技术,但您可以通过编程方式创建复杂的线性渐变:http://developer.android.com/reference/android/graphics/LinearGradient.html#LinearGradient(浮,%20float,%20float,%20float,%20int [],%20float [],%20android.graphics.Shader。TileMode) – bigstones 2011-02-03 21:38:04

回答

2

我认为最好的办法是用接近

android.graphics 

包的问题。创建您自己的位图,使用Paint在画布上绘制,其中一种类型的着色器线性渐变到图像的上半部分,另一个到下半部分。对于更复杂的效果,您可以使用模糊或浮雕蒙版,组合不同的渐变类型(例如线性和径向),通过两个位图的XFer模式组合产生不错的效果,或应用不同的滤色器。用下面的代码

enter image description here

我制成简单的例子。添加模糊涂抹边缘。

Bitmap bmResult = Bitmap.createBitmap(buttonWidth, buttonHeight, Bitmap.Config.ARGB_8888); 
    Canvas canvas = new Canvas(bmResult); 
    Paint paint = new Paint(); 
    paint.setShader(new LinearGradient (0, 0, 0, bmResult.getHeight()/2, 0xFF284560, 0xFF284060, TileMode.MIRROR)); 
    canvas.drawPaint(paint); 
    paint.setShader(new LinearGradient (0, 0, 0, bmResult.getHeight()/2, 0x55FFFFFF, 0x22FFFFFF, TileMode.CLAMP)); 
    paint.setMaskFilter(new BlurMaskFilter(3, BlurMaskFilter.Blur.NORMAL)); 
    canvas.drawRect(0, 0, bmResult.getWidth(), bmResult.getHeight()/2, paint); 
1

我会说,我的看法是再生像你链接的iPhone屏幕截图的最有效的方法是开始像他们那样,而不是在做代码的所有图纸创建映像(不也不得不是9贴片,因为如果你制作整片的话,我不会看到它需要拉伸的地方)。

我不太确定要做所有的阴影,这可能需要使用一系列BlurMaskFilters来操纵一些Paint对象。但是,使用层列表可以在XML中完成尖锐的渐变。基本概念是将基础背景可绘制,并将可部分透明的覆盖层叠在一起形成层叠在一起的顶部。如果您可以定义整个图像的确切高度,则可以将覆盖图设置为该高度的50%。如果整个事情要伸展,可以创建覆盖图作为具有“顶部”重力和5000级别(0-10000级别的50%)的剪贴画。无论大小如何,这总是会在上半部分绘制覆盖图。

如果您需要应用第二个叠加层来创建另一个底部渐变,则可以对列表中的第三个层执行相同操作。但通常情况下,只有一个覆盖层创建锐利边缘的渐变就足够了。

这里有一个参考链接到不同的项目,我所描述的,你可能已经看到: http://developer.android.com/guide/topics/resources/drawable-resource.html

希望帮助!

+0

感谢您的回答,在阅读这些回复之后,我也相信最好的方法是创建一个图像,正如您所解释的。 注:截图来自Android设备。 – mblenton 2011-02-04 09:53:18