2012-01-05 92 views
2

我正在寫一個畫布的應用程序在Android上,我期待添加陰影,但我注意到,當我將它們添加到我的畫圖對象時,速度很慢。我的代碼很簡單,看起來像這樣:Android的畫布setShadowLayer大大降低性能

... 
Paint paint = new Paint(); 
paint.setShadowLayer(8.f, 0, 0, 0xff000000); // this line makes terribly slow drawing 
canvas.drawRect(left, top, right, bottom, paint); 

我該如何讓這個更快?

回答

1

雖然四處尋找一種方法,以加快我的大文本陰影,我無意中發現了這個問題,答案是:

setShadowLayer Android API differences

使用:

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

我大幅加快了我的應用程序中的所有文字陰影。

下面是我如何使用它的示例:

/** 
* Set a backlight (shadow) on the passed TextView. 
* @param textView 
*/ 
void setBacklight(TextView textView) { 
    if (textView != null) { 
     float textSize = textView.getTextSize(); 

     textView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

     textView.setShadowLayer(textSize,0,0,getColor(R.color.color_backlight)); 
    } 
} 

根據這個文檔:

https://developer.android.com/guide/topics/graphics/hardware-accel.html

它說,你可以禁用的觀點硬件加速。

我不知道爲什麼,但不知怎的,這奇蹟般地加速了我的TextView陰影層。

我知道,我知道。該方法對於Canvas或Paint類不存在。所以要回答具體問題(所以我不會被每個人抨擊......),你可以在你打算繪製畫布的視圖上設置它。像這樣:

void inTheShadows(View view) { 
    float left = 0f; 
    float top = 0f; 
    float right = 10f; 
    float bottom = 10f; 
    Canvas canvas = new Canvas(); 
    Paint paint = new Paint(); 

    paint.setShadowLayer(8.f, 0, 0, 0xff000000); 

    canvas.drawRect(left, top, right, bottom, paint); 

    view.setLayerType(View.LAYER_TYPE_SOFTWARE,null); 

    view.onDrawForeground(canvas); 
} 
1

使用圖像圖標,而不是繪製它:)

是影子是昂貴的。

+1

如何繪製位圖並將其緩存?有時需要在運行時生成路徑/形狀... – Ixx 2017-07-09 13:21:48

2

您可以使用此代碼,而不是實現幾乎相同的結果:

mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.OUTER));

+0

井罩過濾器的運行速度與setShadowLayer幾乎相同,因此沒有實際差異 – DEADMC 2017-07-21 15:20:58