2010-03-17 137 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); 

你有没有尝试任何这些选项?