2010-03-17 86 views
8

我有一個位圖對象,並希望將其渲染爲具有不同透明度級別的畫布對象(即使整個位圖部分透視)。例如,我在一個遊戲中繪製精靈(繪製在位圖背景的頂部),我想從不透明變爲不可見。我可以做到這一點,而不必訴諸於OpenGL?使用畫布繪製半透明位圖(Android)

回答

-1

回顧的Android DOC(看起來基於JSE用完全替代GUI),以下將得到你一個alpha通道支承圖像:

Bitmap bmp=createBitmap(100,100,Bitmap.Config.ARGB_8888); 

只要位圖是α-支持,你應該能夠將它繪製到另一個位圖上並使其具有alpha值。爲了淡出它,你需要用一些合適的延遲(但是從一個定時器驅動的事件,而不是在一個循環中,除非Android的渲染系統與其他Java非常不同)重複繪製圖像,操縱alpha通道每個連續油漆上的每個像素。

// Make image more transparent by 50% 
int[] pxls=new int[100*100]; 
bmp.getPixels(pxls,0,100,0,0,100,100); 
for(int xa=0,len=pxl.length; xa<len; xa++) { 
    int alp=(pxls[xa] & 0xFF000000); 
    alp<<1; 
    pxls[xa]=(alp | (pxls[xa] & 0x00FFFFFF); 
    } 
bmp.setPixels(pxls,0,100,0,0,100,100); 

注意事項1:我從JavaDoc原位寫了這段代碼;它沒有被編譯或測試。注意事項2:如果硬件設備的顏色分辨率不支持Alpha通道(通常稱爲32位顏色),則將任何圖像繪製到底層圖形系統可能乾脆忽略alpha通道)。但是在之前在後臺緩衝映像上進行的任何合成應該受到尊重。關鍵是你可能使用雙緩衝繪畫進行alpha混合,同時不受底層設備功能/配置的影響。

+0

感謝您的代碼。我知道這種方法,但循環了一些像這樣的小小精靈,每一幀都會破壞我的幀率。我之前編寫過這樣的代碼,它嚴重的慢了循環和操作單個像素。必須有一種更簡單的方法,因爲幾個GUI元素具有快速衰落效果。 – wordyword 2010-03-26 18:56:55

12

您應該能夠定義補間動畫並將該動畫應用於imageView。 XML資源將類似於以下(名爲fade_animation.xml):

<?xml version="1.0" encoding="utf-8"?> 
<alpha xmlns:android="http://schemas.android.com/apk/res/android" 
    android:interpolator="@android:anim/linear_interpolator" 
    android:fromAlpha="1.0" 
    android:toAlpha="0.0" 
    android:duration="100" /> 

那麼你會加載和這部動畫應用到您的自定義的ImageView時準備:

ImageView sprite = (ImageView) findViewById(R.id.sprite); 
Animation animation = AnimationUtils.loadAnimation(this, R.anim.fade_animation); 
sprite.startAnimation(animation); 

還有其他的選擇太。如果你正在使用位圖和你不想做一個動畫,這時你可以手動減少每一幀的Alpha值,有點像這樣:

paint.setAlpha(100); 
canvas.drawBitmap(spriteImage, left, top, paint); 

你有沒有嘗試任何這些選項?