2011-02-03 120 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