使用Canvas(Android)绘制半透明位图

时间:2010-03-17 23:10:15

标签: java android

我有一个Bitmap对象,想要将它呈现给具有不同半透明度的Canvas对象(即使整个位图部分透视)。例如,我在游戏中有精灵(在位图背景的顶部绘制),我希望从不透明变为不可见。我可以这样做而不必诉诸OpenGL吗?

2 个答案:

答案 0 :(得分: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);

您尝试过这些选项吗?

答案 1 :(得分:-1)

回顾Android文档(基于具有完全替代GUI的JSE),以下内容将为您提供支持alpha通道的图像:

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

只要 source 位图支持alpha,你就应该能够将它绘制到另一个位图上并让它的alpha值得到尊重。

要淡出它,你需要以一些合适的延迟重复绘制图像(但是从定时器驱动的事件,而不是在循环中,除非Android的渲染系统与其他Javas非常不同)为每个操作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混合,同时不受基础设备功能/配置的影响。